91精品国产自产在线观看永久_香蕉久久一区二区不卡无毒影院_91视频国产精品_日韩成人高清在线_久久久久久久久久久久久女国产乱 _亚洲欧美日韩国产一区二区三区_99久久精品免费看_亚洲影视九九影院在线观看_久久精品国产亚洲_成人a级免费视频

首頁 > 綜合 > 正文

python實現堆(最大堆、最小堆、最小最大堆)

2023-03-31 19:27:00來源:騰訊云  


(資料圖)

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

標簽:

相關閱讀

精彩推薦

相關詞

推薦閱讀

91精品国产自产在线观看永久_香蕉久久一区二区不卡无毒影院_91视频国产精品_日韩成人高清在线_久久久久久久久久久久久女国产乱 _亚洲欧美日韩国产一区二区三区_99久久精品免费看_亚洲影视九九影院在线观看_久久精品国产亚洲_成人a级免费视频
狠狠色2019综合网| 7878成人国产在线观看| 一区二区三区毛片| 福利一区二区在线| 成人av影院在线| 精品国产一区二区在线观看| 亚洲精品自拍动漫在线| 国产精品白丝jk黑袜喷水| 欧美一区二区三区在线视频| 欧美在线视频不卡| 欧美亚洲一区二区在线观看| 99精品视频在线观看免费| 国产精品久久一卡二卡| 成人久久18免费网站麻豆 | 亚洲国产sm捆绑调教视频| 一区二区三区四区视频精品免费 | 亚洲婷婷综合久久一本伊一区| 成人在线视频一区二区| 一区二区三区四区不卡在线 | 色狠狠桃花综合| 亚洲精品国产无套在线观| 午夜精品久久一牛影视| 国产偷v国产偷v亚洲高清| 91国产成人在线| 国产伦精品一区二区三区在线观看 | 日本乱码高清不卡字幕| 成人一道本在线| 国产99一区视频免费| 精品久久久久久久久久久久包黑料 | 一区二区三区**美女毛片| 精品盗摄一区二区三区| 99riav久久精品riav| 国产成人亚洲综合色影视| 欧美一区二区三区免费| 欧美精品日韩一区| 欧美影视一区二区三区| 一区二区三区免费观看| 国产亚洲欧洲997久久综合| 精品久久国产97色综合| 欧美一级片免费看| 久久久五月婷婷| 久久―日本道色综合久久| 欧美日韩国产在线播放网站| 欧美天天综合网| 亚洲色大成网站www久久九九| 日韩精品专区在线影院观看| 欧美tickling网站挠脚心| 精品国产成人系列| 欧美r级电影在线观看| 精品亚洲aⅴ乱码一区二区三区| 欧美激情中文字幕| 亚洲激情在线激情| 欧美一级片在线看| 亚洲精品一卡二卡| 视频一区国产视频| 北条麻妃国产九九精品视频| 色婷婷av一区二区| 日韩欧美你懂的| 亚洲丝袜自拍清纯另类| 免费久久精品视频| 香蕉久久一区二区不卡无毒影院 | 国产精品成人午夜| 另类小说一区二区三区| 色狠狠一区二区三区香蕉| 精品福利一二区| 日韩一区二区三区在线视频| 亚洲视频1区2区| 91免费观看视频| 2019国产精品| 亚洲三级视频在线观看| 亚洲日韩欧美一区二区在线| 国产亚洲午夜高清国产拍精品| 成人午夜电影网站| 国产午夜精品一区二区三区视频| 国产乱国产乱300精品| 久久久精品国产免大香伊| 成人午夜伦理影院| 日日摸夜夜添夜夜添精品视频| 色哦色哦哦色天天综合| 久久99国产精品久久| 日韩精品中文字幕一区二区三区 | 中文字幕一区在线观看视频| 99久久免费视频.com| 久久久久久久久免费| 一本大道综合伊人精品热热| 国产精品久久久久久久久免费桃花| 欧美主播一区二区三区| 91在线精品秘密一区二区| 国产一区二区三区美女| 丝袜亚洲另类欧美| 亚洲男人的天堂在线aⅴ视频| 777色狠狠一区二区三区| 欧洲一区二区av| 日日摸夜夜添夜夜添亚洲女人| 亚洲欧美精品午睡沙发| 亚洲男人的天堂av| 欧美亚洲免费在线一区| 高清在线不卡av| 国产盗摄视频一区二区三区| 国产午夜亚洲精品理论片色戒| 国产专区综合网| 精品乱人伦小说| 国产成人免费视频网站| 麻豆成人综合网| 日韩黄色在线观看| 99re成人在线| 制服视频三区第一页精品| 欧美日韩一区三区| 51久久夜色精品国产麻豆| 久久综合久久久久88| 91尤物视频在线观看| 国产激情视频一区二区在线观看 | 亚洲综合在线免费观看| 中文字幕不卡一区| 捆绑紧缚一区二区三区视频 | 一区精品在线播放| 国产精品传媒视频| 久久精品国产亚洲高清剧情介绍| 91丝袜美女网| 国产精品盗摄一区二区三区| 日韩丝袜美女视频| 97se狠狠狠综合亚洲狠狠| 亚洲成人av福利| 91国产福利在线| 免费在线观看精品| 国产精品亚洲专一区二区三区 | 成人午夜视频福利| 久久女同性恋中文字幕| 欧洲av在线精品| 亚洲精品一区二区三区影院| 成人18视频日本| 国产精品人妖ts系列视频| 欧美日韩一区三区四区| 日韩欧美一二三| 久草在线在线精品观看| 精品视频在线视频| 久久影院电视剧免费观看| 欧美电影免费观看高清完整版 | 欧美日韩美女一区二区| 欧美xxxxx牲另类人与| 欧美夫妻性生活| 国产精品原创巨作av| 懂色av噜噜一区二区三区av| 欧美吻胸吃奶大尺度电影| 中文字幕一区不卡| 欧美aaaaa成人免费观看视频| 91视视频在线直接观看在线看网页在线看 | 奇米777欧美一区二区| 亚洲欧美偷拍三级| 日韩网站在线看片你懂的| 91免费看`日韩一区二区| 国产精品久久久久久久久免费相片| 国产aⅴ精品一区二区三区色成熟| 中文字幕五月欧美| 欧美日韩成人综合天天影院| 在线免费视频一区二区| 午夜欧美一区二区三区在线播放| 欧美伊人久久久久久久久影院| 国产·精品毛片| 国产精品一级在线| 久草在线在线精品观看| 成人激情综合网站| 亚洲精品成人精品456| 欧美日韩在线播放一区| 国产黄色91视频| 日韩精品91亚洲二区在线观看| 国产精品国产馆在线真实露脸| 亚洲图片激情小说| 欧美成人video| 国产精品国产三级国产aⅴ中文| www.亚洲人| 国产在线看一区| 丁香一区二区三区| 成人高清免费在线播放| 亚洲一级在线观看| 亚洲特级片在线| 欧美性做爰猛烈叫床潮| 日韩国产一区二| 国产一区二区三区免费播放| 自拍偷拍国产亚洲| 性欧美疯狂xxxxbbbb| 裸体一区二区三区| 555www色欧美视频| 国产大片一区二区| 日韩美女啊v在线免费观看| 久久综合九色综合97_久久久| 国产精品三级av| 国产精品国产自产拍高清av王其 | 亚洲精品国产精华液| 日精品一区二区三区| 2020日本不卡一区二区视频| 亚洲欧洲在线观看av| 国产日产欧美一区| 日本va欧美va欧美va精品| av一区二区三区| 中文字幕一区二区三区乱码在线| 成人免费视频视频| 久久蜜桃一区二区| 国产麻豆精品在线观看| 欧美午夜影院一区|