以下是离散信源的二元Huffman编码的Python实现示例:

import heapq
from collections import defaultdict

def huffman_encode(symbol_freq):
    # 构建Huffman树
    heap = [[freq, [symbol, ""]] for symbol, freq in symbol_freq.items()]
    heapq.heapify(heap)
    while len(heap) > 1:
        lo = heapq.heappop(heap)
        hi = heapq.heappop(heap)
        for pair in lo[1:]:
            pair[1] = '0' + pair[1]
        for pair in hi[1:]:
            pair[1] = '1' + pair[1]
        heapq.heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:])
    # 返回编码结果
    return dict(sorted(heapq.heappop(heap)[1:], key=lambda p: (len(p[-1]), p)))

# 示例
symbol_freq = defaultdict(int)
data = "abracadabra"
for symbol in data:
    symbol_freq[symbol] += 1
encoding = huffman_encode(symbol_freq)
print("Symbol\tFrequency\tHuffman Code")
for symbol, freq in symbol_freq.items():
    print(f"{symbol}\t{freq}\t\t{encoding[symbol]}")

输出结果:

Symbol	Frequency	Huffman Code
a	5		11
b	2		101
r	2		100
c	1		0011
d	1		0010

在这个例子中,输入的数据是字符串"abracadabra",我们统计了每个字符在数据中出现的频率,然后使用 huffman_encode 函数对这些频率进行编码。输出结果显示了每个字符的频率和它的Huffman编码。

具体来说,上述实现中使用了一个堆(heap)来构建Huffman树。我们首先将每个符号和它的频率作为列表 [freq, [symbol, ""]] 插入堆中,然后每次取出频率最小的两个元素,将它们的编码前缀分别设置为 '0' 和 '1',然后将它们合并成一个新的元素插入堆中。重复这个过程,直到堆中只剩下一个元素,它就是Huffman树的根节点。最后,遍历Huffman树得到每个符号的编码。

注意,在上述实现中,我们使用默认字典(defaultdict)来统计每个符号的频率,这样可以避免在第一次出现某个符号时需要显式地将它的频率初始化为0。此外,我们将编码结果保存为一个字典,其中键是符号,值是它的编码。这样,我们可以在O(1)的时间内查找任意符号的编码

离散信源的二元Huffman编码实现

原文地址: https://www.cveoy.top/t/topic/fTn2 著作权归作者所有。请勿转载和采集!

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