演算法導論習題解 第16章貪心演算法

2021-06-22 22:46:35 字數 1367 閱讀 2613

習題編號以第三版為準。

對於活動選擇問題,並不是所有貪心方法都能得到最大相容活動子集。請舉例說明,每次選擇時間最短者,或最早開始者,或重疊的活動數量最小者,均不能得到最優解。

使用最少的教室完成所有活動。用頂點表示活動,不相容的活動之間有一條邊。使用最少的顏色對頂點著色,使得任意邊的兩端顏色均不相同。(interval-graph color problem)

解:見algorithm design by kleinberg 4.1節最後。思考:容易將活動問題轉化為頂點著色問題,如何將頂點著色轉化成活動問題?因為頂點上並沒有時間順序。

每個活動a[i]除了起止時間,還有乙個價值v[i]。求價值最大的相容活動子集,要求多項式時間。

解:參考課本中對原始問題的討論,令s[i,j]表示在活動a[i]結束之後開始,且在a[j]開始之前結束的那些活動。考慮s[i,j]之中的乙個活動a[k],則s[i,j] = s[i,k] + a[k] + s[k,j],動態規劃可解。效率o(n * n)。

解:見instructor's manual,關鍵思想:使用線性時間的中位數演算法。

取對數之後就變成了這樣乙個問題,兩個陣列a和b,各包含n個數,排列a和b中的元素,使得sum(a[i]*b[i])最大。

解:將a和b降序排列(或公升序)。首先證明n=2的情況。然後假設a已經公升序排列,b並沒有公升序排列,那麼一定存在ib[j],則交換b[i]和b[j]將得到更大的結果。擴充套件:如果要求sum(a[i]*b[i])最小,則可以將a公升序,b降序排列。(《挑戰程式設計競賽》2.7.1)

假設有字母表c=上的乙個最優字首碼,希望用最少的二進位制位傳輸此編碼。說明如何僅用2n-1+nlg(n)位表示此字首碼。

解:使用2n-1位表示樹的結構,內部節點用1表示,葉子節點用0。用nlg(n)位傳送字母序列,每個字母占用lg(n)位。答案來自ustc answer。

假設乙個檔案由8位字元組成,所有256個字元的頻率大致相同,最高頻率也低於最低頻率的2倍。證明此時霍夫曼編碼並不優於定長編碼。

解:證明此時的字首樹是一棵滿二叉樹。從最底層證起,最底層是兩兩配對的,且沒有任何一對的頻率超過另外一對的2倍。

o(nk)時間的找零演算法,硬幣面值為c1,c2, ...,ck,且c1=1,找零n分。

解:假設b(n)表示找零n美分需要的最少硬幣數,硬幣面值為c1,c2, ...,ck,則b(n)=1如果n等於某個ci,否則b(n) = 1 + min

解:見algorithm design by kleinberg 4.3節,證明較為複雜。

演算法導論 第16章 貪心演算法

結論貪心演算法,顧名思義,貪心就完事了。對於這種抽象的演算法,我的一貫想法是通過例項將其具體化。下面給出乙個例子,好好感受 上題的解如下 鈔票支付問題 動態規劃法也可解 對於此問題需要注意的是,貪心法可能得出最優也可能無法得出全域性最優,這取決於硬幣的種類 include include using...

第16章 貪心演算法

求解最優化問題的演算法通常需要經過一系列的步驟,在每個步驟都面臨多重選擇,動態規劃演算法是通過比較這麼多選擇來得到乙個最優的選擇,而貪心演算法不用比較而是直接選出當時看起來最佳的選擇,通過做出區域性最優的選擇來得到全域性最優解。設計貪心演算法有如下三個步驟 證明貪心選擇是最優解的一部分 證明做出貪心...

演算法導論 13 貪心演算法

與動態規劃類似,貪心演算法也將問題化簡為規模較小的子問題,並通過遞迴解決子問題來獲取整個問題的解。不同的是,貪心問題不對子問題進行比較,而是只生成乙個非空的子問題,而使選擇在當時看上去是最優的 即 貪心 的含義 幾個互相競爭的活動都要求以獨佔的方式占用某個公用資源 如選修課程對個人可支配時間的要求,...