本小節主要講述了將乙個陣列變成最大堆的過程;
事實上還是比較簡單的,這裡使用了遞迴的方法;
將堆分為左堆和右堆
遞迴地將左堆和右堆變成最大堆
合併左堆和右堆變成整體的最大堆
參照圖6-2的方法,說明\(max-heapify(a, 3)\)在陣列\(a=<27, 17, 3, 16, 13, 10, 1, 5, 7, 12, 4,8, 9, 0>\)上的操作過程。這個還是很簡單的,但是畫圖太累了,略
參考過程\(max-heapify\),寫出能夠維護相應最小堆的\(min-heapify(a, i)\)的偽**,並比較兩者的執行時間。
min-heapify(a, i)
l = left(i)
r = right(i)
if l <= a.heap-size and a[l] < a[i]
largest = l
else largest = i
if r <= a.heap-size and a[r] < a[largest]
largest = r
if largest != i
exchange a[i] with a[largest]
min-heapify(a, largest)
執行時間應該是一致的。
當元素\(a[i]\)比其子節點的值都大時,呼叫\(max-heapify(a, i)\)會有什麼結果?因為\(a[i]\)已經是子樹中的最大值,所以不會有任何變化。
當\(i>a.heap-size/2\)時,呼叫\(max-heapify(a, i)\)會有什麼結果?其子結點的序號超出了堆的大小,程式將視為其子結點不存在,所以不會進行堆化操作。
\(max-heapify\)的**效率較高,但第10行中的遞迴呼叫可能例外,它可能使某些編譯器產生低效的**。請用迴圈控制結構取代遞迴,重寫\(max-heapify\)**。
max-heapify (a, i)
while i < a.heapsize
left = left(i)
right = right(i)
if left < a.heapsize && a[left] > a[i]
max_index = left
else
max_index = i
if right < a.heapsize && a[right] > a[max_index]
max_index = right
if max_index != i
exchange a[max_index] and a[i]
else
return;
最壞情況就是從根節點一直呼叫到葉子節點,也就是樹高\(\lg\),所以最壞執行時間為\(\omega(\lg)\)。
演算法導論 6 2 d叉堆
問題 d叉堆性質與二叉堆相似,但其每個非葉子結點有d個孩子 1 如何在乙個陣列中表示乙個d叉堆?2 包含n個元素的d叉堆的高度是多少?3 給出 extract max在d叉堆的有效實現,並用d與n表示其時間複雜度.4 給出insert在d叉堆的有效實現,並用d與n表示其時間複雜度.5 給出incre...
演算法導論第六章堆排序6 2
6.2 1 第一遍交換10和3 第二遍交換10和9 6.2 2 6.2 2 min heapify a,i 1 l left i 2 r right i 3 if l heap size a and a l a i 4 then smallest l 5 else smallest i 6 if r...
演算法導論 隨機演算法
一.概率分布 對於有些問題本身是屬於概率問題,如僱傭問題 對於此類問題,我們需要利用概率分析來得到演算法的執行時間,有時也用來分析其他的量。例如,僱傭問題中的費用問題也需要結合概率分析來計算得到。為了使用概率分析,我們必須使用或者假設已知關於輸入的概率分布,然後通過分析該演算法計算出平均情況下的執行...