这周继续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)的算法...囧。这算法在算法导论上有详细讲解,如果有需要的话以后可以看看。