演算法第四章上機實驗報告
實踐題目名稱
最優合併問題
問題描述
題目來源:王曉東《演算法設計與分析》
給定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)
對貪心演算法的理解
貪心的每一步都是當前的最優解,所有步驟完成後就是總的最優解。
它有兩個重要性質:貪心選擇性質和最優子結構性質。
貪心選擇性質:指問題的最優解可以通過一系列區域性最優解的選擇得到。
最優子結構性質:指問題的最優解包含其子問題的最優解。
心得體會
優秀的貪心策略能極大的降低程式碼的複雜度,也能減少時間複雜度。
想要對貪心演算法有更深刻的體會一定要多做題,感覺光看思想是遠遠不夠的。
(目前來看,很多貪心都會與排序有關(?))