演算法導論6 2

2022-07-07 15:36:14 字數 1565 閱讀 2912

本小節主要講述了將乙個陣列變成最大堆的過程;

事實上還是比較簡單的,這裡使用了遞迴的方法;

將堆分為左堆和右堆

遞迴地將左堆和右堆變成最大堆

合併左堆和右堆變成整體的最大堆

參照圖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...

演算法導論 隨機演算法

一.概率分布 對於有些問題本身是屬於概率問題,如僱傭問題 對於此類問題,我們需要利用概率分析來得到演算法的執行時間,有時也用來分析其他的量。例如,僱傭問題中的費用問題也需要結合概率分析來計算得到。為了使用概率分析,我們必須使用或者假設已知關於輸入的概率分布,然後通過分析該演算法計算出平均情況下的執行...