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

Posted dynasty919

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018.3.5-6 knapsack problem, sequence alignment and optimal binary search trees相关的知识,希望对你有一定的参考价值。

这周继续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的主要内容,如果未能解决你的问题,请参考以下文章

knapsack() 向量长度问题

如何在 KnapSack 问题中显示所有包含的数字?

CodeForces - Problem 1446 - Knapsack - 思维

修改了 KnapSack 运行时错误

c_cpp 0-1Knapsack

c_cpp 01 KnapSack