貪心算法證明的回憶

關於貪心選擇證明的理解,突然有點想不通了。。。

拿最簡單的活動安排問題,我在想貪心選擇先找f1,然後剩下的2->N逐個找能與之前兼容的活動,按照f 不遞減序排列。如果存在一個最優解,第一個活動是k, 那麼 k後面的活動自然與 f1 兼容,但是k前面的呢,可能就會與s1 f1 不兼容了,記得當年算法書證明這個挺漂亮的,而且考試還考了一道8分的證明。

後來翻翻書,發現證明過程一個橫重要的細節忽視了,不管是貪心解還是 某一個最優解,都要把活動按照f 不遞減排序。所以最優解第一個活動一定是解裏面活動結束最早的,所以剩下的活動必與 F1兼容。

最優子結構其實就是之前DP的剪切技術,假設E是最優解,如果E'=E-{1} 存在一個更優解,替換掉原最優解,則導致一個全局更優的解,這與之前解是最優產生矛盾,然後每一步貪心產生更小規模的子問題,直至最優解導出。


所以思路就是兩步,第一步貪心選擇,一定要找到了一個類似於按照活動結束時間排序這樣一個預處理,然後在此基礎上用替換的方式,發現其他方式產生的最優解最多與貪心產生的最優解一樣,不可能更優,因此可以說貪心解最優,因爲不要求把所有最優解羅列。

第二步,最有子結構,剪切技術,產生與假設想矛盾,因此不存在裏面更優的解。

雖然曹博的PPT,還有扶欄小炒肉大神說過,貪心選擇可能是題目的難點,因爲證明具有這種性質往往是困難的,所以你不知道你想出的一個貪心策略是否可以達到全局最優解。但是一旦弄出來,就是漂亮的算法,Dijstra(一直對於證明有點疑惑), Prim Kruskal HuffmanCode 等等,效率很高

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章