建堆復雜度先考慮滿二叉樹,計算完全二叉樹建堆復雜度基本相同。
對滿二叉樹而言,第i層(根為第0層)有2^i
個節點。由于建堆過程自底向上,以交換作為主要操作,因此第i層任意節點在最不利情況下,需要經過(n-i)
次交換操作才能完成以該節點為堆根節點的建堆過程。因此,時間復雜度計算如下:
T(n) = 2^0 * (n - 0) + 2^1 * (n - 1) + ... + 2^n * (n - n) = sum((n - i) * 2^i)
采用錯位相減法:
- 原式乘2得:
T(n) * 2 = 2^1 * (n - 0) + 2^2 * (n - 1) + ... + 2^(n+1) * (n - n)
= sum((n - i) * 2^(i+1))
- 原式如下:
T(n) = 2^0 * (n - 0) + 2^1 * (n - 1) + ... + 2^n * (n - n)
= sum((n - i) * 2^i)
- 相減得:
2T(n) - T(n) = -n + 2^1 + 2^2 + ... + 2^n = 2 * (1 - 2^n) / (1 - 2) - n
= 2^(n+1) - 2 - n
上面推導中,n為層數編號(自0層根節點開始)。故總節點數為(1 + 2 + 4 + ... + 2^n) = 2^(n+1) - 1
。漸進時,忽略減1取N = 2^(n+1)
。
T(N) = 2^(n+1) - n - 2 = N * (1 - logN / N - 2 / N) ≈ N
故時間復雜度為O(N)
,得證。