堆中插入元素
堆中刪除元素
時間複雜度分析
設有n個資料元素的關鍵字為(k0, k1, …, kn-1),如果他們滿足以下的關係:ki
<= k2i+1且ki
<= k2i+2(或者ki >= k2i+1且ki >= k2i+2)(i=0, 1, …, 向下取整((n-2)/2)),則稱為堆(heap)。如果將此資料元素序列用一維陣列儲存,並將此陣列對應一棵完全二叉樹,則堆的含義可以理解為:在完全二叉樹中任何非葉子節點的關鍵字均不大於(或不小於)其左、右孩子節點的關鍵字。
堆頂如果是最小的數,那麼這個是最小堆,如果是最大的數,那麼是最大堆。
下面以最小堆為例說明。
採用自下而上的方法把序列逐步調整形成堆。需要呼叫向下調整演算法filterdown,它將以分支節點i為根的子樹調整為堆,當然在調整之前,節點i的左右子樹已經是最小堆。
該演算法的基本思想是:
先比較節點i左孩子節點和右孩子節點的關鍵字大小(如果存在左右孩子)。
如果節點i左孩子節點的關鍵字小於右孩子節點的關鍵字,則沿節點i的左分支進行調整,否則沿節點i的右分支進行調整。
用j指示i的左右孩子中關鍵字值比較小的孩子節點,然後將節點i和節點j進行關鍵字比較:
若節點i的關鍵字大於節點j的關鍵字,則交換兩節點的值。再令i=j,j=2*j+1,繼續向下一層進行調整。
若節點i的關鍵字不大於節點j的關鍵字或節點j沒有孩子時,調整結束。
有了這個向下調整演算法就可以將待構建序列調整為最小堆,演算法思想是:
首先找到按完全二叉樹節點編號排在最後面的那個分支節點i,它的左,右(如果有)孩子是葉子節點,也就是說i的左,右(如果有)子樹一定是最小堆。之後i的值遞減,每次呼叫filterdown方法,最終將整個陣列調整為最小堆。
在插入時,先把資料元素插在已經建成的最小堆的序列最後,顯然插入後很可能破壞了堆的性質,所以此時需要調整。此時還需要呼叫filterup方法,進行自下而上的調整使之符合堆的性質。
還是以最小堆為例。filterup方法的基本思想是:從插入節點j開始,比較節點j的關鍵字和其父節點i的關鍵字大小,如果節點j的關鍵字小於其父節點i的關鍵字,則交換兩個節點值,並使j=i,i=(j-1)/2繼續向上調整,直到j=0(即此時j為根節點)或者節點j的關鍵字大於其父節點i的關鍵字為止。
從堆中刪除堆頂元素後,把堆的最後乙個元素移到堆頂,並將堆的當前元素個數減一,最後需要呼叫filterdown函式從堆頂向下進行調整
在filterdown和filterup函式中while迴圈的次數不超過完全二叉樹的高度,所以對由n個資料元素組成的堆,這兩個函式的時間複雜度為o(log2n),插入和刪除的時間複雜度也是o(log2n),在構造堆的函式中呼叫了n/2次filterdown,所以時間複雜度為o(nlog2n)。
知識點7 堆
3.堆排序 4.題型訓練 5.應用場景 6.參考文件 理解堆的乙個很好的例子就是我們的足球世界盃的賽制!我們的足球世界盃的賽制就是自底向上的。堆是一棵完全二叉樹,樹中每個結點的值都不小於 或不大於 其左右孩子結點的值。堆一般用於優先佇列priority queue的實現,而優先佇列預設情況下使用的是...
知識點總結
1,迴圈中的中斷 continue 跳出此次迴圈,繼續for迴圈 break 跳出當前for迴圈 return 跳出當前方法 2,字串的操作 componentseparatedbystring stringbyreplacingoccurencesofstring withstring iskin...
知識點總結
oncreate onstrat onresume onpause onstop onrestart ondestroy standard 啟動activity都會產生乙個新的activity 預設模式 singletop 啟動activity允許多個,但不允許重疊 singletask 只允許有乙...