1、本質
一顆特殊的樹。
2、特性
3、分類
對於每乙個節點的值都大於等於子節點的值的情況,該堆被稱為大頂堆。
對於每乙個節點的值都小於等於子節點的值的情況,該堆被稱為小頂堆。
4、儲存方式
對於完全二叉樹而言,陣列儲存方式是最節省記憶體的。
5、插入節點的時間複雜度
將節點插入到靠左的底層作為新的葉子節點,之後逐層比較交換,使得該樹的每乙個節點均大於或者小於子節點。故插入節點之後的堆化的時間複雜度為樹的高度,即:o(logn) 。
6、刪除堆頂節點的時間複雜度
刪除堆頂節點之後將一葉子節點放到堆頂,之後從上到下逐層交換,使得該樹的每乙個節點均大於或者小於子節點。故刪除堆頂節點之後的堆化的時間複雜度為樹的高度,即:o(logn) 。
1、查詢第k大(小)元素
構建乙個 k 大小的小頂堆,遍歷陣列與堆頂元素比較,如果比堆頂元素大就刪除堆頂資料,把該資料插入堆中,否則就比較下乙個。最後得到的小頂堆內的 k 個元素就是前 k 大的元素。
2、優先佇列
(1)高效能定時器
比如乙個定時器中維護了很多的定時任務,每個任務都設定了乙個觸發執行的時間點,定時器每過乙個很小的單位時間(比如0.1s)就會掃瞄一遍任務,如果有任務是當前時間,就觸發執行。
每過 0.1s 掃瞄全部任務效率會很低,所以把所有任務放入乙個最小堆中,堆頂儲存的是最先執行任務。定時器可以根據堆頂任務的執行時間得到乙個時間間隔 t,可以直接過 t 時間後再來檢查。
(1)爬蟲任務的優先佇列
二叉堆常用在爬蟲的優先順序佇列中,把任務按照優先順序放入二叉堆,排程器可以拿堆頂元素,保證拿到的是優先順序最高的 task。
(saw:game over!)
資料結構與演算法 堆
堆 完全二叉樹,高度為o lgn 基本操作至多和樹的高度成正比,構建堆的時間複雜度是o n 堆是一顆完全二叉樹,假設有n個節點,樹高h log2 n 證明方法如下 1 假設根節點的高度為0,葉子節點高度為h,每層包含元素個數為2 x,x 從0 到h。2 構建堆的過程是自下而上,對於每層非葉子節點需要...
資料結構與演算法 堆
在 演算法設計技巧與分析 這本書的第四章,介紹了堆。於是按照上面的偽 實現了一下。資料結構定義maxheap.hpp如下,1 ifndef max heap hpp 2 define max heap hpp 34 include 5using std vector 67 class maxheap...
資料結構與演算法 堆
堆的乙個經典的實現是完全二叉樹 complete binary tree 這樣實現的堆稱為二叉堆 binary heap 這裡來說明一下滿二叉樹的概念與完全二叉樹的概念。滿二叉樹 除了葉子節點,所有的節點的左右孩子都不為空,就是一棵滿二叉樹,如下圖。可以看出 滿二叉樹所有的節點都擁有左孩子,又擁有右...