计算机解决问题没有奇技淫巧但动态规划还是有点套路.docx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《计算机解决问题没有奇技淫巧但动态规划还是有点套路.docx》由会员分享,可在线阅读,更多相关《计算机解决问题没有奇技淫巧但动态规划还是有点套路.docx(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、计算机解决问题没有奇技淫巧,但动态规划还是有点套路|labuladong来源|labuladongID:labuladong【导读】动态规划算法似乎是一种很高深莫测的算法你会在一些面试或者算法书籍的高级技巧局部看到相关内容什么状态转移方程重叠子问题最优子构造等高大上的词汇可以能让你望而却步。而且当你去看用动态规划解决某个问题的代码时你会觉得这样解决问题竟然如此巧妙但却难以理解你可能惊讶于人家是怎么想到这种解法的。实际上动态规划是一种常见的算法设计技巧并没有什么高深莫测至于各种高大上的术语那是吓唬别人用的只要你亲自体验几把这些名词的含义其实显而易见再简单不过了。至于为什么最终的解法看起来如此精妙
2、是因为动态规划遵循一套固定的流程递归的暴力解法-带备忘录的递归解法-非递归的动态规划解法。这个经过是层层递进的解决问题的经过你假如没有前面的铺垫直接看最终的非递归动态规划解法当然会觉得牛逼而不可及了。当然见的多了考虑多了是可以一步写出非递归的动态规划解法的。任何技巧都需要练习我们先遵循这个流程走算法设计也就这些套路除此之外真的没啥高深的。以下先通过两个个比拟简单的例子斐波那契以及凑零钱问题揭开动态规划的神秘面纱描绘上述三个流程。后续还会写几篇文章讨论怎样使用动态规划技巧解决比拟复杂的经典问题。首先第一个快被举烂了的例子斐波那契数列。请读者不要嫌弃这个例子简单因为简单的例子才能让你把精力充分集中
3、在算法背后的通用思想以及技巧上而不会被那些隐晦的细节问题搞的莫名其妙。后续困难的例子有的是。步骤一、暴力的递归算法PS但凡遇到需要递归的问题最好都画出递归树这对你分析算法的复杂度寻找算法低效的原因都有宏大帮助。这个递归树怎么理解就是讲想要计算原问题f(20)我就得先计算出子问题f(19)以及f(18)然后要计算f(19)我就要先算出子问题f(18)以及f(17)以此类推。最后遇到f(1)或f(2)的时候结果已知就能直接返回结果递归树不再向下生长了。递归算法的时间复杂度怎么计算子问题个数乘以解决一个子问题需要的时间。子问题个数即递归树中节点的总数。显然二叉树节点总数为指数级别所以子问题个数为O(
4、2n)。解决一个子问题的时间在本算法中没有循环只有f(n-1)f(n-2)一个加法操作时间为O(1)。所以这个算法的时间复杂度为O(2n)指数级别爆炸。观察递归树很明显发现了算法低效的原因存在大量重复计算比方f(18)被计算了两次而且你可以看到以f(18)为根的这个递归树体量宏大多算一遍会消耗宏大的时间。更何况还不止f(18)这一个节点被重复计算所以这个算法及其低效。这就是动态规划问题的第一个性质重叠子问题。下面我们想方法解决这个问题。步骤二、带备忘录的递归解法明确了问题其实就已经把问题解决了一半。即然耗时的原因是重复计算那么我们可以造一个备忘录每次算出某个子问题的答案后别急着返回先记到备忘录
5、里再返回每次遇到一个子问题先去备忘录里查一查假如发现之前已经解决过这个问题了直接把答案拿出来用不要再耗时去计算了。一般使用一个数组充当这个备忘录当然你可以以使用哈希表字典思想都是一样的。如今画出递归树你就知道备忘录到底做了什么。实际上带备忘录的递归算法把一棵存在巨量冗余的递归树通过剪枝改造成了一幅不存在冗余的递归图极大减少了子问题即递归图中节点的个数。递归算法的时间复杂度怎么算子问题个数乘以解决一个子问题需要的时间。子问题个数即图中节点的总数由于本算法不存在冗余计算子问题就是f(1),f(2),f(3).f(20)数量以及输入规模n20成正比所以子问题个数为O(n)。解决一个子问题的时间同上没
6、有什么循环时间为O(1)。所以本算法的时间复杂度是O(n)。比起暴力算法是降维打击。至此带备忘录的递归解法的效率已经以及动态规划一样了。实际上这种解法以及动态规划的思想已经差不多了只不过这种方法叫做自顶向下动态规划叫做自底向上。啥叫自顶向下注意我们刚刚画的递归树或讲图是从上向下延伸都是从一个规模较大的原问题比方讲f(20)向下逐渐分解规模直到f(1)以及f(2)触底然后逐层返答复案这就叫自顶向下。啥叫自底向上反过来我们直接从最底下最简单问题规模最小的f(1)以及f(2)开场往上推直到推到我们想要的答案f(20)这就是动态规划的思路这也是为什么动态规划一般都脱离了递归而是由循环迭代完成计算。步骤
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 解决问题 没有 奇技淫巧 动态 规划 还是 有点 套路
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内