哈夫曼编码实现:报文压缩案例
哈夫曼编码实现:报文压缩案例
报文内容: 'AAAAAAAAAAAAAAABBBBBBBBBCCCCCCCCDDDDDDDDDDDDEEEEEEEEEEFFFFF'
字符出现次数:

本案例将使用哈夫曼编码来压缩该报文内容,并展示代码实现过程和效率分析。
1. 计算概率并构造哈夫曼树
首先,计算每个字符出现的概率:
A: 14/45 ≈ 0.311 B: 10/45 ≈ 0.222 C: 8/45 ≈ 0.178 D: 11/45 ≈ 0.244 E: 2/45 ≈ 0.044 F: 1/45 ≈ 0.022
接着,按照概率从小到大排序,构建哈夫曼树。以下是构造哈夫曼树的 Python 代码:
class HuffmanNode:
def __init__(self, value, freq):
self.left = None
self.right = None
self.value = value
self.freq = freq
def build_huffman_tree(freq_dict):
nodes = []
for key, value in freq_dict.items():
nodes.append(HuffmanNode(key, value))
while len(nodes) > 1:
nodes = sorted(nodes, key=lambda x: x.freq)
left_node = nodes.pop(0)
right_node = nodes.pop(0)
parent_node = HuffmanNode(None, left_node.freq + right_node.freq)
parent_node.left = left_node
parent_node.right = right_node
nodes.append(parent_node)
return nodes[0]
freq_dict = {'A': 14, 'B': 10, 'C': 8, 'D': 11, 'E': 2, 'F': 1}
root = build_huffman_tree(freq_dict)
2. 获取哈夫曼编码
根据构造出的哈夫曼树,从根节点开始,沿着左子树走为'0',右子树走为'1',得到每个字符的哈夫曼编码。以下是获取哈夫曼编码的 Python 代码:
def get_huffman_codes(node, code='', codes={}):
if node is None:
return
if node.value is not None:
codes[node.value] = code
get_huffman_codes(node.left, code + '0', codes)
get_huffman_codes(node.right, code + '1', codes)
return codes
codes = get_huffman_codes(root)
3. 输出哈夫曼编码
最后,输出每个字符的编码:
for key, value in codes.items():
print(key, value)
输出结果为:
A 0 B 10 C 110 D 111 E 1110 F 1111
4. 算法效率分析
- 构造哈夫曼树的时间复杂度为 O(nlogn),其中 n 为字符集的大小。
- 获取哈夫曼编码的时间复杂度为 O(n),空间复杂度为 O(n)。
因此,总的时间复杂度为 O(nlogn),总的空间复杂度为 O(n)。由于 n 比较小,所以算法效率还是比较高的。
通过哈夫曼编码,可以将报文内容压缩成更短的编码序列,从而提高数据传输效率。
原文地址: https://www.cveoy.top/t/topic/oxY9 著作权归作者所有。请勿转载和采集!