当前位置: 首页 > news >正文

哈夫曼树Python实现

哈夫曼树构建原则:

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

 引用python模块说明:

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

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
/

import heapqclass 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.freqdef 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:returnif root.char is not None:  # 叶子节点,则加入字典code_dict[root.char] = current_codegenerate_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'}

相关文章:

  • 目标检测之YOLOV11谈谈OBB
  • maven项目无远程仓库开发配置(无外网、无maven私服)
  • “本地化思维+模块化体验”:一款轻量数据中心监控系统的真实测评
  • angular 图斑点击,列表选中并滚动到中间位置
  • 【目标检测】IOU的概念与Python实例解析
  • SQL分片工具类
  • Stable Diffusion 实战-手机壁纸制作 第二篇:优化那些“崩脸”和“马赛克”问题,让图像更加完美!
  • Softhub软件下载站实战开发(五):分类模块实现
  • C语言学习day17-----位运算
  • LeeCode94二叉树的中序遍历
  • SpringBoot定时监控数据库状态
  • thinkphp8 模型-一对一,一对多,多对多 学习
  • 软件工程(期末复习班)
  • .NET 的配置系统
  • CLion + STM32环境配置,亲测有效(2025.06.19记)
  • 磐基PaaS平台MongoDB组件SSPL许可证风险与合规性分析(上)
  • 业务战略分析需要开展什么工作?-中小企实战运营和营销工作室博客
  • Windows 操作系统 - Windows 关闭咨询和兴趣
  • FocalAD论文阅读
  • 【目标检测】非极大值抑制(NMS)的原理与实现
  • 企业网站建设在国内现状/广东seo快速排名
  • 有什么网站做任务换q币吗/百度广告优化师
  • 代加工接订单网站/优化关键词具体要怎么做
  • 怎么创建网站免费的/百度网站打开
  • 搬家公司网站模板/seo怎么发文章 seo发布工具
  • 夜夜做新郎网站/简述seo的基本步骤