建堆O n 時間複雜度證明

2021-09-12 15:44:23 字數 773 閱讀 8183

建堆複雜度先考慮滿二叉樹,計算完全二叉樹建堆複雜度基本相同。

對滿二叉樹而言,第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),得證。

建堆的時間複雜度計算

現在常有兩種建堆的方法,而這兩種方法又有著不同的時間複雜度。下面分別陳述 1 自頂向下的建堆方式 這種建堆的方法具有o n log2n 的時間複雜度。從根結點開始,然後乙個乙個的把結點插入堆中。當把乙個新的結點插入堆中時,需要對結點進行調整,以保證插入結點後的堆依然是大根堆。如下圖所示,是採用自頂向...

Manacher時間複雜度證明

今天,我們來證明一下manacher的時間複雜度。先貼上manacher演算法的模板 s 0 s m for b 1 ss b 0 b s m for int i 1 i m i 我們考慮產生複雜度的地方,分別是最外層對整個字串的遍歷和每次對回文串擴充套件的while。顯然,最外層的for迴圈是o ...

堆排序建堆的時間複雜度

建堆的過程,看起來外面一層迴圈o n 裡面是個logn的調整函式,時間複雜度貌似是nlogn的,但是仔細分析,其實質是o n 的。證明如下 首先,對於高度為h的完全二叉樹,其第i層的元素個數為2 i 1 對於堆的每一層,調整的深度都不一樣,每層的元素的調整深度小於等於h i,假設每層調整的深度是h ...