Python使用优先队列,树结构实现哈夫曼算法(哈夫曼树)

本文介绍了如何使用Python通过优先队列和树结构来实现哈夫曼算法。首先创建了节点类,接着利用优先队列处理节点,再通过广度优先遍历构建哈夫曼树。提供的代码简洁明了,适用于哈夫曼树的构造。欢迎读者提出优化建议。

对于哈夫曼树就不做介绍了,直接进入正题。
本篇使用简单的结点创建导入优先队列中进行处理然后将树根地址传入二叉树方法中,通过广度遍历实现查询。

class node:结点创建,left指向左子结点地址,right指向右子结点地址,limit为权值,root指向父结点。
class first_lis:优先队列
class huffTree:哈夫曼树

在这里以此图作为例子加以实现:
此次实现的哈夫曼树图

代码:
这里写图片描述
这里写图片描述
这里写图片描述

测试代码:
这里写图片描述

显示:
这里写图片描述

代码没有进行过多的优化,没有使用面向对象的方法,很简单。欢迎提出意见。

### Python实现优先队列Python中,可以通过`heapq`模块来高效地实现优先队列。该模块提供了堆队列算法实现,也称为优先队列算法。这里将展示如何利用`heapq`创建并操作优先队列。 #### 创建一个简单的小根堆作为优先队列 为了构建一个小根堆形式的优先队列,可以从一个空列表开始,并使用`heappush()`方法向其中添加元素: ```python import heapq # 初始化一个空列表用于存储堆中的元素 priority_queue = [] # 向堆中插入元素 (数值越小优先级越高) elements_to_insert = [(1, 'write code'), (3, 'eat lunch'), (2, 'play games')] for priority, task in elements_to_insert: heapq.heappush(priority_queue, (priority, task)) # 获取当前最高优先级的任务而不移除它 highest_priority_task = priority_queue[0][1] # 移除并返回具有最高优先级的任务 popped_task = heapq.heappop(priority_queue)[1] ``` 上述代码片段展示了怎样通过元组的形式插入带有权重(即优先级)的数据项到堆里[^3]。注意,在这个例子中,第一个位置上的整数代表了任务的重要性程度——数字越低表示其重要性越大。 对于更复杂的情况或者当需要处理的对象不具备自然顺序关系时,则可能需要用到自定义比较逻辑。此时可以在类内部重载小于运算符(`__lt__()`)以便于`heapq`能够正确排序这些对象实例。 另外还有一种更为简便的方法可以直接基于现有列表快速建立好整个堆结构而不需要逐个推入新成员: ```python existing_elements = [(5, 'do homework'), (7, 'go shopping'), (6, 'watch movie')] # 将已有列表转化为堆 heapq.heapify(existing_elements) print([item for item in existing_elements]) ``` 这段脚本说明了如果已经有了待排列的一系列项目的话,那么只需要一次调用就可以完成全部初始化工作[^4]。 #### 处理相同优先级情况下的稳定性和唯一键值设计 有时可能会遇到多个条目共享相同的优先级别的情形。为了避免这种情况下可能出现的问题,通常建议给每一个记录附加独一无二的时间戳或者其他标识符以确保即使两个项目的实际业务属性完全一致也能区分先后次序。 例如,可以这样改进之前版本的插入部分: ```python from datetime import datetime class Task(object): def __init__(self, name, priority=0): self.name = name self.priority = priority self.timestamp = datetime.now() def __repr__(self): return f'Task({self.name}, {self.priority})' # 定义比较规则使得heapq能正常运作 def __lt__(self, other): if isinstance(other, tuple): # 当与tuple对比时只考虑priority字段 return self.priority < other[0] elif hasattr(other, 'priority'): return self.priority < other.priority tasks = [ Task('task one', 5), Task('another task', 5), # 和前一项有同样的优先级 Task('last task', 7) ] pq = [] for t in tasks: heapq.heappush(pq, (t.priority, id(t), t)) # 使用id()保证每条目的唯一性 while pq: _, _, next_item = heapq.heappop(pq) print(next_item) ``` 此段程序引入了一个名为Task的新类别,并为其设置了时间戳以及实现了必要的比较接口。这样做不仅解决了重复优先级带来的不确定性问题,同时也让最终输出更加直观易读。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值