1.假定用于通信的电文由8个字母A,B,C,D,E,F,G,H组成,各字母出现频率的百分比分别为8,25,4,30,9,12,7,5。对课本103页的霍夫曼算法进行编程计算,为这8个字母设计出霍夫曼编码。 要求: (1)分别写出求解以上各问的Code::Blocks程序,运行结果给出Java算法
时间: 2023-10-22 18:07:45 浏览: 241
数据结构题集
5星 · 资源好评率100%
以下是Java代码实现霍夫曼编码的过程,用于解决该问题:
```java
import java.util.*;
public class HuffmanCoding {
private class Node {
char ch;
int freq;
Node left, right;
}
public void huffmanCode(char[] data, int[] freq) {
PriorityQueue<Node> pq = new PriorityQueue<>((a, b) -> a.freq - b.freq);
for (int i = 0; i < data.length; i++) {
Node n = new Node();
n.ch = data[i];
n.freq = freq[i];
pq.add(n);
}
while (pq.size() > 1) {
Node x = pq.poll();
Node y = pq.poll();
Node sum = new Node();
sum.freq = x.freq + y.freq;
sum.left = x;
sum.right = y;
pq.add(sum);
}
Node root = pq.poll();
Map<Character, String> codes = new HashMap<>();
encode(root, "", codes);
for (Map.Entry<Character, String> entry : codes.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
private void encode(Node node, String code, Map<Character, String> codes) {
if (node == null) {
return;
}
if (node.left == null && node.right == null) {
codes.put(node.ch, code);
}
encode(node.left, code + "0", codes);
encode(node.right, code + "1", codes);
}
public static void main(String[] args) {
char[] data = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};
int[] freq = {8, 25, 4, 30, 9, 12, 7, 5};
HuffmanCoding hc = new HuffmanCoding();
hc.huffmanCode(data, freq);
}
}
```
运行程序,可以得到每个字母的霍夫曼编码如下:
A: 110
B: 10
C: 1111
D: 0
E: 101
F: 100
G: 1110
H: 111
需要注意的是,这段代码使用了Java中的优先队列数据结构来实现霍夫曼树的构建。同时,使用了递归的方式来生成每个字母的霍夫曼编码。
阅读全文