世界热点!python实现堆(最大堆、最小堆、最小最大堆)
最小-最大堆的性质是:树中偶数层的每个节点都小于它的所有后代,而树中奇数层的每个节点都大于它的所有后代。
(资料图)
class MaxHeap: def __init__(self): self.heap = [] def parent(self, i): return (i - 1) // 2 def left_child(self, i): return 2 * i + 1 def right_child(self, i): return 2 * i + 2 def get_max(self): if not self.heap: return None return self.heap[0] def insert(self, item): self.heap.append(item) self._heapify_up(len(self.heap) - 1) def extract_max(self): if not self.heap: return None max_item = self.heap[0] last_item = self.heap.pop() if self.heap: self.heap[0] = last_item self._heapify_down(0) return max_item def _heapify_up(self, i): while i > 0 and self.heap[i] > self.heap[self.parent(i)]: self.heap[i], self.heap[self.parent(i)] = self.heap[self.parent(i)], self.heap[i] i = self.parent(i) def _heapify_down(self, i): max_index = i left = self.left_child(i) if left < len(self.heap) and self.heap[left] > self.heap[max_index]: max_index = left right = self.right_child(i) if right < len(self.heap) and self.heap[right] > self.heap[max_index]: max_index = right if i != max_index: self.heap[i], self.heap[max_index] = self.heap[max_index], self.heap[i] self._heapify_down(max_index)if __name__ == "__main__": max_heap = MaxHeap() max_heap.insert(1) max_heap.insert(2) max_heap.insert(0) max_heap.insert(8) print(max_heap.get_max())
class MinHeap: def __init__(self): self.heap = [] def parent(self, i): return (i - 1) // 2 def left_child(self, i): return 2 * i + 1 def right_child(self, i): return 2 * i + 2 def get_min(self): if not self.heap: return None return self.heap[0] def insert(self, item): self.heap.append(item) self._heapify_up(len(self.heap) - 1) def extract_min(self): if not self.heap: return None min_item = self.heap[0] last_item = self.heap.pop() if self.heap: self.heap[0] = last_item self._heapify_down(0) return min_item def _heapify_up(self, i): while i > 0 and self.heap[i] < self.heap[self.parent(i)]: self.heap[i], self.heap[self.parent(i)] = self.heap[self.parent(i)], self.heap[i] i = self.parent(i) def _heapify_down(self, i): min_index = i left = self.left_child(i) if left < len(self.heap) and self.heap[left] < self.heap[min_index]: min_index = left right = self.right_child(i) if right < len(self.heap) and self.heap[right] < self.heap[min_index]: min_index = right if i != min_index: self.heap[i], self.heap[min_index] = self.heap[min_index], self.heap[i] self._heapify_down(min_index)
最小-最大堆的性质是:树中偶数层的每个节点都小于它的所有后代,而树中奇数层的每个节点都大于它的所有后代。
用途 双端优先级队列
class MinMaxHeap: def __init__(self): self.heap = [] def parent(self, i): return (i - 1) // 2 def left_child(self, i): return 2 * i + 1 def right_child(self, i): return 2 * i + 2 def get_min(self): if not self.heap: return None return self.heap[0] def get_max(self): if not self.heap: return None if len(self.heap) == 1: return self.heap[0] if len(self.heap) == 2: return self.heap[1] if self.heap[1] > self.heap[0] else self.heap[0] return self.heap[1] if self.heap[1] > self.heap[2] else self.heap[2] def insert(self, item): self.heap.append(item) self._heapify_up(len(self.heap) - 1) def extract_min(self): if not self.heap: return None min_item = self.heap[0] last_item = self.heap.pop() if self.heap: self.heap[0] = last_item self._heapify_down_min(0) return min_item def extract_max(self): if not self.heap: return None max_item = self.get_max() max_index = self.heap.index(max_item) self.heap[max_index] = self.heap[-1] self.heap.pop() if max_index < len(self.heap): self._heapify_down_max(max_index) return max_item def _heapify_up(self, i): if i == 0: return parent = self.parent(i) if self.heap[i] < self.heap[parent]: self.heap[i], self.heap[parent] = self.heap[parent], self.heap[i] self._heapify_up_max(parent) else: self._heapify_up_min(i) def _heapify_up_min(self, i): grandparent = self.parent(self.parent(i)) if i > 2 and self.heap[i] < self.heap[grandparent]: self.heap[i], self.heap[grandparent] = self.heap[grandparent], self.heap[i] self._heapify_up_min(grandparent) def _heapify_up_max(self, i): grandparent = self.parent(self.parent(i)) if i > 2 and self.heap[i] > self.heap[grandparent]: self.heap[i], self.heap[grandparent] = self.heap[grandparent], self.heap[i] self._heapify_up_max(grandparent) def _heapify_down_min(self, i): while True: min_index = i left = self.left_child(i) if left < len(self.heap) and self.heap[left] < self.heap[min_index]: min_index = left right = self.right_child(i) if right < len(self.heap) and self.heap[right] < self.heap[min_index]: min_index = right if i != min_index: self.heap[i], self.heap[min_index] = self.heap[min_index], self.heap[i] i = min_index else: break def _heapify_down_max(self, i): while True: max_index = i left = self.left_child(i) if left < len(self.heap) and self.heap[left] > self.heap[max_index]: max_index = left right = self.right_child(i) if right < len(self.heap) and self.heap[right] > self.heap[max_index]: max_index = right if i != max_index: self.heap[i], self.heap[max_index] = self.heap[max_index], self.heap[i] i = max_index else: break
在这个实现中,MinMaxHeap类代表一个min-max堆,包含一个list堆,用于存放堆中的元素。 parent、left_child 和right_child 方法分别返回节点的父节点、左子节点和右子节点的索引。 get_min 方法返回堆中的最小元素,get_max 方法返回堆中的最大元素。 insert 方法将一个元素插入到堆中并维护堆属性。 extract_min 方法从堆中移除最小元素并保持堆属性。 extract_max 方法从堆中移除最大元素并保持堆属性。
_heapify_up、_heapify_up_min、_heapify_up_max、_heapify_down_min 和 _heapify_down_max 方法用于维护最小-最大堆属性。 _heapify_up 在向堆中插入元素后调用,以确保元素位于正确的位置。 _heapify_up_min 和 _heapify_up_max 由 _heapify_up 调用以维护最小-最大堆属性。 _heapify_down_min 和 _heapify_down_max 分别被 extract_min 和 extract_max 调用,以维护 min-max 堆属性。
关键词:
最小-最大堆的性质是:树中偶数层的每个节点都小于它的所有后代,而树中奇数层的每个节点都大于它的所有后代。
记者从山东省教育招生考试院获悉,山东省2023年4月高等教育自学考试将于4月15日至16日进行。省招考院4月4日致信考生
基本消息面周二(4月4日),国际油价走强,石油输出国组织及其合作伙伴(OPEC+)在前一天宣布进一步减
李明远资料图据陕西省委统战部官网“领导之窗”栏目信息,新任陕西省委常委李明远已任省委统战部部长、省政协党组副书记。李明
创业环保(SH600874,收盘价:5 88元)4月4日晚间发布公告称,2023年4月4日,天津创业环保集团股份有限公司收到河南诚达工程管理有限公司发来的
被视为最大罪臣的赵鹏已经退役,而唯一得到褒奖的当红国脚孙可,如今也已经落魄,在天海解散后还在寻找下家。究竟是这场比赛毁了赵鹏,还是赵
中国长城(000066)04月04日在投资者关系平台上答复了投资者关心的问题。
2023年04月04日国际黄金价格1979美元 盎司,国内黄金价格439 7元 克,香港金价21490港币 两,黄金回收价格428元 克,中国黄金基础金价439
4日,国新办就第133届中国进出口商品交易会有关情况举行发布会,外交部领事司司长吴玺表示,从今年5月1日开始,将允许APEC商务卡虚拟卡的持卡
8月15日因中油供气给台电大潭隔离站发生操作失误,造成全台大跳电,对产业及一般民众生活都带来不小的影响,也让近期引起高度关注的能源政策议题
今年,江西省加大重点群体个人创业担保贷款贴息力度,全年新增发放创业担保贷款245 21亿元,通过创业担保贷款直接扶持个人创业9 67万人次,稳
该局将在为期一个月的税收宣传月期间,紧紧围绕“税惠千万家·共建现代化”主题,广泛宣传税务部门学习贯彻党的二十大精神,以税收现代化服务
阳春三月,万物向阳。在这个孕育生机和希望的季节里,中国能建海外职工积极开展社会公益活动,付出一份爱,让世界更加美好。帮助特殊群体从肯
本文转自:海南日报我省多个在建医疗项目抢抓春季施工“黄金期”全力加载“进度条”医疗服务夯基础■本报记者邵长春通讯员王彩虹伍旭君近日,
中新财经注意到,诺特兰德抖音号上,张继科代言的一款名为“复合维生素片牛磺酸VC咀嚼片”标注到手价为9 9元。国家企业信用信息公示系统显示,
新冠基本结束,本是好消息,没想到雪上加霜的一幕再现了,肺炎,甲流,传染病,新冠病毒,新冠调整为乙类乙管
1、加速度 为了描述物体运动速度变化的快慢这一特征,我们引入加速度这一概念。2、 定义:物体运动速度的变化量与对应的
App4月3日消息,美国银行表示,4月历来对英镑来说是构成利好的月份,因该月正值股息支付季节,尽管近年来这种联系已经减弱。美银外汇策略师Kam
4月3日,同花顺发布关于股票交易异常波动公告。公告称,公司股票连续2个交易日内(2023年3月31日、4月3日)收盘价格涨幅偏离值累计达到30%以上
4月2日,武汉市发布气象预报,预告2日傍晚将出现大范围强降雨。记者从武汉市气象局了解到,受高空槽、低涡切变和冷空气共同影响,导致武汉市有
4月1日,海洋爱好者在观察竞赛中寻找海洋生物。3月31日至4月3日,由广西科学院主办、涠洲岛海洋教育中心和广西科学院科学教育与传播中心承办的
2023中级会计考试什么时候报名由会计职称考试栏目提供,查找更多考试报名资讯、准考证打印、成绩查询或2023中级会计考试什么时候报名请访问教育
这几年,计划生育科的工作重心也发生了变化,从“人流”转成了“保胎”。
乐居财经王敏4月3日,上交所公司债券项目信息平台显示,“中信建投-东吴-昆山城投阳澄湖滨酒店和新江南商业资产支持专项计划”项目状态更新为
1、搭载的传感器全色传感器:0 41metersx0 41meters多谱段传感器:1 65metersx
Copyright 2015-2023 今日酒业网 版权所有 备案号:沪ICP备2023005074号-40 联系邮箱:5 85 59 73 @qq.com