建堆複雜度先考慮滿二叉樹,計算完全二叉樹建堆複雜度基本相同。
對滿二叉樹而言,第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 ...