[資料結構]堆

Duancf發表於2024-07-07

建堆的兩種方式

自上而下

這種方式的思路是,每插入一個節點,就向上比較,判斷是否需要與其父節點進行交換,

image

分析這種方式的時間複雜度,假設樹的高度為h,以下均考慮最壞情況,也就是每一個節點都調整到根

第一層的1個節點不需要調整

第二層的2個節點,每個節點向上調整1次,2*1,

第三層的4個節點,每個節點向上調整2次,4*2,

第四層的8個節點,每個節點向上調整3次,8*3,

...

第h層的2^(h-1)個節點,每個節點向上調整h-1次,2^(h-1)*(h-1)

累計,

T(n) = 2^(1)*1+2^(2)*2+2^(3)*3+2^(4)*4+...+2^(h-1)*(h-1)

2*T(n) = 2^(2)*1+2^(3)*2+2^(4)*3+2^(5)*4+...+2^(h-1)*(h-2) +2^(h)*(h-1)

用T(n)-2*T(n),

T(n)-2*T(n) = 2^1+2^2+2^3+...+2^(h-1)-2^(h)*(h-1)

​ = 2^h-2-2^h*(h-1)

h=log2(n)代入

​ = 2^(log2(n))-2-2^(log2(n))*(log2(n)-1)

​ = n-2-n*(log2(n)-1)

保留最高項

T(n) = O(nlog2(n))

自下而上

先建立完全二叉樹,然後從最後一個有葉子結點的節點開始向前調整。

image

時間複雜度分析,假設樹的高度為h,

第一層有1個節點,向下調整h-1次,1*(h-1)

第二層有2個節點,向下調整h-2次,2*(h-2)

第三層有4個節點,向下調整h-3次,4*(h-3)

第四層有8個節點,向下調整h-4次,8*(h-4)

...

h-1層有2^(h-2)個節點,向下調整1次,

h層有2^(h-1)個節點,向下調整0次,

T(n) = 2^0*(h-1)+2^1*(h-2)+2^2*(h-3)+2^3*(h-4)+...+2^(h-2)*1

2*T(n) = 2^1*(h-1)+2^2*(h-2)+2^3*(h-3)+2^4*(h-4)+...+2^(h-2)*2+2^(h-1)*1


2*T(n)-T(n) = -(h-1) + 2+2^2+2^3+2^4+...+2^(h-2)+2^(h-1)

​ = -(h-1)+2^h-2

帶入h = log2(n)

T(n) = -(log2(n)-1)+n-2

保留最高項

T(n) = O(n)

相關文章