1. 程式人生 > 其它 >演算法第四章上機實驗報告

演算法第四章上機實驗報告

實踐題目名稱

最優合併問題

問題描述

題目來源:王曉東《演算法設計與分析》

給定k 個排好序的序列, 用 2 路合併演算法將這k 個序列合併成一個序列。 假設所採用的 2 路合併演算法合併 2 個長度分別為m和n的序列需要m+n-1 次比較。試設 計一個演算法確定合併這個序列的最優合併順序,使所需的總比較次數最少。 為了進行比較,還需要確定合併這個序列的最差合併順序,使所需的總比較次數最多。

演算法描述(貪心選擇性質)

要求最多比較次數和最少比較次數。由於每次合併 2 個長度分別為m和n的序列需要m+n-1 次比較,所以如果想要最多的比較次數,那麼我們要將輸入資料從大到小排序,把每次組成的m+n再跟下一個資料比較,每次都在ans上加m+n-1;由於兩個最大的資料加起來一定大於第三個最大的資料,這裡不用排序,直接往下遍歷即可。

對於想要求最少的比較次數,我們要將輸入資料從小到大排序,並每次在ans上加上m+n-1,把每次組成的m+n放回陣列重新排序,直到沒有數字了

這裡我們可以每次加入完資料後對陣列重新排序(nlogn),也可以用一個小根堆(優先佇列)來維護陣列這樣能保證每次堆頂取出的都是最小的,這樣就減少了排序所要的時間,只需要維護小根堆的時間。

演算法時間及空間複雜度分析

時間:

求最多比較次數只用從大到小遍歷一次,O(n);

求最少比較次數:

若每次排序:O(n^2 logn)

若用優先佇列:O(nlogn)

ps:維護優先佇列插入和刪除的時間複雜度O(logn)

空間:O(n)

對貪心演算法的理解

貪心的每一步都是當前的最優解,所有步驟完成後就是總的最優解。

它有兩個重要性質:貪心選擇性質和最優子結構性質。

貪心選擇性質:指問題的最優解可以通過一系列區域性最優解的選擇得到。

最優子結構性質:指問題的最優解包含其子問題的最優解。

心得體會

優秀的貪心策略能極大的降低程式碼的複雜度,也能減少時間複雜度。

想要對貪心演算法有更深刻的體會一定要多做題,感覺光看思想是遠遠不夠的。

(目前來看,很多貪心都會與排序有關(?))