1. 程式人生 > >2018.3.5-6 knapsack problem, sequence alignment and optimal binary search trees

2018.3.5-6 knapsack problem, sequence alignment and optimal binary search trees

clas c program bin 方法 ali abc cde ack 得到

這周繼續dynamic programming,這三個算法都是dynamic programming的。

knapsack problem有一種greedy的解法,雖然簡單但是不保證正確,這裏光頭哥講的是dynamic的解法。其實和上次那個max weight independent set的算法差不多,同樣是每個物件都判斷一遍有這個物件和沒這個物件兩種情況,用bottom-up的方法來解,然後得到一個最大的value值,這時因為沒有得到具體的選擇方案,所以最後還需要一部重構的步驟得到具體方案。

sequence alignment是一種字符串算法,用來比對兩個字符串的相似程度的比如說比較aaa和abcdefa的相似程度,那麽可以把aaa擴充成aa----a來與abcdef比對,然後按某種得分規則來打分,比如上面這種就是兩位相同,四位不同,算是最優的比對方案了。這裏我們想要得到最佳得分的比對方案,采用的還是dynamic programming的範式:從最後一位開始,分為a對f,a對-,和-對f三種方案(之前學的mwis和knapsack都是只有兩種方案),然後再往前遞歸,然後bottom-up,然後重構。其實過程差不多。

optimal binary search trees要解決的問題和huffman code有點像,一般來說你用紅黑樹這種balanced search tree來儲存數據,那麽搜索數據的時候基本可以保證得到lg(n)的速度。但是如果知道搜索每個數據的頻率,想要依次進一步優化bst的話,那麽就需要構造optimal bst。這裏構造的方法還是dynamic programming。這裏要處理的base case就非常多了,思路也比較復雜,但是大體思路還是一樣的。最後得到一個O(n^3)的算法...囧。這算法在算法導論上有詳細講解,如果有需要的話以後可以看看。

2018.3.5-6 knapsack problem, sequence alignment and optimal binary search trees