堆排序中建堆時間複雜度

若是僅從代碼上直觀觀察,會得出構造二叉堆的時間複雜度爲O(n㏒n)的結果,這個結果是錯的,雖然該算法外層套一個n次循環,而內層套一個分治策略下的㏒n複雜度的循環,該思考方法犯了一個原則性錯誤,那就是構建二叉堆是自下而上的構建,每一層的最大縱深老是小於等於樹的深度的,所以,該問題是疊加問題,而非遞歸問題。那麼換個方式,假如咱們自上而下創建二叉堆,那麼插入每一個節點都和樹的深度有關,而且都是不斷的把樹折半來實現插入,所以是典型的遞歸,而非疊加。算法


在作證實以前,咱們的前提是,創建堆的順序是bottom-top的。spa

正確的證實方法應當以下:遞歸


1. 具備n個元素的平衡二叉樹,樹高爲㏒n,咱們設這個變量爲h。變量

2. 最下層非葉節點的元素,只需作一次線性運算即可以肯定大根,而這一層具備2^(h-1)個元素,咱們假定O(1)=1,那麼這一層元素所需時間爲2^(h-1) × 1。二叉樹

3. 因爲是bottom-top創建堆,所以在調整上層元素的時候,並不須要同下層全部元素作比較,只須要同其中之一分支做比較,而做比較次數則是樹的高度減去當前節點的高度。所以,第x層元素的計算量爲2^(x) × (h-x)。循環

4. 又以上通項公式可得知,構造樹高爲h的二叉堆的精確時間複雜度爲:方法

S = 2^(h-1) × 1 + 2^(h-2) × 2 + …… +1 × (h-1)  ①margin


經過觀察第四步得出的公式可知,該求和公式爲等差數列和等比數列的乘積,所以用錯位想減發求解,給公式左右兩側同時乘以2,可知:top

2S = 2^h × 1 + 2^(h-1) × 2+ …… +2 × (h-1)      ②di


用②減去①可知: S =2^h × 1 - h +1        ③


將h = ㏒n 帶入③,得出以下結論:


S = n - ㏒n +1 = O(n)


因此咱們能夠得出結論:構造二叉堆的時間複雜度爲線性得證。


另外在算法導論78頁也有證實,不過用到的方法不同。

相關文章
相關標籤/搜索