分治法与动态规划求解斐波那契数列
来源:互联网 发布:仿中华养生网源码 编辑:程序博客网 时间:2024/06/05 19:33
分治法和动态规划相同点在于二者都需要将原问题划分为一些个子问题,且子问题与原问题一样只是规模更小,然后递归地求解出子问题合并后得到原问题的解。其不同点在于分治法将分解出的子问题看成独立的存在,分别求解(公共子问题存在重复求解),而动态规划将子问题解保存到表格中,遇到公共子问题只需求解一次,以后可以中表格中查找子问题的解。
分治法求解问题分为3步:
分解:将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小;
解决:递归地求解出子问题,如果子问题规模足够小,则停止递归,直接求解出子问题;
合并:将子问题的解组合成原问题的解。
而动态规划求解步骤如下:
刻画一个最优解结构特征;
递归地定义最优解;
计算最优解的值(有自低向上法和带备忘录的自顶向下法);
利用计算出的信息构造出一个最优解。
下面采用分治法和带备忘录的自顶向下的动态规划解决斐波那契数列问题。
1.分治法,求解任意一项n需要将前面n-1项重新求解。
#include <iostream>using namespace std;long fabi2(int n);int main(){int i;for(i=0;i<35;i++){cout <<fabi2(i+1) <<" ";}cout <<endl;return 0;}long fabi2(int n){if (n<=1){return n;}return fabi2(n-1)+fabi2(n-2);}
2.动态规划,用数组记住了前面n-1项的公共子问题的解,求解第n项只需求解子问题n-1然后查找数组中结果进行合并即可
#include <iostream>using namespace std;long fabi1(int n,long *s);int main(){int i;long s[1024];for(i=0;i<1024;i++){s[i]=0;}for(i=0;i<35;i++){cout <<fabi1(i+1,s)<<" ";}cout <<endl;return 0;}long fabi1(int n,long *s){if(n <=1 ){return n;}s[n-1]=fabi1(n-1,s);return s[n-1]+s[n-2];}
下面看看求解斐波那契数列前50项动态规划和分治法时间差异:
两种算法差距相当明显,分治法所用时间为动态规划的百余倍。
- 分治法与动态规划求解斐波那契数列
- 求解斐波那契数列的动态规划方法
- 动态规划的方法求解斐波那契数列
- 动态规划入门之求解斐波那契数列
- 动态规划求解裴波那契数列
- 动态规划-斐波那契数列
- 动态规划--斐波那契数列
- 动态规划斐波那契数列
- 动态规划---斐波那契数列
- 【算法】动态规划法(斐波那契数列)
- 动态规划之斐波那契数列
- C#动态规划计算斐波那契数列
- 斐波那契数列之动态规划
- 动态规划——斐波那契数列
- 从斐波那契数列窥探动态规划
- 动态规划入门-斐波那契数列的计算
- 动态规划8:斐波那契数列
- 70. Climbing Stairs -- 动态规划、斐波那契数列
- PHPCMS V9 网站数据迁移教程
- JAVA设计模式的应用场景
- .NET中的 Http Module
- 跳跃表(Skip List)
- 解决Eclipse启动时闪退问题
- 分治法与动态规划求解斐波那契数列
- C++类型转换总结
- #面试题#前伸后缩法
- 一起来探讨Linux中fork与mutex的混合使用
- IOS 学习之 限定UITEXTField输入字数
- C/C++ 多线程学习心得
- apache2.2.5配置
- Servlet学习(二)__session管理__隐藏域
- 栈队数据结构全集