世界熱點(diǎn)!python實(shí)現(xiàn)堆(最大堆、最小堆、最小最大堆)
最小-最大堆的性質(zhì)是:樹中偶數(shù)層的每個(gè)節(jié)點(diǎn)都小于它的所有后代,而樹中奇數(shù)層的每個(gè)節(jié)點(diǎn)都大于它的所有后代。
(資料圖)
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())
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)
最小-最大堆的性質(zhì)是:樹中偶數(shù)層的每個(gè)節(jié)點(diǎn)都小于它的所有后代,而樹中奇數(shù)層的每個(gè)節(jié)點(diǎn)都大于它的所有后代。
用途 雙端優(yōu)先級(jí)隊(duì)列
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
在這個(gè)實(shí)現(xiàn)中,MinMaxHeap類代表一個(gè)min-max堆,包含一個(gè)list堆,用于存放堆中的元素。 parent、left_child 和right_child 方法分別返回節(jié)點(diǎn)的父節(jié)點(diǎn)、左子節(jié)點(diǎn)和右子節(jié)點(diǎn)的索引。 get_min 方法返回堆中的最小元素,get_max 方法返回堆中的最大元素。 insert 方法將一個(gè)元素插入到堆中并維護(hù)堆屬性。 extract_min 方法從堆中移除最小元素并保持堆屬性。 extract_max 方法從堆中移除最大元素并保持堆屬性。
_heapify_up、_heapify_up_min、_heapify_up_max、_heapify_down_min 和 _heapify_down_max 方法用于維護(hù)最小-最大堆屬性。 _heapify_up 在向堆中插入元素后調(diào)用,以確保元素位于正確的位置。 _heapify_up_min 和 _heapify_up_max 由 _heapify_up 調(diào)用以維護(hù)最小-最大堆屬性。 _heapify_down_min 和 _heapify_down_max 分別被 extract_min 和 extract_max 調(diào)用,以維護(hù) min-max 堆屬性。
關(guān)鍵詞:
最小-最大堆的性質(zhì)是:樹中偶數(shù)層的每個(gè)節(jié)點(diǎn)都小于它的所有后代,而樹中奇數(shù)層的每個(gè)節(jié)點(diǎn)都大于它的所有后代。
記者從山東省教育招生考試院獲悉,山東省2023年4月高等教育自學(xué)考試將于4月15日至16日進(jìn)行。省招考院4月4日致信考生
基本消息面周二(4月4日),國際油價(jià)走強(qiáng),石油輸出國組織及其合作伙伴(OPEC+)在前一天宣布進(jìn)一步減
李明遠(yuǎn)資料圖據(jù)陜西省委統(tǒng)戰(zhàn)部官網(wǎng)“領(lǐng)導(dǎo)之窗”欄目信息,新任陜西省委常委李明遠(yuǎn)已任省委統(tǒng)戰(zhàn)部部長(zhǎng)、省政協(xié)黨組副書記。李明
創(chuàng)業(yè)環(huán)保(SH600874,收盤價(jià):5 88元)4月4日晚間發(fā)布公告稱,2023年4月4日,天津創(chuàng)業(yè)環(huán)保集團(tuán)股份有限公司收到河南誠達(dá)工程管理有限公司發(fā)來的
被視為最大罪臣的趙鵬已經(jīng)退役,而唯一得到褒獎(jiǎng)的當(dāng)紅國腳孫可,如今也已經(jīng)落魄,在天海解散后還在尋找下家。究竟是這場(chǎng)比賽毀了趙鵬,還是趙
中國長(zhǎng)城(000066)04月04日在投資者關(guān)系平臺(tái)上答復(fù)了投資者關(guān)心的問題。
2023年04月04日國際黃金價(jià)格1979美元 盎司,國內(nèi)黃金價(jià)格439 7元 克,香港金價(jià)21490港幣 兩,黃金回收價(jià)格428元 克,中國黃金基礎(chǔ)金價(jià)439
4日,國新辦就第133屆中國進(jìn)出口商品交易會(huì)有關(guān)情況舉行發(fā)布會(huì),外交部領(lǐng)事司司長(zhǎng)吳璽表示,從今年5月1日開始,將允許APEC商務(wù)卡虛擬卡的持卡
8月15日因中油供氣給臺(tái)電大潭隔離站發(fā)生操作失誤,造成全臺(tái)大跳電,對(duì)產(chǎn)業(yè)及一般民眾生活都帶來不小的影響,也讓近期引起高度關(guān)注的能源政策議題
今年,江西省加大重點(diǎn)群體個(gè)人創(chuàng)業(yè)擔(dān)保貸款貼息力度,全年新增發(fā)放創(chuàng)業(yè)擔(dān)保貸款245 21億元,通過創(chuàng)業(yè)擔(dān)保貸款直接扶持個(gè)人創(chuàng)業(yè)9 67萬人次,穩(wěn)
該局將在為期一個(gè)月的稅收宣傳月期間,緊緊圍繞“稅惠千萬家·共建現(xiàn)代化”主題,廣泛宣傳稅務(wù)部門學(xué)習(xí)貫徹黨的二十大精神,以稅收現(xiàn)代化服務(wù)
陽春三月,萬物向陽。在這個(gè)孕育生機(jī)和希望的季節(jié)里,中國能建海外職工積極開展社會(huì)公益活動(dòng),付出一份愛,讓世界更加美好。幫助特殊群體從肯
本文轉(zhuǎn)自:海南日?qǐng)?bào)我省多個(gè)在建醫(yī)療項(xiàng)目搶抓春季施工“黃金期”全力加載“進(jìn)度條”醫(yī)療服務(wù)夯基礎(chǔ)■本報(bào)記者邵長(zhǎng)春通訊員王彩虹伍旭君近日,
中新財(cái)經(jīng)注意到,諾特蘭德抖音號(hào)上,張繼科代言的一款名為“復(fù)合維生素片?;撬酼C咀嚼片”標(biāo)注到手價(jià)為9 9元。國家企業(yè)信用信息公示系統(tǒng)顯示,
新冠基本結(jié)束,本是好消息,沒想到雪上加霜的一幕再現(xiàn)了,肺炎,甲流,傳染病,新冠病毒,新冠調(diào)整為乙類乙管
1、加速度 為了描述物體運(yùn)動(dòng)速度變化的快慢這一特征,我們引入加速度這一概念。2、 定義:物體運(yùn)動(dòng)速度的變化量與對(duì)應(yīng)的
App4月3日消息,美國銀行表示,4月歷來對(duì)英鎊來說是構(gòu)成利好的月份,因該月正值股息支付季節(jié),盡管近年來這種聯(lián)系已經(jīng)減弱。美銀外匯策略師Kam
4月3日,同花順發(fā)布關(guān)于股票交易異常波動(dòng)公告。公告稱,公司股票連續(xù)2個(gè)交易日內(nèi)(2023年3月31日、4月3日)收盤價(jià)格漲幅偏離值累計(jì)達(dá)到30%以上
4月2日,武漢市發(fā)布?xì)庀箢A(yù)報(bào),預(yù)告2日傍晚將出現(xiàn)大范圍強(qiáng)降雨。記者從武漢市氣象局了解到,受高空槽、低渦切變和冷空氣共同影響,導(dǎo)致武漢市有
4月1日,海洋愛好者在觀察競(jìng)賽中尋找海洋生物。3月31日至4月3日,由廣西科學(xué)院主辦、潿洲島海洋教育中心和廣西科學(xué)院科學(xué)教育與傳播中心承辦的
2023中級(jí)會(huì)計(jì)考試什么時(shí)候報(bào)名由會(huì)計(jì)職稱考試欄目提供,查找更多考試報(bào)名資訊、準(zhǔn)考證打印、成績(jī)查詢或2023中級(jí)會(huì)計(jì)考試什么時(shí)候報(bào)名請(qǐng)?jiān)L問教育
這幾年,計(jì)劃生育科的工作重心也發(fā)生了變化,從“人流”轉(zhuǎn)成了“保胎”。
樂居財(cái)經(jīng)王敏4月3日,上交所公司債券項(xiàng)目信息平臺(tái)顯示,“中信建投-東吳-昆山城投陽澄湖濱酒店和新江南商業(yè)資產(chǎn)支持專項(xiàng)計(jì)劃”項(xiàng)目狀態(tài)更新為
1、搭載的傳感器全色傳感器:0 41metersx0 41meters多譜段傳感器:1 65metersx
Copyright 2015-2023 今日酒業(yè)網(wǎng) 版權(quán)所有 備案號(hào):滬ICP備2023005074號(hào)-40 聯(lián)系郵箱:5 85 59 73 @qq.com