python实现堆(最大堆、最小堆、最小最大堆) 信息

2023-04-05 06:40:16 来源:腾讯云


(资料图片仅供参考)

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 堆属性。

标签:

环球速讯:626国际禁毒日丨金海街道小微“潭”法之全民禁毒共参与

2023-06-26

马来西亚空军训练事故致2死1伤 全球聚焦

2023-06-26

深圳通报百富兴大厦异响振动事件后续:房屋基础薄弱,将全面加固

2023-06-26

限娱令_关于限娱令的介绍

2023-06-26

热文:泡泡人消消乐

2023-06-26

美以涉芬太尼问题逮捕中国公民,我驻美使馆提出强烈抗议 当前速看

2023-06-26

2023年浙江高考分数线公布:普通类本科一段488分

2023-06-25

长华集团(605018.SH):收到国内车企关于新能源新车型冲焊件的定点通知书

2023-06-25

武磊感叹中日差距 日媒评价武磊|全球热消息

2023-06-25

每日观点:天津外国语大学2023年招生咨询方式汇总

2023-06-25

大戏看北京|6.26-30日文艺资讯

2023-06-25

英雄联盟手游主动装备有哪些 英雄联盟手游主动装备介绍

2023-06-25

cctv1中秋晚会节目表-cctv1中秋晚会-全球时快讯

2023-06-25

为中国式现代化提供坚实资源支撑——写在第三十三个全国土地日之际 世界今热点

2023-06-25

北京高考分数线公布:普通本科录取控制分数线448分 全球速递

2023-06-25

每日热讯!花呗临时额度二维码_花呗突然给你临时额度

2023-06-25

世界聚焦:探索丰盈美好生活,与星纪元STERRA ES一起夏日露营

2023-06-25

小米录音文件在哪个文件夹里面 小米录音文件在哪个文件夹

2023-06-25

已确认,网红大雁“大宝”突然死亡!公安介入 天天热讯

2023-06-25

我的端午 通讯

2023-06-25

成渝地区双城经济圈建设围绕“十项行动”推进“四重清单” 全球热资讯

2023-06-25

2023年“新一线城市”榜单发布,“昆明”替换“佛山”重回榜单

2023-06-25

打pp的男打女视频 打pp的故事男打女视频_全球热闻

2023-06-25

曝国家电网招聘严格,只要985,211学生,且要专业对口,非年年招_天天观点

2023-06-25

环球新消息丨山枝根(山枝根泡酒是什么作用)

2023-06-25

超级棒球明星2013闪退_超级棒球明星II

2023-06-25

俄罗斯总统普京与土耳其总统埃尔多安通电话

2023-06-24

大连足球史上今天:2012年中超阿尔滨连追2球!绝平申花(6月24日)

2023-06-24

惠州汽车站官网(惠州汽车站)

2023-06-24

河蚌吃啥(河蚌吃什么简介介绍)

2023-06-24

Copyright ©  2015-2022 南极频道网版权所有  备案号:粤ICP备2022077823号-13   联系邮箱: 317 493 128@qq.com