import java.util.*;
class Node {
char data;
int freq;
Node left, right;
public Node(char data, int freq) {
this.data = data;
this.freq = freq;
this.left = null;
this.right = null;
}
}
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String input = sc.next();
Map<Character, String> huffmanCodes = getHuffmanCodes(input);
for (Map.Entry<Character, String> entry : huffmanCodes.entrySet()) {
System.out.println("字符: " + entry.getKey() + ", 编码: " + entry.getValue());
}
}
public static Map<Character, String> getHuffmanCodes(String input) {
char[] C = input.toCharArray();
Set<Character> set = new HashSet<>();
for (char c : C) {
set.add(c);
}
int n = set.size();
PriorityQueue<Node> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(node -> node.freq));
for (char c : set) {
int freq = 0;
for (char ch : C) {
if (ch == c) {
freq++;
}
}
priorityQueue.offer(new Node(c, freq));
}
for (int i = 0; i < n - 1; i++) {
Node x = priorityQueue.poll();
Node y = priorityQueue.poll();
Node z = new Node('-', x.freq + y.freq);
z.left = x;
z.right = y;
priorityQueue.offer(z);
}
Map<Character, String> huffmanCodes = new HashMap<>();
generateHuffmanCodes(priorityQueue.peek(), "", huffmanCodes);
return huffmanCodes;
}
public static void generateHuffmanCodes(Node node, String code, Map<Character, String> huffmanCodes) {
if (node == null) {
return;
}
if (node.data != '-') {
huffmanCodes.put(node.data, code);
}
generateHuffmanCodes(node.left, code + "0", huffmanCodes);
generateHuffmanCodes(node.right, code + "1", huffmanCodes);
}
}
哈夫曼编码(笔记)
最新推荐文章于 2024-07-29 14:22:26 发布