import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
public class HuffmanCoding {
static class Node {
char character;
int frequency;
Node left, right;
Node(char character, int frequency) {
this.character = character;
this.frequency = frequency;
}
}
public static void main(String[] args) {
Map<Character, Integer> frequencyMap = new HashMap<>();
frequencyMap.put('a', 5);
frequencyMap.put('b', 9);
frequencyMap.put('c', 12);
frequencyMap.put('d', 13);
frequencyMap.put('e', 16);
Node root = buildHuffmanTree(frequencyMap);
Map<Character, String> huffmanCodes = generateHuffmanCodes(root);
System.out.println("字符\t频率\t编码");
for (Map.Entry<Character, String> entry : huffmanCodes.entrySet()) {
System.out.println(entry.getKey() + "\t" + frequencyMap.get(entry.getKey()) + "\t" + entry.getValue());
}
}
private static Node buildHuffmanTree(Map<Character, Integer> frequencyMap) {
PriorityQueue<Node> queue = new PriorityQueue<>(Comparator.comparingInt(n -> n.frequency));
for (Map.Entry<Character, Integer> entry : frequencyMap.entrySet()) {
queue.offer(new Node(entry.getKey(), entry.getValue()));
}
while (queue.size() > 1) {
Node left = queue.poll();
Node right = queue.poll();
Node parent = new Node('\0', left.frequency + right.frequency);
parent.left = left;
parent.right = right;
queue.offer(parent);
}
return queue.poll();
}
private static Map<Character, String> generateHuffmanCodes(Node root) {
Map<Character, String> huffmanCodes = new HashMap<>();
generateCodes(root, "", huffmanCodes);
return huffmanCodes;
}
private static void generateCodes(Node node, String code, Map<Character, String> huffmanCodes) {
if (node == null) {
return;
}
if (node.character != '\0') {
huffmanCodes.put(node.character, code);
}
generateCodes(node.left, code + "0", huffmanCodes);
generateCodes(node.right, code + "1", huffmanCodes);
}
}