建堆的時間複雜度計算

2021-08-21 20:14:44 字數 643 閱讀 8327

現在常有兩種建堆的方法,而這兩種方法又有著不同的時間複雜度。下面分別陳述:

(1)自頂向下的建堆方式

這種建堆的方法具有o(n*log2n)的時間複雜度。從根結點開始,然後乙個乙個的把結點插入堆中。當把乙個新的結點插入堆中時,需要對結點進行調整,以保證插入結點後的堆依然是大根堆。如下圖所示,是採用自頂向下的方法建立的大根堆。

其中h = log2(n+1)-1,第k層結點個數為2k個(當然最後一層結點個數可能小於2h)。第k層的乙個結點插入之後需要進行的比較(移動)次數為k。於是總的比較(移動)次數為∑k*2k(k = 0,1,2,...,h)。可以求得∑k*2k(k = 0,1,2,...,h)=(log2(n+1)-2)*(n+1)+2 = o(n*log2n)

(2)自下向上的建堆方式

這種建堆的方法具有o(n)的時間複雜度。如下圖所示,從第乙個非葉子結點開始進行判斷該子樹是否滿足堆的性質。如果滿足就繼續判斷下乙個點。否則,如果子樹裡面某個子結點有最大元素,則交換他們,並依次遞迴判斷其子樹是否仍滿足堆性質。

因為調整根結點以及其左右孩子的位置的複雜度是o(1),再加上對其子樹的遞迴判斷是否滿足堆性質需o(h),而在任意高度h上,至多有[n/2^(h+1)]個結點。則總共的時間複雜度為∑h*(n)/(2(h+1)).根據調和級數的積分公式可得,時間複雜度為o(n)。

建堆O n 時間複雜度證明

建堆複雜度先考慮滿二叉樹,計算完全二叉樹建堆複雜度基本相同。對滿二叉樹而言,第i層 根為第0層 有2 i個節點。由於建堆過程自底向上,以交換作為主要操作,因此第i層任意節點在最不利情況下,需要經過 n i 次交換操作才能完成以該節點為堆根節點的建堆過程。因此,時間複雜度計算如下 t n 2 0 n ...

堆排序建堆的時間複雜度

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

為什麼建堆的時間複雜度是O n ?

原文 先看下堆排序與快速排序的實現 includeusing namespace std const int maxn 111 int a maxn void quicksort int a,int l,int r else break void buildheap int num,int len ...