哈夫曼编码实现:报文压缩案例

报文内容: '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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录