您的位置:首页 > 其它

动态规划理解

2009-02-16 20:29 204 查看
动态规划是一种算法,算法导论将其列入高级算法类。
而其实高不高级在于你有没有理解它。
动态规划主要用于在很多解法中寻找最优解,比如著名的背包问题,地上几个宝石,宝石的重量和价值都各不相同,你的背包只能装5斤,反正是装不完所有的宝石,这个时候你怎么装才能价值最大。
动态规划的思想就是先拿起第一个,然后确定拿不拿第2个,拿不拿第2个又取决于拿不拿第3个,整个就是一个递归的过程,最后只剩一个的时候,到达了递归的边界,于是哗啦啦逆向把前面所有的结果算出来。最终能够得到到底要拿哪些。
说的专业点,就是把一个大问题拆分成很多小问题,小问题再拆成更小的问题,到最后一个的时候,拆不动了,可以直接做出选择,于是前面的问题也就也就全部解决了。
说白了,实际就是把所有可以拿的可能性都遍历了一遍,自然能够选择出最好的了。
那我直接遍历就可以了,到底为什么要用这种方式呢,把问题拆成小问题的过程中,其实还有一个步骤,我们一直在不停缓存问题的结果,当下次再遇到这个小问题的时候(在拆分的过程中,会多次遇到同一个问题),就可以直接得到结果,于是大大提高了计算的速度。
可能我对算法描述得不是很清楚,网上也有很多介绍,有兴趣的同志可以自己去看一下。
而我这里要说的关键问题,也就是我写这个文章的目的,动态规划算法的精髓在什么地方,其实很简单,第一:拆分,第二:缓存。
就拿做应用来说,我们学习设计模式,在架构上进行分层,调用一个函数的时候这个函数又去调用很多子函数,靠这些子函数的结果来组合成上层想要的结果,不正是动态规划中的拆分吗。
为什么要拆分,在算法上来说,是为了缓存结果,以提高计算的速度,在设计上来说,还为了提高代码的可读性,可维护性等等。
说白了,我们做程序不停分层,方法调用方法,就是为了两个目的,第一个,提高代码质量(可读,可维护),第二个,在性能出现问题的时候,方便做缓存(不拆分就不方便做缓存)。
所以,动态规划教会你一种比较高级的(也是比较面向过程的)拆分方式,但是,它的本质还是拆分,缓存。所以当你看到本质的时候,它就没什么神秘的了,我们天天都在用动态规划的思想做事情,只是我们不知道。
所以,不管是面向过程还是面向对象,都是程序,没有任何区别,程序永远按照同一种方式在运行着,我们解决问题的思路还是没有变,什么语言,什么思想都是都是表面的东西,编程的精髓在于程序员解决问题的思路。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: