哈夫曼树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'}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910001.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dockerfile的学习与实践

Dockerfile通过一系列的命令和参数&#xff0c;构建自定义镜像。一般步骤如下&#xff1a; 一. 常用命令说明 基础命令具体命令描述例子FROMFROM[基础镜像:版本号]基于指定的基础镜像构建自定义镜像FROM eclipse-temurin:17-jdk-alpineRUNRUN构建容器需要运行的命令&#xff0…

【三大前端语言之一】静态网页语言:HTML详解

你知道你在浏览器中所看到的每一个按钮&#xff0c;每一个框&#xff0c;都是怎么创造出来的吗&#xff1f;它们并非魔法&#xff0c;而是由一种被称为HTML的语言精心构建的骨架。作为前端世界的三大基石之一&#xff08;HTML、CSS、JavaScript&#xff09;&#xff0c;HTML是万…

04、谁发明了深度学习的方法,是怎么发明的?

深度学习的发展是多位研究者长期探索的结果,其核心方法的形成并非由单一人物 “发明”,而是历经数十年理论积累与技术突破的产物。以下从关键人物、核心技术突破及历史背景三个维度,梳理深度学习方法的起源与发展脉络: 一、深度学习的奠基者与关键贡献者 1. Geoffrey Hin…

Jmeter ServerAgent在arm环境启动报错no libsigar-aarch64-linux.so in java.library.path

使用Jmeter压测的时候&#xff0c;用ServerAgent监测arm服务器的性能指标&#xff0c;在启动ServerAgent时&#xff0c;报错了&#xff1a;no libsigar-aarch64-linux.so in java.library.path 解决方案&#xff1a; 下载libsigar-aarch64-linux.so文件&#xff0c;放置在Serv…

AJAX拦截器失效排查指南:当你的beforeSend有效但error/complete沉默时

问题现象 开发者常遇到这样的场景&#xff1a; $.ajaxSetup({beforeSend: () > console.log("✅ 触发"), // 正常执行error: () > console.log("❌ 未触发"), // 静默失效complete: () > console.log("⚡ 未触发") // 同样沉默 })…

【模型微调】负样本选择

1.核心设计理念 非对称检索任务&#xff08;例如&#xff0c;用一个简短的问题去文档库里查找答案&#xff09;的一个核心挑战是查询&#xff08;query&#xff09;和文档&#xff08;passage&#xff09;在文本特征上的巨大差异。以往的研究发现&#xff0c;为查询和文档提供…

下载安装redis

有任何问题&#xff0c;都可以私信博主&#xff0c;共同探讨学习。 正文开始 一、下载安装redis一、启动redis总结 一、下载安装redis redis官方下载地址是github&#xff0c;有条件的同学可以自行搜索下载。针对部分网速不太好的同学&#xff0c;可以通过网盘获取&#xff0c…

flutter 项目配置Gradle下载代理

如图&#xff0c; 在Android Studio中配置代理是不生效的。 需要在flutter sdk的Gradle中去配置代理

世冠科技亮相TMC,以国产MBD工具链赋能汽车电控系统开发新未来

2025年6月12日至13日&#xff0c;第十七届国际汽车动力系统技术年会&#xff08;TMC2025&#xff09;在南通国际会展中心盛大召开。作为全球汽车动力系统领域规模最大、规格最高、内容最前沿的标杆性国际盛会&#xff0c;汇聚了来自全球整车企业、核心零部件供应商、顶尖科研机…

将本地项目与远程 Git 仓库关联的完整步骤

将本地项目与远程 Git 仓库关联的完整步骤 现在的情景是&#xff1a;本地文件项目已经写好了&#xff0c;亦或者远程仓库已经建好了&#xff0c;需要与本地项目关联起来 以下是详细的操作流程&#xff0c;我会用清晰的步骤说明如何将你的本地项目与远程 Git 仓库关联&#xf…

3DS 转换为 STP 全攻略:迪威模型网在线转换详解

