Lintcode130 Heapify solution 題解

【題目描述】

Given an integer array, heapify it into a min-heap array.

For a heap array A, A[0] is the root of heap, and for each A[i], A[i 2 + 1] is the left child of A[i] and A[i 2 + 2] is the right child of A[i].

給出一個整數數組,堆化操作就是把它變成一個最小堆數組。

對於堆數組A,A[0]是堆的根,並對於每個A[i],A [i 2 + 1]是A[i]的左兒子並且A[i 2 + 2]是A[i]的右兒子。

【題目鏈接】

[www.lintcode.com/en/problem/heapify/]()

【題目解析】

Heapify一個Array,也就是對array中的元素進行siftup或者siftdown的操作。根據min heap定義進行操作即可。

這裏值得注意的是,對於掃描整個array的情況下,siftup和siftdown有complexity上的區別。

基本的原因在於:siftdown的complexity,實質上是node相對於bottom移動的次數,而根據binary heap本身的特性,決定了約靠近bottom的node越多;相對照的是siftup,是node相對於root節點的移動次數。

如果Heapify可以用O(n)實現,那麼HeapSort所需的時間複雜度爲何是O(nlogn)?因爲HeapSort其實包含了兩個步驟,第一步,Heapify,build (min) heap,所需時間複雜度O(n),第二步,依次刪除最小值(min heap),對於Heap來說,刪除操作的複雜度是O(logn), 而這個刪除需要執行O(n),來得到最終sort的結果,於是總體時間複雜度是O(nlogn)。

【參考答案】

[www.jiuzhang.com/solutions/heapify/]()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章