哈夫曼树Python实现

哈夫曼树构建原则:

  1. .统计频率:对待编码字符(或数据块)的频率进行统计。
  2. .初始化森林:将每个字符视为一棵只有根节点的二叉树,权值为频率。
  3. .合并树 :重复以下操作,直到只剩一棵树:
    • 选取权值最小的两棵树合并,新树的根节点权值为两者之和。
    • 权值较小的树作为左子树,较大的为右子树(约定方向不影响结果)。
  4. 生成编码 :从根节点出发,向左子树路径标记0,向右标记1,到叶子节点的路径即为该字符的哈夫曼编码。

引用python模块说明:

heapq.heapifyheapq 模块(堆队列算法)的核心函数,用于将普通列表原地转换为最小堆数据结构

python 复制代码
import heapq

# 原始未排序列表
data = [3, 1, 4, 1, 5, 9, 2, 6]
print("转换前:", data)  # [3, 1, 4, 1, 5, 9, 2, 6]

# 原地转换为最小堆
heapq.heapify(data)

print("转换后:", data)  # 输出可能: [1, 1, 2, 3, 5, 9, 4, 6]
print("最小元素:", data[0])  # 1 (始终是堆顶)

图示化:

1 ← 堆顶 (最小元素)

/ \

1 2

/ \ / \

3 5 9 4

/

6

python 复制代码
import heapq

class Node:
    def __init__(self, char=None, freq=0, left=None, right=None):
        self.char = char    # 字符(仅叶子节点有)
        self.freq = freq    # 频率
        self.left = left    # 左子节点
        self.right = right  # 右子节点

    # 用于优先队列比较
    def __lt__(self, other):
        return self.freq < other.freq

def build_huffman_tree(freq_dict):
    heap = [Node(char=char, freq=freq) for char, freq in freq_dict.items()]
    heapq.heapify(heap)  # 转为最小堆
	

    while len(heap) > 1:
        left = heapq.heappop(heap)  # 弹出最小频率节点
        right = heapq.heappop(heap) # 弹出次小频率节点
        merged = Node(freq=left.freq + right.freq, left=left, right=right)
        heapq.heappush(heap, merged)  # 合并后的树放回堆中,继续转为最小堆

    return heap[0]  # 返回哈夫曼树的根节点

def generate_codes(root, current_code="", code_dict={}):
    if root is None:
        return
    if root.char is not None:  # 叶子节点,则加入字典
        code_dict[root.char] = current_code
    generate_codes(root.left, current_code + "0", code_dict)  #递归调用
    generate_codes(root.right, current_code + "1", code_dict) #递归调用
    return code_dict

# 示例:压缩字符串 "aabbbcd"
freq = {'a': 2, 'b': 3, 'c': 1, 'd': 1}
huffman_tree = build_huffman_tree(freq)
codes = generate_codes(huffman_tree)
print("哈夫曼编码:", codes)  # 输出如 {'b': '0', 'a': '10', 'c': '110', 'd': '111'}
相关推荐
果汁华10 分钟前
Browserbase Skills:让 Claude Agent 真正“看见“网页世界
人工智能·python
ZhengEnCi10 分钟前
04-缩放点积注意力代码实现 💻
人工智能·python
DeepReinforce43 分钟前
三、AI量化投资:使用akshare获取A股主板20260430所有的涨停股票
python·量化·akshare·龙头战法
段一凡-华北理工大学1 小时前
【高炉炼铁领域炉温监测、预警、调控智能体设计与应用】~系列文章08:多模态数据融合:让数据更聪明
人工智能·python·高炉炼铁·ai赋能·工业智能体·高炉炉温
万粉变现经纪人1 小时前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
清风明月一壶酒1 小时前
OpenClaw自动处理Word文档全流程
开发语言·c#·word
其实防守也摸鱼2 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
callJJ2 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
小郑加油3 小时前
python学习Day12:pandas安装与实际运用
开发语言·python·学习
AC赳赳老秦3 小时前
投标合规提效:用 OpenClaw 实现标书 / 合同自动审核、关键词校验、格式优化,降低废标风险
开发语言·前端·python·eclipse·emacs·deepseek·openclaw