算法与Python

算法与Python 知识量:10 - 40 - 100

7.3 哈夫曼编码><

什么是哈夫曼编码- 7.3.1 -

哈夫曼编码(Huffman Coding)是一种可变长度的编码方式,由David A. Huffman在1952年提出。这种编码方式根据字符出现的概率来构造异字头的平均长度最短的码字,有时也被称为最佳编码。

哈夫曼编码的核心思想是,对于出现概率高的字符,使用较短的编码,而对于出现概率低的字符,使用较长的编码。这样可以在数据压缩方面取得较好的效果。

问题- 7.3.2 -

以下是使用Python实现哈夫曼编码的示例代码:

import heapq  
from collections import defaultdict  
  
def calculate_frequency(data):  
    frequency = defaultdict(int)  
    for char in data:  
        frequency[char] += 1  
    return frequency  
  
def build_huffman_tree(frequency):  
    heap = [[weight, [char, ""]] for char, weight in frequency.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 sorted(heapq.heappop(heap)[1:], key=lambda p: (len(p[-1]), p))  
  
def huffman_encoding(data):  
    frequency = calculate_frequency(data)  
    huffman_tree = build_huffman_tree(frequency)  
    huff_dict = dict()  
    for pair in huffman_tree:  
        huff_dict[pair[0]] = pair[1]  
    encoded_data = ""  
    for char in data:  
        encoded_data += huff_dict[char]  
    return huff_dict, encoded_data

在这个示例中,首先使用calculate_frequency函数计算字符的频率。然后使用build_huffman_tree函数构建哈夫曼树。最后,使用huffman_encoding函数对数据进行哈夫曼编码。其中,哈夫曼树的构建使用了优先队列(heapq模块),使得每次都能从树中取出频率最小的两个节点进行合并。最后返回哈夫曼编码字典和编码后的字符串。