数据结构与算法(邓俊辉清华大学2013版书)学习笔记3-绪论-动态规划

       什么叫做动态规划?

       动态规划是一种通过“大而化小”的思路解决问题的算法。区别于一些固定形式的算法,如二分法,宽度优先搜索法,动态规划没有实际的步骤来规定第一步做什么第二步做什么。所以更加确切的说,动态规划是一种解决问题的思想。这种思想的本质是,一个规模比较大的问题(假如用2-3个参数可以表示),是通过规模比较小的若干问题的结果来得到的(通过取最大,取最小,或者加起来之类的运算)所以我们经常看到的动态规划的核心——状态转移方程都长成这样:

* f[i][j] = f[i - 1][j] + f[i][j - 1]

* f[i] = max{f[j] if j < i and …} + 1

* f[i][j] = f[0][j - 1] && judge(1,i) || f[1][j - 1] && judge(2,i) || …

    关于Fib数列的算法,下面这个算法的时间复杂度的计算,用递推方程,得到是指数复杂度,而指数复杂度的算法属于实际不可行的算法。及其封底估算,运行第43个fib数需要1秒(在主频是10的9次方的情况下),而运行第67个数需要1天啦,而第92个需要三个世纪。

优化策略:



分别在时间复杂度上,o(2的n次) 变成o(n),空间复杂度则有动态规划策略解决了,是o(1)。

递归虽然可以帮助我们很好的找到一个可行且正常的解,但是,如果将效率提高,让之变成一个实用的算法的话,还需要进一步调试,而在这过程中。动态规划扮演着非常重要的角色。

用动态规划求解输入序列长度分别为m,n的LCS问题,时间复杂度为:由o(2的n次方)变到o(m+n)



但是我没有明白这个动态规划策略的思想,感觉不知道怎么做这个表。。。脑袋好麻木。。


猜你喜欢

转载自blog.csdn.net/qq_37791134/article/details/80028320