哈夫曼编码是一种基于字符出现频率的变长前缀编码方法,它通过构建最优二叉树(哈夫曼树)为每个符号分配唯一且无歧义的二进制码,**不丢失任何原始信息*

📅 2026/7/6 14:38:34
哈夫曼编码是一种基于字符出现频率的变长前缀编码方法,它通过构建最优二叉树(哈夫曼树)为每个符号分配唯一且无歧义的二进制码,**不丢失任何原始信息*
哈夫曼编码属于B. 无损压缩✅原因哈夫曼编码是一种基于字符出现频率的变长前缀编码方法它通过构建最优二叉树哈夫曼树为每个符号分配唯一且无歧义的二进制码不丢失任何原始信息解码后可完全恢复原始数据因此属于典型的无损数据压缩技术。# 示例简单哈夫曼编码示意核心思想fromcollectionsimportCounterimportheapqdefhuffman_encode(text):freqCounter(text)heap[[f,[ch,]]forch,finfreq.items()]heapq.heapify(heap)whilelen(heap)1:loheapq.heappop(heap)hiheapq.heappop(heap)forpairinlo[1:]:pair[1]0pair[1]forpairinhi[1:]:pair[1]1pair[1]heapq.heappush(heap,[lo[0]hi[0]]lo[1:]hi[1:])returndict(heapq.heappop(heap)[1:])# 使用示例# encode_dict huffman_encode(aabbc)# print(encode_dict) # 如 {a: 00, b: 01, c: 1}哈夫曼编码能保证前缀性质即任意一个字符的编码都不是另一个字符编码的前缀根本原因在于其构造过程严格基于二叉树的叶子节点唯一性✅ 所有字符仅被放置在哈夫曼树的叶子节点上而内部节点不对应任何字符✅ 编码由根到叶子的路径决定左分支记为0右分支记为1不同叶子路径互不重叠且无包含关系✅ 因此任意两个叶子的路径编码互不为前缀——若某编码是另一编码的前缀则意味着对应路径存在“祖先-后代”关系即一个字符会落在另一个字符路径的中间节点内部节点这与“字符只存于叶子”的构造规则矛盾。故前缀性质天然成立。其贪心策略体现在每一步都选择当前频率最小的两个子树或节点合并生成新节点的频率为二者之和 该局部最优选择使高频字符靠近根、低频字符远离根最终导致带权路径长度WPL全局最小从而获得最优前缀码。这是典型的贪心算法特征无回溯、依赖当前最优决策且具有贪心选择性质和最优子结构。# 关键贪心步骤示意伪代码核心whilelen(heap)1:node1heapq.heappop(heap)# 频率最小的子树node2heapq.heappop(heap)# 频率次小的子树mergedmerge(node1,node2)# 贪心合并 → 新子树频率 freq1 freq2heapq.heappush(heap,merged)# 放回堆中继续迭代