建堆O(n)時(shí)間復(fù)雜度證明

建堆復(fù)雜度先考慮滿(mǎn)二叉樹(shù),計(jì)算完全二叉樹(shù)建堆復(fù)雜度基本相同。

對(duì)滿(mǎn)二叉樹(shù)而言,第i層(根為第0層)有2^i個(gè)節(jié)點(diǎn)。由于建堆過(guò)程自底向上,以交換作為主要操作,因此第i層任意節(jié)點(diǎn)在最不利情況下,需要經(jīng)過(guò)(n-i)次交換操作才能完成以該節(jié)點(diǎn)為堆根節(jié)點(diǎn)的建堆過(guò)程。因此,時(shí)間復(fù)雜度計(jì)算如下:

T(n) = 2^0 * (n - 0) + 2^1 * (n - 1) + ... + 2^n * (n - n) = sum((n - i) * 2^i)

采用錯(cuò)位相減法:

  • 原式乘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

上面推導(dǎo)中,n為層數(shù)編號(hào)(自0層根節(jié)點(diǎn)開(kāi)始)。故總節(jié)點(diǎn)數(shù)為(1 + 2 + 4 + ... + 2^n) = 2^(n+1) - 1。漸進(jìn)時(shí),忽略減1取N = 2^(n+1)。

T(N) = 2^(n+1) - n - 2 = N * (1 - logN / N - 2 / N) ≈ N

故時(shí)間復(fù)雜度為O(N),得證。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容