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 堆属性。
关键词:
最小-最大堆的性质是:树中偶数层的每个节点都小于它的所有后代,而树中奇数层的每个节点都大于它的所有后代。
本报北京3月31日电(记者朱欣)中国能源化学地质工会第五届全国委员会第二次全体会议3月30日至31日在京召开。会议总结
直播吧4月1日讯据意媒“football-Italian”报道,近日罗马主帅穆里尼奥在接受采访时对罗马的氛围进行赞扬,并表示他与球迷的关系很融洽。穆里
强雨雪天气范围广、强度大根据预报,4月1日至5日,受较强冷空气影响,北方大部地区气温下降6~10℃,内蒙古等地部分地区降温幅度可达12℃以上
1、圆内接正五边形作法:(1)作⊙O的互相垂直的直径AQ、FG。2、(2)以OQ中点M为心,MF为半径作圆与A
自2007年5月28日上市以来,体彩超级大乐透不仅以其独有的“追加”投注方式以及“大奖大、奖级多”等游戏特点备受青睐,还不断以更好的游戏体验
(张玮张昕阳)31日,记者从内蒙古自治区兴安盟行署获悉,兴安盟大米获出口欧盟“通行证”。” 在许大伟看来,通过欧盟有机认证,提高了兴安
东方证券(600958)点评:公募资管贡献利润半壁江山2023年盈利弹性可期
当父母逐渐老去,想不好给自己如何养老的90后,已开始面临着给如何给父母养老的难题。
图为太原市公安局防范电信网络诈骗“精准劝”新闻发布会现场近年来,电信网络新型违法犯罪已成为发案最高、上升最快、损失最大、
1、玩了一段时间原始人,运气不错,宠物也有了,但是打猎老是觉得血掉的很快,宠物的胃口也大,和人争肉吃,过段时间就觉得肉也
关于报送20212022年度中国广播电视大奖广播文艺节目的公示 20212022年度中国广播电视大奖的评选工作即将举行,参照天津市广播电视协会广播
乐居财经刘治颖3月30日,华侨城A(000069)发布2022年年度报告。据悉,华侨城A将旗下物商集团重组升级为华侨城服务集团。报告期内,物业集团累计
创造城镇岛游戏攻略大全开罗创造城镇岛手游新手开局玩法介绍,开罗创造城镇岛游戏怎么玩,这是一款全新的岛屿经营类的游戏,在小岛上创造出各种
2022下半年云南英语四级加考成绩查询时间及入口已公布,2023年4月底查分,具体详情如下:免费领取新东方在线四六级公开课>>成绩发布:2022下半
1、IU演得比较好看的电视剧:2011年1月,首次出演电视剧,在校园剧《dreamhigh》中饰演歌唱实力惊人的女孩金必
《铃芽之旅》蝉联8天冠军,发起冲击的新片一个能打的都没有?
华声在线全媒体记者张佳伟通讯员肖天喜3月26日,城步苗族自治县汀坪乡大水村,一场接地气的全国两会精神宣讲屋场会气氛热
新股首日|力盟科技(02405)首挂上市开盘涨8 57%,上市,新股,力盟科技,电商平台
每经编辑杜宇据央视新闻客户端3月31日消息,据《纽约时报》30日报道,美国纽约曼哈顿大陪审团当天投票决定,就美国前总统特朗普涉嫌在2016