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

2023-04-05 10:28:51 来源:腾讯云 分享到:


(资料图片仅供参考)

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实现堆(最大堆、最小堆、最小最大堆)

来源:腾讯云 2023-04-05 10:28:51

环球通讯!大姨妈来了肚子疼怎么办(大姨妈来了肚子疼怎么办)

来源:互联网 2023-04-05 09:04:07

收起你的紧身裤,今秋流行“西装阔腿裤”,遮肉显瘦显气质 天天观焦点

来源:冬日奶泡泡 2023-04-05 07:36:47

天天速递!我有中国_我wwyouji中国

来源:互联网 2023-04-05 05:51:20

世界要闻:妖怪猎人伸太郎什么时候出 公测上线时间预告

来源:九游网 2023-04-05 02:17:58

世界热门:Whoscored评本轮西甲最佳阵:本泽马满分领衔,罗德里戈&加维在列

来源:直播吧 2023-04-04 22:38:50

“走出去”“请进来” 内蒙古招商引资和项目建设工作按下“快进键”

来源:内蒙古新闻广播 2023-04-04 21:10:04

动态焦点:怀孕需要注意什么事项_刚怀孕需要注意什么

来源:互联网 2023-04-04 19:46:25

长沙一小学外墙瓷砖脱落致4学生受伤送医,其中1人仍在ICU

来源:澎湃新闻 2023-04-04 18:50:59

贵阳微乐捉鸡麻将攻略_贵阳微乐捉鸡麻将 热门看点

来源:互联网 2023-04-04 18:06:01

和政县成功救助一只狍鹿

来源:民族日报 2023-04-04 17:07:10

Surface Duo 上的 Windows 10X 可能会给我们带来微软从未有过的双屏 PC

来源:互联网 2023-04-04 15:53:14

清明节天气:北方大部利出行 江南华南雨纷纷 世界快报

来源:中国天气网 2023-04-04 15:23:04

【融资事件】医疗服务商“旗云健康”完成数千万人民币A轮融资 深圳高新投领投 世界今热点

来源:网经社 2023-04-04 14:20:59

【新要闻】华光环能董秘回复:公司拟通过本次热电项目资产包收购,持续夯实热电联产主业,扩大公司热电联产业务规模

来源:证券之星 2023-04-04 13:09:12

一机两用,售价5500元起,特斯拉赛博充正式上线

来源:第一电动网 2023-04-04 12:03:57

月夜忆舍弟翻译_商山早行翻译|全球今日讯

来源:互联网 2023-04-04 11:30:20

【图解年报】统一股份:2022年归母净利润为-8422万元,连亏两年未能扭亏 滚动

来源:东方财富网 2023-04-04 11:00:22

东吴证券给予康龙化成买入评级

来源:每日经济新闻 2023-04-04 10:10:08

建职教高地 为梦想筑梯|2018-2022年全国普通高校大学生竞赛(高职)榜单出炉,武软为何名列湖北第一、全国第七

来源:极目新闻 2023-04-04 09:17:22

暴雨蓝色预警:9省区有大到暴雨 江西福建局地大暴雨

来源:新华社 2023-04-04 08:24:24

“供销超市”助农增收 环球观天下

来源:中青网新闻派 2023-04-04 07:19:57

硅片切割需求旺盛 高测股份净利增3.5倍-全球球精选

来源:同花顺财经 2023-04-04 05:52:14

环球热议:4月3日基金净值:国富恒瑞债券A最新净值1.423,涨0.07%

来源:证券之星 2023-04-04 02:07:24

爱看头评|推广生态葬,是造福子孙后代的善举

来源:爱看头条 2023-04-03 22:20:43

“春满鹏城,与星同行”世界孤独症日主题活动举行

来源:羊城派 2023-04-03 21:10:50

互动| 汤姆猫:公司开始接入测试OpenAI所提供的Embeddings等技术服务 每日消息

来源:金融界 2023-04-03 19:56:16

今日关注:二六三股东户数下降5.04%,户均持股5.68万元

来源:东方财富Choice数据 2023-04-03 18:54:03

速看:大风大雨上线 淮安航务中心淮安航道站船闸加强安全管理

来源:中国水运网 2023-04-03 18:19:27

詹姆斯:看到浓眉受伤时我也很难受,我们想要同场打球

来源:北青网-北京青年报 2023-04-03 17:13:13

Copyright   2015-2022 华东知识产权网 版权所有  备案号:京ICP备2022016840号-41   联系邮箱:2 913 236 @qq.com