python实现堆(最大堆、最小堆、最小最大堆)-环球观速讯
(资料图片仅供参考)
1. 最大堆
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())
2. 最小堆
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)
3. 最小-最大堆
最小-最大堆的性质是:树中偶数层的每个节点都小于它的所有后代,而树中奇数层的每个节点都大于它的所有后代。
用途 双端优先级队列
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 堆属性。
标签:
为您推荐
广告
随机阅读
- python实现堆(最大堆、最小堆、最小最大堆)-环球观速讯
- 安以轩老公_徐若瑄老公_独家焦点
- 繁花与共的意思 今日快看
- 本周六超级杯拉开新赛季序幕|即时看
- 对数运算法则公式及例子_对数运算法则公式|环球快播
- 科士达(002518.SZ)一季度营收预增150%、扣非净利润预增335%-495%-天天播报
- 兰贵人茶属于什么茶(兰贵人茶属于什么茶功效)-今日聚焦
- 天天热头条丨(乡村振兴)江苏今年将新建高标准仓容120万吨以上 助力优粮优储
- 世界快资讯:温度教养:愿我的男孩,坚强、勇敢、担当,心中充满温暖和爱
- 拜登:人工智能是否危险还有待观察 但科技公司需为安全负责
- 上海牡丹赏花点推荐(景点汇总+持续更新)
- 中微公司:4月4日融资买入4.57亿元,融资融券余额18.01亿元 当前讯息
- 世界资讯:广发中证军工ETF净值下跌1.31% 请保持关注
- 女人缘超好的生肖男 走到哪都不缺追求者
- ?重罚!官方:米特洛维奇因推搡裁判停赛八场,罚款7.5万镑_焦点消息
- 【环球时快讯】联想a3000系统怎么升级(联想a30t)
- 茶乡新绿-全球速讯
- 中上协纵深推进新闻“打假治敲”专项行动落地见效
- 3名在泰国杀害中国女留学生的嫌疑人落网 曾试图设计恋爱圈套|焦点热议
- 新华全媒+丨一粒种子,书写“土特产”大文章
- 1湖北出台措施精准激励科技人才创新-天天新消息
- 2两部门发布4月份全国自然灾害风险形势
- 3菲律宾总统府正式宣布:四个新增美军基地的选址今天最终确定,全部针对中国大陆和南海!
- 4环球微速讯:苹果MR头显即将推出、库克称十年内用其取代iPhone
- 5解谜岛之旅好玩吗 解谜岛之旅玩法简介
- 6第133届广交会将在广州全面恢复线下举办
- 7要闻速递:悼念蓝盔忠魂 汲取奋进动力我维和官兵举行祭奠活动缅怀烈士
- 8经开区举办国际贸易金融政策培训会暨融资对接活动|当前热讯
- 9新款奔驰GLS家族全球首发 外观内饰全面优化升级
- 10神舟十四号返回舱实物厦门首次展出 当前通讯
- 1丝瓜长虫了能吃吗?
- 2观察:4月3日基金净值:南方中证房地产ETF最新净值0.693,涨2.18%
- 3斯巴达克斯第一季未删减在线观看夸克网盘_斯巴达克斯第一季未删减在线观看 天天视讯
- 4环球热推荐:降水大风即将抵津 清明节后温度再回升
- 5建发国际1-3月权益销售额约353亿元|全球今日报
- 6银行年报瞭望:22家银行中6家不良率低于1% 房地产冲击仍在 世界今日讯
- 7广汇物流(600603):广汇物流股份有限公司第十届董事会2023年第三次会议决议 当前看点
- 8央行发布2023年第一季度企业家问卷调查报告
- 9【当前独家】江南化工:公司参股的北京光年无限科技有限公司专注于人工智能相关技术的研发和场景应用
- 10沃柑有酒味是不是坏了(沃柑有酒味还能吃吗)
广告
财经
- 天天速看:小蛇和蚯蚓他们的可爱在哪里(小蛇小蚯蚓)
- 【时快讯】天天视讯!银行可以房贷延期吗现在?房贷延期申请如何办理?
- 保利置业集团(00119.HK):截至3月累计实现合同销售额约217亿元 同比增长261%_动态
- 王筱月_关于王筱月介绍_全球今日报
- 人的五行怎么算出来的_人的五行属性查询表-环球今日报
- 热文:午评:沪指拉升逼近3300点,科创50指数大涨近3%,芯片、券商等板块活跃
- 科学的洗脸方法_科学的洗脸七个步骤 全球观焦点
- 环球观焦点:百步穿杨 东契奇半场16分命中超远准压哨
- 邂逅美好春日 品味扎染技艺
- 【全球新视野】2023年4月2日北京市油菜批发价格行情
- 天天看热讯:15股获重要股东增持 天味食品获增持金额最多
- 外国友人走进惠民孙子兵法城领略古人智慧 世界快资讯
- 环球热头条丨芙蓉鸟的拼音是什么_它的原产地是哪里
- 【环球时快讯】上海技术交易所大连服务中心落户高新区
- 管道尺寸计算方法_管道尺寸
- 全球快看:曹操处死吕布后,没有霸占貂蝉的原因是什么
- 这场没有新车发布的投资者日 特斯拉为我们展现了哪些未来?|今日关注
- 虎刺梅养在卧室阳台可以吗_虎刺梅能不能养在卧室阳台
- 【聚看点】宏远球迷“占领”深圳主场,深圳再破广东团队篮球
- 天天信息:拥有500多万粉丝,25岁网红博主确诊肝癌?近8分钟视频,仅1秒是真的…后果来了