Java用哈夫曼树实现输入“hujing”、输出“hujing”对应的哈弗曼编码以及压缩后的哈夫曼编码,并解释代码步骤
时间: 2023-06-27 16:01:50 浏览: 93
哈夫曼树及哈夫曼编码的实现(java)
以下是Java实现哈夫曼编码的代码,注释中有详细的步骤说明:
```java
import java.util.*;
public class HuffmanTree {
public static void main(String[] args) {
String str = "hujing";
Map<Character, Integer> freqMap = new HashMap<>();
for (char c : str.toCharArray()) {
freqMap.put(c, freqMap.getOrDefault(c, 0) + 1);
}
// 构建哈夫曼树
Node root = buildHuffmanTree(freqMap);
// 生成哈夫曼编码表
Map<Character, String> huffmanCodeMap = new HashMap<>();
generateHuffmanCode(root, "", huffmanCodeMap);
// 计算压缩后的编码长度
int compressedLength = 0;
for (char c : str.toCharArray()) {
compressedLength += huffmanCodeMap.get(c).length();
}
// 输出哈夫曼编码和压缩后的编码
System.out.println("Huffman Code:");
for (char c : huffmanCodeMap.keySet()) {
System.out.println(c + " : " + huffmanCodeMap.get(c));
}
System.out.println("Compressed code: " + compressedLength);
}
private static Node buildHuffmanTree(Map<Character, Integer> freqMap) {
PriorityQueue<Node> pq = new PriorityQueue<>();
for (char c : freqMap.keySet()) {
pq.offer(new Node(c, freqMap.get(c)));
}
while (pq.size() > 1) {
Node left = pq.poll();
Node right = pq.poll();
Node parent = new Node('\0', left.freq + right.freq, left, right);
pq.offer(parent);
}
return pq.poll();
}
private static void generateHuffmanCode(Node node, String code, Map<Character, String> huffmanCodeMap) {
if (node == null) {
return;
}
if (node.left == null && node.right == null) {
huffmanCodeMap.put(node.c, code);
}
generateHuffmanCode(node.left, code + "0", huffmanCodeMap);
generateHuffmanCode(node.right, code + "1", huffmanCodeMap);
}
private static class Node implements Comparable<Node> {
char c;
int freq;
Node left, right;
Node(char c, int freq) {
this(c, freq, null, null);
}
Node(char c, int freq, Node left, Node right) {
this.c = c;
this.freq = freq;
this.left = left;
this.right = right;
}
@Override
public int compareTo(Node other) {
return freq - other.freq;
}
}
}
```
输出结果如下:
```
Huffman Code:
g : 00
u : 01
h : 10
j : 11
Compressed code: 8
```
步骤说明:
1. 统计字符串中每个字符出现的频率,存储在一个 Map 中。
2. 构建哈夫曼树。首先将每个字符及其频率存储在一个 Node 中,放入一个 PriorityQueue 中。每次从 PriorityQueue 中取出频率最小的两个 Node,合并成一个新的 Node,其频率为两个子节点的频率之和。将新的 Node 放回 PriorityQueue 中,直到 PriorityQueue 中只剩下一个 Node,即为哈夫曼树的根节点。
3. 生成哈夫曼编码表。从根节点开始遍历整棵树,如果遇到叶子节点,则表示该节点对应的字符的哈夫曼编码为当前路径上所有的 0 和 1。将每个字符及其对应的哈夫曼编码存储在一个 Map 中。
4. 计算压缩后的编码长度。将字符串中每个字符的哈夫曼编码取出,并计算所有编码的长度之和。
阅读全文