python实现堆(最大堆、最小堆、最小最大堆)|环球看点
时间:2023-03-31 18:25:59 来源:腾讯云
(资料图片仅供参考)
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实现堆(最大堆、最小堆、最小最大堆)|环球看点
- 新城控股2022年实现营收1154.57亿 在手现金314.63亿元 全球新视野
- 滇中引水“龙头工程”石鼓水源取水主泵房开挖告捷_全球今热点
- 投资期权的基金有哪些,公募基金可以投资期权吗?
- 焦点速讯:朗进科技(300594)3月31日主力资金净卖出126.70万元
- 谷歌AI研究员跳槽OpenAI 曾警告谷歌不要用ChatGPT数据训练Bard
- 2022下半年山西英语四级加考成绩查询时间及入口
- 南溪法庭——法进乡村邻里安 播报
- 每日快讯!普绪赫文丛4_对于普绪赫文丛4简单介绍
- 天天微速讯:赢了100000元奖金!这对浙大“学霸”情侣太牛了
- 【天天新要闻】最惨暴跌97%!百亿俱乐部,大减员!
- 海南:符合条件的单位可申请缓缴住房公积金或调低缴存比例
- “挑战全网最冷门专业”,当甲骨文毕业生走红之后-每日讯息
- 既有铁路 完成移改
- 为什么再谈「AI威胁论」是杞人忧天|微资讯
- 【世界播资讯】铁氟龙材质胶料厂家_铁氟龙是什么材质
- 注意!安利股份将于4月25日召开股东大会|世界播报
- 壶口瀑布梁衡原文赏析_壶口瀑布 梁衡 全球播报
- 证监会同意长青科技深交所主板IPO注册
- 今日问政㊸丨简阳公交为啥不能刷成都公交卡?回应来了-快讯
- 商务礼仪ppt模板下载_商务礼仪ppt模板
- 你为骑手“续电” 我为你“续航”—— 上海银行创新服务模式,助力绿色科技企业扬帆远航
- 四川省人大常委会任免一批检察干部
- “效率狂人”经验自述:追求高效40年_天天速读
- 徐一新:加强流动人才人事档案管理
- 迪拉姆兑人民币汇率今日最新中间价(2023年3月30日)
- 2023杭州西溪花朝节亲子草地音乐节(活动时间+活动内容)-世界观焦点
- ETF观察丨贝泰妮涨超6% 创业板ETF博时(159908)交易溢价 机构:创业板指当前处于胜率较高的位置_聚看点
- 贵州毕节:百里杜鹃景区野生杜鹃花次第盛开 少数民族群众表演节目
- 南 玻A:3月29日融资净买入1097.04万元,连续3日累计净买入1569.59万元
X 关闭
资讯中心
传拼多多成立出海项目组 或将与极兔速递进行合作
2022-08-06
低价高品质引发抢购热潮 盒马生鲜奥莱在京靠什么赚钱?
2022-07-08
厦门保障性租赁房认定细则发布 配租面向新市民群体年度租金涨幅不超过5%
2022-05-20
新疆(含兵团)15日新增本土无症状感染者1例
2021-10-18
X 关闭