数据结构学习笔记:关于DSC设计与优化的设计与优化---动态规划

一个好的算法需要满足三个条件:
(1)算法可以正常工作
(2)算法的正确性可以得以保证
(3)算法要能足够快

一般的递归算法确实能很好的满足前两个条件,但是或许它并不够快,甚至有些问题在递归算法下导致内存和程序的崩溃,就是因为计算的太慢了,这时我们可以用迭代算法,虽然之前讲过递归算法比迭代更有效率,但是在某些问题的情况下,迭代算法是比递归更加有效的,不容易导致崩溃!

下面举个实例看一下:
斐波那锲数:
首先让我们用递归去实现该问题:
在这里插入图片描述虽然用递归也是正确的,但是当n很大时,该算法就特别慢!!。甚至导致电脑崩溃!
那为什么用递归就真么慢呢?我们可以通过复杂度的角度去分析,通过上面的分析可以看出,只用递归的方法的复杂度呈现指数复杂度,这是最不能接受的复杂度,所以当n越大时,就特别慢,通过计算可以得出:当n为67时,需要计算一天;当n为97时,需要等待三个世纪那么久,特别夸张,因此这已经不能够称之为一个算法了!

那么为什么递归版本的斐波那锲数效率这么低呢?
原因在于各个递归实例均被大量重复地调用!!!

那么改进方法是什么呢?
(1)记忆法:将已经计算过的实例的结果制表备查,可以避免重复地调用
(2)动态规划法:由自顶而下递归,为自底而上迭代

f=0;g=1;
while(0<n--)
{
   g=g+f;
   f=g-f;
}
return g;

这种改进的算法时间复杂度T(n)=O(n),空间复杂度仅为O(1)!!!!
而原来的递归版本不仅时间复杂度为指数,空间复杂度也为O(n)!!!

猜你喜欢

转载自blog.csdn.net/Peter_Red_Boy/article/details/89639172