在三维模型创作与应用的多元场景中&#xff0c;不同格式的文件承担着独特的角色。3DS&#xff08;3D Studio&#xff09;格式是 Autodesk 3ds Max 早期广泛使用的文件格式&#xff0c;常用于游戏开发、影视特效制作等领域&#xff0c;能够存储模型的几何形状、材质、动画等信息…

Linux下iptables和firewalld详解

Linux下iptables和firewalld详解 Linux下iptables和firewalld简述Iptables四表五链策略与规则链命令参数Firewalld终端管理工具图形管理工具服务的访问控制列表Linux下iptables和firewalld 简述 ​ 保障数据的安全性是继保障数据的可用性之后最为重要的一项工作。防火墙作为公…

Kafka Connect高级开发:自定义扩展与复杂场景应对

引言 在掌握Kafka Connect基础操作与内置连接器应用后&#xff0c;面对企业复杂的业务需求&#xff0c;如对接非标准数据源、实现特定数据处理逻辑&#xff0c;就需要深入到高级开发领域。本篇博客将围绕自定义Connector开发、数据转换编程、错误处理与容错机制展开&#xff0…

吴恩达机器学习笔记:正则化2

1.正则化线性回归 对于线性回归的求解&#xff0c;我们之前推导了两种学习算法&#xff1a;一种基于梯度下降&#xff0c;一种基于正规方程。 正则化线性回归的代价函数为&#xff1a; J ( θ ) 1 2 m [ ∑ i 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 λ ∑ j 1 n θ j 2 …

Unity中的Resources加载

Unity的Resources加载是Unity引擎中一种在运行时动态加载资源&#xff08;assets&#xff09;的方式&#xff0c;允许开发者将资源放置在特定的Resources文件夹中&#xff0c;并通过代码按名称加载这些资源&#xff0c;而无需在场景中预先引用。这种方式在需要动态加载资源时非…

对Vue2响应式原理的理解-总结

根据这张图进行总结 在组件实例初始化阶段&#xff0c;通过 observe() 方法对 data 对象进行递归遍历。在这个过程中&#xff0c;Vue 使用 Object.defineProperty() 为data 中的每个属性定义 getter 和 setter 来拦截对象属性的“读取“操作和“写入”操作。 Vue 的依赖追踪是…

基于深度学习的智能音频增强系统:技术与实践

前言 在音频处理领域&#xff0c;音频增强技术一直是研究的热点。音频增强的目标是改善音频信号的质量&#xff0c;去除噪声、回声等干扰&#xff0c;提高音频的可听性和可用性。传统的音频增强方法主要依赖于信号处理技术&#xff0c;如滤波器设计、频谱减法等&#xff0c;但这…

从代码学习深度强化学习 - DQN PyTorch版

文章目录 前言DQN 算法核心思想Q-Learning 与函数近似经验回放 (Experience Replay)目标网络 (Target Network)PyTorch 代码实现详解1. 环境与辅助函数2. 经验回放池 (ReplayBuffer)3. Q网络 (Qnet)4. DQN 主类5. 训练循环6. 设置超参数与开始训练训练结果与分析总结前言 欢迎…

AI与大数据如何驱动工业品电商平台的智能决策?

在轰鸣的工厂里&#xff0c;一台关键设备因某个密封圈失效而骤然停机。生产线停滞、订单延误、经济损失每分钟都在扩大。此刻&#xff0c;采购经理在工业品电商平台上疯狂搜索&#xff0c;却迷失在海量零件参数与供应商信息中。工业品的沉默&#xff0c;往往意味着生产线的沉默…

连接器全解析:数据库连接器和文件连接器的区别和联系

目录 一、数据库连接器和文件连接器的基本概念 1. 数据库连接器 2. 文件连接器 二、数据库连接器和文件连接器的区别 1. 数据存储方式 2. 数据处理能力 3. 数据安全性 4. 数据更新频率 三、数据库连接器和文件连接器的联系 1. 数据交互 2. 数据处理流程 3. 应用场景…