演算法學習06 堆

2021-10-08 07:39:35 字數 947 閱讀 6033

**堆序性質:**和普通的樹不同的是,堆具有堆序性質。所謂堆序性質,即堆的根節點要比所有字節點大,並且遞迴地具有此性質。即樹根比左孩子和右孩子要大,同時左孩子在左子樹中最大,右孩子在右子樹中最大。

**結構性質:**類似完全二叉樹,底層上的元素被全部填滿,底層從左往右填入元素。

二叉堆即每個節點最多只有兩個節點的堆結構,每個節點(序號i)的父節點,左子節點,右子節點具有如下的變換關係

**上濾:**將某個節點和父節點進行比較,如果比父節點大,則和父節點進行交換,並且父節點也遞迴地進行這個過程。

**下濾:**將某個節點和它的子節點進行比較,選出最大的節點和自己進行交換。被交換的節點迭代地進行這個過程。

**插入:**為了滿足結構性質,從陣列的末端插入,然後利用上濾維護堆序性質

**彈出:**獲取最小值,把根節點彈出並且刪除,然後將末尾元素放置於根節點位置,然後用下濾維護堆序性質。

**思路1:**基於下濾操作。迴圈地,從⌊n/

2⌋

\left \lfloor n/2 \right \rfloor

⌊n/2

⌋到0,每個節點執行下濾操作。每次下濾操作的時間複雜度是log

(n

)log(n)

log(n)

(樹的高度),一共執行n/2次,因此時間複雜度是nlo

g(n)

nlog(n)

nlog(n

) **思路2:**基於上濾操作。將乙個陣列的1到n-1元素i,不斷地執行插入操作。每次插入的時間複雜度同樣是log

(n

)log(n)

log(n)

,一共執行n-1次,因此時間複雜度同樣是nlo

g(n)

nlog(n)

nlog(n

)基於最大堆的堆排序過程如下:

建堆交換堆頭和堆尾

堆大小減一

下濾

演算法學習06 單鏈表

乙個單向鍊錶基本由兩個元素組成,即資料字段和指標,而指標通常指向下乙個節點記憶體所在的位址。最後乙個節點沒有其他節點可以連線,因此指標的值為null。建立與遍歷 以動態分配產生鍊錶節點的方式,可以先行定義乙個類資料型別,要有乙個資料字段,接著在類中定義乙個指標變數,其資料型別與此類相同,作用是指向下...

演算法學習(三)堆排序

要弄清楚堆排序,我們首先要懂得以下兩點 1 邏輯上的結構,怎麼樣才是乙個堆。2 儲存上的結構,乙個堆儲存起來的結構是怎麼樣的。一般來講,堆排序中的 堆 指的是二叉堆,一種完全二叉樹的結構,每個父結點最多只有兩個子結點,且滿足兩點 1 父結點總是大於 小於 其兩個子結點 大於的,我們叫最大堆,小於的,...

左神演算法學習日記 堆(一)

一直覺得赫夫曼樹沒什麼diao用,沒想到這道題可以用赫夫曼樹,而且用小根堆可以實現赫夫曼樹,學到好多。題目二一塊金條切成兩半,是需要花費和長度數值一樣的銅板的。比如長度為20的金條,不管切成長度多大的兩半,都要花費20個銅板。一群人想整分整塊金條,怎麼分最省銅板?例如,給定陣列,代表一共三個人,整塊...