一卡二不卡三不卡无卡中文_欧洲猛男少妇又大又粗_国产精品制服一区二区萌白酱_日本最大色倩网站www免费_性欧美丰满熟妇xxxx性

python實現堆(最大堆、最小堆、最小最大堆)-焦點速讀

時間:2023-04-05 16:28:50 來源: 騰訊云


(資料圖)

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. 最小-最大堆

最小-最大堆的性質是:樹中偶數層的每個節(jié)點都小于它的所有后代,而樹中奇數層的每個節(jié)點都大于它的所有后代。

用途 雙端優(yōu)先級隊列

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 方法分別返回節(jié)點的父節(jié)點、左子節(jié)點和右子節(jié)點的索引。 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實現堆(最大堆、最小堆、最小最大堆)-焦點速讀

最小-最大堆的性質是:樹中偶數層的每個節(jié)點都小于它的所有后代,而樹中奇數層的每個節(jié)點都大于它的所有...

來源:騰訊云2023.04.05

今熱點:甲基異丁酮MIBK商品報價動態(tài)(2023-04-05)

交易商品牌 產地交貨地最新報價甲基異丁酮MIBK 含量99%蕪湖睿鴻化工有限公司國產山東省 濟南市16300...

來源:生意社2023.04.05

第一百三十三屆廣交會新參展企業(yè)超九千家(權威發(fā)布)|今日快訊

第133屆中國進出口商品交易會(廣交會)將于今年4月15日到5月5日在廣東廣州舉辦,全面恢復線下辦展,同...

來源:人民網-人民日報2023.04.05

焦點速看:非洲出現“致命24小時”疾病,可能屬于人畜共患疾病,世衛(wèi)組織發(fā)出警告

據最新報道,非洲布隆迪近期爆發(fā)一種神秘疾病,已導致3人死亡。所有病例均在癥狀出現24小時內死亡。此外...

來源:互聯網2023.04.05

新疆軍區(qū)某團后裝保障演練:布陣曠野礪精兵

戰(zhàn)車馳騁,煙塵漫卷。近日,新疆軍區(qū)某團組織后裝保障要素演練,圍繞野外機動、野戰(zhàn)搶修等多個課目展開專...

來源:光明網2023.04.05

超市逛得開心、商品買得放心、日子過得舒心,河北正定鄉(xiāng)鎮(zhèn)商超豐富鄉(xiāng)親生活_環(huán)球動態(tài)

數據來源:河北省商務廳、正定縣整理貨架、補充商品……在河北省石家莊市正定縣南崗鎮(zhèn),瑞天超市北孫村...

來源:《 人民日報 》( 2023年04月05日 第 03 版)2023.04.05

江蘇一家長稱中學女兒被班主任猥褻,教育局通報:當事人已被刑拘,已撤銷其教師資格 每日熱訊

4月4日晚,江蘇連云港灌云縣教育局發(fā)布情況通報:2023年4月3日晚,縣公安部門接群眾報警,反映東王集中...

來源:杭州網2023.04.05

【世界快播報】blackpink五周年文案朋友圈_blackpink五周年文案

1、blackPinkInkKoreaEntertainmentCo Ltd Agirlgroupfro

來源:互聯網2023.04.05

泰拉瑞亞月總怎么打第二次(泰拉瑞亞月總怎么打)

大家好,小樂來為大家解答以上的問題。泰拉瑞亞月總怎么打第二次,泰拉瑞亞月總怎么打這個很多人還不知道...

來源:樂拇指2023.04.05

新聞快訊

新聞快訊