python實現堆(最大堆、最小堆、最小最大堆)-焦點速讀
(資料圖)
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é)點都大于它的所有...
今熱點:甲基異丁酮MIBK商品報價動態(tài)(2023-04-05)
交易商品牌 產地交貨地最新報價甲基異丁酮MIBK 含量99%蕪湖睿鴻化工有限公司國產山東省 濟南市16300...
第一百三十三屆廣交會新參展企業(yè)超九千家(權威發(fā)布)|今日快訊
第133屆中國進出口商品交易會(廣交會)將于今年4月15日到5月5日在廣東廣州舉辦,全面恢復線下辦展,同...
焦點速看:非洲出現“致命24小時”疾病,可能屬于人畜共患疾病,世衛(wèi)組織發(fā)出警告
據最新報道,非洲布隆迪近期爆發(fā)一種神秘疾病,已導致3人死亡。所有病例均在癥狀出現24小時內死亡。此外...
新疆軍區(qū)某團后裝保障演練:布陣曠野礪精兵
戰(zhàn)車馳騁,煙塵漫卷。近日,新疆軍區(qū)某團組織后裝保障要素演練,圍繞野外機動、野戰(zhàn)搶修等多個課目展開專...
超市逛得開心、商品買得放心、日子過得舒心,河北正定鄉(xiāng)鎮(zhèn)商超豐富鄉(xiāng)親生活_環(huán)球動態(tài)
數據來源:河北省商務廳、正定縣整理貨架、補充商品……在河北省石家莊市正定縣南崗鎮(zhèn),瑞天超市北孫村...
江蘇一家長稱中學女兒被班主任猥褻,教育局通報:當事人已被刑拘,已撤銷其教師資格 每日熱訊
4月4日晚,江蘇連云港灌云縣教育局發(fā)布情況通報:2023年4月3日晚,縣公安部門接群眾報警,反映東王集中...
【世界快播報】blackpink五周年文案朋友圈_blackpink五周年文案
1、blackPinkInkKoreaEntertainmentCo Ltd Agirlgroupfro
新聞快訊
新聞快訊
- python實現堆(最大堆、最小堆、最小最大堆)-焦點速讀
- 今熱點:甲基異丁酮MIBK商品報價動態(tài)(2023-04-05)
- 第一百三十三屆廣交會新參展企業(yè)超九千家(權威發(fā)布)|今日快訊
- 焦點速看:非洲出現“致命24小時”疾病,可能屬于人畜共患疾病,世衛(wèi)組織發(fā)出警告
- 新疆軍區(qū)某團后裝保障演練:布陣曠野礪精兵
- 超市逛得開心、商品買得放心、日子過得舒心,河北正定鄉(xiāng)鎮(zhèn)商超豐富鄉(xiāng)親生活_環(huán)球動態(tài)
- 江蘇一家長稱中學女兒被班主任猥褻,教育局通報:當事人已被刑拘,已撤銷其教師資格 每日熱訊
- 【世界快播報】blackpink五周年文案朋友圈_blackpink五周年文案
- 泰拉瑞亞月總怎么打第二次(泰拉瑞亞月總怎么打)
- 優(yōu)化營商環(huán)境青島在行動|青島市總工會:為新就業(yè)形態(tài)勞動者打造溫馨家園-環(huán)球播報
- 微動態(tài)丨曲阜市:文旅啟智廉潔潤心
- 東方國信:數據安全非公司主營業(yè)務,公司有參加國內工業(yè)互聯網領域的數據安全標準研究制定工作
- 2023天津五一車展(時間+門票+看點) 世界視訊
- @所有游客:查收這份清明出游提示 四月這些著名景區(qū)免費玩! 天天快播報
- 重慶稅務局網上辦稅大廳官網查詢_重慶稅務局網上辦稅大廳官網-全球微頭條
- 科源制藥上市超募4億首日破發(fā)跌12.3% 2產品產能過剩
- 天天百事通!A股大分化 3300點上方應謹慎!
- 當前速遞!白酒中的“地頭蛇”們,困在原地
- 朝云集團14億元,陳丹霞打開集團快速上升通道
- 【速看料】Rivian Q1產量和交付量同比激增:產量增長268% 交付量增長548%
- 北向資金凈賣出超40億元
- 當前訊息:新華全媒+|熱血鑄警魂 生命寫忠誠——追記浙江省瑞安市公安局民警葉永亮
- 2023四川雅安市石棉縣森林資源保護林場招聘兩名工作人員擬聘用人員的公示_快資訊
- 用熱水澡洗去一天的疲憊吧!樂高優(yōu)秀MOC作品日賞【vol.428】
- 世界最美情詩集_世界上最美的情詩古詩
- 冠的多音字組詞語_冠的多音字組詞
- 2022統計公報:大國崛起
- 明明是風情萬種的大美人,卻非要硬凹少女 即時看
- 今日最新!腰筋膜炎的癥狀及治療方法(腰筋)
- 王大雷歸隊李源一暫未現身,李松益加盟河南,海港簽下外援中鋒 當前滾動
- 蘆薈面膜可以敷一晚上嗎?
- 萬通發(fā)展股東GLP累計減持0.35%股份,減持計劃時間過半
- 耶的手勢圖片可愛_耶的手勢圖片
- 天天信息:2×1000MW!國電電力大同湖東施工調試監(jiān)理中標候選人公示
- 世界消息!4月3日科德數控漲5.23%,長城優(yōu)化A基金重倉該股
- 望變電氣(603191):盈利穩(wěn)步提升 硅鋼業(yè)務持續(xù)高端化
- 斗羅大陸:戴沐白邀請?zhí)迫バ橇_帝國,自己卻有點愧疚 視點
- 云計算ETF、大數據ETF今年漲超50%,AI行情從主題到主線?
- 2023“皖美山水”騎行賽-全椒江淮分水嶺風景道站激情開賽
- 當前快訊:國際實業(yè):截至2023年3月31日,公司的股東總戶數為39,140戶
- 2023兩個字獨特好聽名字女生網名精選網名55個(2020年兩個字的名字)|世界消息
- 維宏股份(300508):第四屆第八次董事會會議決議,審議《關于公司(2022年度董事會工作報告)的議案》等多項議案-天天速訊
- 世界熱資訊!電視機掛懸浮樓梯上,本以為是說著玩,他家卻實實在在的做出來了
- 世界熱推薦:科學新發(fā)現·視頻連線丨為何造林沒防住今年的沙塵暴?
- 戴維斯談球隊心態(tài) 想要贏下剩余六場比賽_每日消息
- t檢驗 p值可以用什么來算_t檢驗p值怎么查表
- 德昌杉白坡山個體12
- 低保戶被冒名貸款15萬?銀行:確有員工調查不盡職_全球消息
- 天天短訊!全國鐵路4月1日實行新的貨物列車運行圖
- 愛仕達:公司暫未涉及鄉(xiāng)村振興相關的業(yè)務|環(huán)球視點