1. 程式人生 > >【數據結構】堆

【數據結構】堆

play 繼續 比較 alt i+1 指定 葉子節點 空間復雜度 分享圖片

定義


  (1)堆是一個完全二叉樹。(除了葉子節點,其他節點的值都是滿的)

  (2)堆中每一個節點的值都必須大於等於(或者小於等於)其左右節點的值。 對於每個節點的值大於等於子樹的值,稱為大頂堆。反之稱之為小頂堆。

  圖示(大頂堆):

技術分享圖片

堆的實現


  因為堆的執行(完全二叉樹),他適合用數組直接進行存儲。數組中下標為i的節點的左右節點為為i*2, i*2+1。而任意一個節點i的父節點是i/2。這裏我們在平時可以選擇下邊1作為第一個節點,有助於理解和代碼的書寫。如果我們用下標0作為第一個節點的話, 其子節點為(i+1)/2 ,(i+1)/2 +1。

技術分享圖片

堆的操作


  插入操作 :

在向堆中插入一個數據時,我們還是需要繼續滿足堆的特性。我們先將數據插入到數組的尾部,然後進行調整,讓其重新滿足堆的特性,這個過程就叫作堆化。

    堆化過程:從下往上堆化。

    從下往上堆化過程:先將數據插入到數組尾部,然後比較其父節點關系,然後繼續進行交換。直到最後滿足堆的性質。

技術分享圖片

    實現代碼

     明天補上

  刪除操作:在堆中我們一般都是刪除堆頂的元素,很少刪除指定下標節點的情況。所以我們還是只討論對於堆頂元素的刪除情況。

    堆化過程:從上往下堆化。

    從上到下進行堆化過程:在堆化的圖示過程中我們可以看待,這種情況會導致最後完成之後不能滿足完全二叉樹的情況。從而也就破壞了堆的性質。

技術分享圖片

    鑒於此情況,我們可以將待刪除的元素和數組中最後一個元素進行對調,然後從堆頂從一次向下進行堆化,直到最後滿足定義。這樣完畢之後他還是滿足完全二叉樹的定義。圖示如下:

技術分享圖片

    代碼實現

  復雜度分析:在對對進行操作時都不需要申請輔助空間,所以其空間復雜度為O(1),而對於時間復雜度,由於是以完全二叉樹的性質進行存儲的,從根節點到葉子節點的高度為log n ,因此在堆化的過程中時間,無論是插入操作還是刪除操作其時間復雜度為O(log n)。  

【數據結構】堆