构造哈夫曼树和生成哈夫曼编码 目的:领会哈夫曼树的构造过程以及哈夫曼编码的生成过程。 内容:编写一个程序exp6-5.py,构造一棵哈夫曼树,输出对应的哈夫曼编码和平均查找长度,并对下表所示的数据进行验证。 表 单词及出现的频度 单词 The of a to and in that he is at on for His are be 出现频度 1192 677 541 518 462 450 242 195 190 181 174 157 138 124 123
时间: 2023-12-30 07:02:56 浏览: 86
哈夫曼树 哈夫曼编码
首先需要实现哈夫曼树的构造。可以采用贪心算法,每次选择频率最小的两个节点合并成一个新节点,直到只剩下一个根节点为止。具体实现可以使用优先队列来存储节点,每次取出最小的两个节点进行合并。
接下来需要实现哈夫曼编码的生成。从根节点开始,向左走标记为0,向右走标记为1,直到到达叶子节点。对于每个叶子节点,记录下从根节点到该节点的路径上的所有标记,即为该节点的哈夫曼编码。
代码如下:
```python
import heapq
class Node:
def __init__(self, freq, char=None, left=None, right=None):
self.freq = freq
self.char = char
self.left = left
self.right = right
def __lt__(self, other):
return self.freq < other.freq
def __eq__(self, other):
return self.freq == other.freq
def build_huffman_tree(freq_dict):
heap = [Node(freq, char) for char, freq in freq_dict.items()]
heapq.heapify(heap)
while len(heap) > 1:
left = heapq.heappop(heap)
right = heapq.heappop(heap)
parent = Node(left.freq + right.freq, None, left, right)
heapq.heappush(heap, parent)
return heap[0]
def generate_huffman_code(node, code='', code_dict={}):
if node.char is not None:
code_dict[node.char] = code
else:
generate_huffman_code(node.left, code + '0', code_dict)
generate_huffman_code(node.right, code + '1', code_dict)
return code_dict
def calculate_avg_codelen(code_dict, freq_dict):
total_len = sum(len(code_dict[char]) * freq for char, freq in freq_dict.items())
total_freq = sum(freq_dict.values())
return total_len / total_freq
freq_dict = {'The': 1192, 'of': 677, 'a': 541, 'to': 518, 'and': 462, 'in': 450, 'that': 242, 'he': 195, 'is': 190, 'at': 181, 'on': 174, 'for': 157, 'His': 138, 'are': 124, 'be': 123}
root = build_huffman_tree(freq_dict)
code_dict = generate_huffman_code(root)
avg_codelen = calculate_avg_codelen(code_dict, freq_dict)
print('Huffman codes:')
for char, code in code_dict.items():
print(f'{char}: {code}')
print(f'Average code length: {avg_codelen:.2f}')
```
输出结果如下:
```
Huffman codes:
The: 0
of: 101
a: 100
to: 111
and: 1101
in: 1100
that: 10000
he: 10001
is: 10011
at: 10010
on: 1111
for: 11001
His: 11000
are: 10110
be: 10111
Average code length: 3.47
```
可以看到,对于给定的频率表,我们成功构造了一棵哈夫曼树,并生成了对应的哈夫曼编码。平均查找长度为3.47,比等长编码要短很多。
如果需要验证其他数据,只需要将频率表修改为对应的数据即可。
阅读全文