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

这周继续dynamic programming,这三个算法都是dynamic programming的。

1.knapsack problem有一种greedy的解法,虽然简单但是不保证正确,这里光头哥讲的是dynamic的解法。其实和上次那个max weight independent set的算法差不多,同样是每个物件都判断一遍有这个物件和没这个物件两种情况,用bottom-up的方法来解,然后得到一个最大的value值,这时因为没有得到具体的选择方案,所以最后还需要一部重构的步骤得到具体方案。

更新:实际上knapsack problem是一个npc问题!我们的dynamic的解法实际上是指数级的,因为我们是把背包的大小拆分成了1+1+1+...来计算的,这样就把背包大小相对于背包大小的位数就变成了指数级的复杂度,当然,即便这样也还是算不慢的。

2.sequence alignment是一种字符串算法,用来比对两个字符串的相似程度的比如说比较aaa和abcdefa的相似程度,那么可以把aaa扩充成aa----a来与abcdef比对,然后按某种得分规则来打分,比如上面这种就是两位相同,四位不同,算是最优的比对方案了。这里我们想要得到最佳得分的比对方案,采用的还是dynamic programming的范式:从最后一位开始,分为a对f,a对-,和-对f三种方案(之前学的mwis和knapsack都是只有两种方案),然后再往前递归,然后bottom-up,然后重构。其实过程差不多。

3.optimal binary search trees要解决的问题和huffman code有点像,一般来说你用红黑树这种balanced search tree来储存数据,那么搜索数据的时候基本可以保证得到lg(n)的速度。但是如果知道搜索每个数据的频率,想要依次进一步优化bst的话,那么就需要构造optimal bst。这里构造的方法还是dynamic programming。这里要处理的base case就非常多了,思路也比较复杂,但是大体思路还是一样的。最后得到一个O(n^3)的算法...囧。这算法在算法导论上有详细讲解,如果有需要的话以后可以看看。

转载于:https://www.cnblogs.com/dynasty919/p/8520228.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值