天天即时看!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实现堆(最大堆、最小堆、最小最大堆)
- 焦点精选!充分激发个体工商户活力
- 让“丰碑”更闪亮——新时代湖南烈士褒扬工作呈现新气象
- 环球微头条丨凤凰传媒:江苏省财政厅及江苏省委宣传部已批复同意凤凰集团与中移投资控股有限责任公司协议转让凤凰传媒10%股份的交易事项
- 遗赠与遗赠抚养协议区别
- 究竟买房子剩余的贷款怎样还合适|世界微动态
- 北京丰台王佐巨幅稻田画开始备“颜料”!今年“画”啥?|世界快消息
- 环球今日报丨贵州借助交通网络布局整合景区景点 文旅串珠成链 产业带能级提升
- 年报现场 | 建发国际林伟国:今年销售目标增长10%-20%,拿地力度还将加大
- 警惕!有人以这家事业单位名义推销产品
- 环球看点!嫦娥四号探测器是用哪个型号火箭发射的_你知道吗
- 农产品:美农报告利多,豆粕存支撑 环球短讯
- 乡村振兴|助推全域旅游发展!中坝村非遗文化这样传承~
- 鼻塞咳嗽有痰吃什么药最好_鼻塞咳嗽有痰吃什么药
- 最佳阵容礼品码用不了 实时
- “95后”“守宝人”:用“匠心”演绎“化腐朽为神奇”|每日速讯
- 志在超越魔兽世界!暴雪新游戏IP即将于2023年4月公布
- 【营商环境】杨浦区以“区块链”赋能“材料银行”,让数据多跑路群众少跑腿 全球观天下
- 中矿资源(002738):2023年第一季度可转换公司债券转股情况
- 英西战争_关于英西战争的简介
- 1全球实时:本田真凛哪里人简介
- 2【全球时快讯】俄媒:俄国防部称,俄罗斯空降兵部队首次接收重型喷火系统
- 3以闪亮之名玩呐8-6怎么搭配-天天热闻
- 4那么问题来了,保房价还是保汇率?| 钛赞了视频周榜第90期 全球报资讯
- 5环球热议:英国大学即将截止申请的专业汇总,抓紧时间!
- 6中柬“金龙-2023”联演:无疆大爱播撒在异域他乡|全球信息
- 7简讯:云浮市流动就业养老金从哪儿领取
- 8望洞庭湖赠张丞相原文和翻译_望洞庭湖赠张丞相原文及翻译注释赏析
- 9十项阅读活动等你来打卡
- 10年内19只债基降低管理费 一级债基成主力
- 1高顿教育:经济法中的民事法律行为包括哪些内容?|每日报道
- 2第四次全国中药资源普查发现至少196个新物种 当前时讯
- 3简讯:和讯个股快报:2023年04月03日 帝欧家居 (002798),股价出现向上跳空缺口
- 4菠萝一半黄一半绿熟了吗
- 5U18男子冰球世锦赛乙级B组:中国队四战全胜暂居次席-独家焦点
- 6电饭煲品牌排行榜_日本电饭煲品牌排行榜-焦点播报
- 7旅游 | 行业复苏背景下文旅企业更应守好安全关|天天热推荐
- 8西安欧亚学院参加陕西高等教育研究院智库建设与决策咨询专题研讨会|天天快看
- 9荣耀推送新功能:来电/去电语音控制 这些机型支持
- 10环球动态:百度集团等多家港股公司申请增设人民币柜台 机构称有望改善市场流动性
广告
财经
- 这车真不错|新的更强?旧的更好?我选择了新款宝马325i
- 【世界聚看点】团支书的工作职责概括_团支书的工作职责
- 天天微资讯!海能达2022年实现营收56.53亿元 主营业务稳定增长
- 全球速看:团城山房子_团山租房
- 世界新资讯:“乙类乙管”后首个清明,民政部要求全面恢复常态化殡葬服务保障
- 【热闻】通达股份:公司目前主要出口产品有钢芯铝绞线系列产品、铝合金绞线系列产品、新能源电缆等
- 外媒:智利两所学校67名师生因环境污染中毒 看热讯
- 青岛社保怎么购买?
- 天天热点评!据塔斯社31日报道,克里姆林宫发言人、俄总统新闻秘书德米特里·佩斯科夫表示,俄罗斯总统普京已经提交了其2022年的收入申报单
- 焦点信息:英国将于年内实现正式加入CPTPP,外交部回应
- 净利5年翻10倍,重估四川路桥的价值|看财报_全球新要闻
- 重点聚焦!刘涛在街头被围观,穿普通衣服五五身材,引起网友热议
- 每日视点!广联达3月31日快速上涨
- 涉毒“零容忍”,湖南高院通报依法从严打击毒品犯罪工作情况
- 美国民主党参议员敦促政府继续暂停征收光伏组件关税
- 美菜为农民实现稳定增收创造条件 每日快报
- 2025年初步建立特色优势鲜明的中医药服务体系 全球热资讯
- 新资讯:法式鹅肝的营养价值及危害_法式鹅肝
- 车主注意!油价或迎年内第三降,预计加满一箱少花13.5元|当前头条
- 郑州市聚力打造“万亿”电子信息产业群|全球最资讯