`
zeng1990
  • 浏览: 51449 次
  • 性别: Icon_minigender_1
  • 来自: 桂林
社区版块
存档分类
最新评论

斐波那契数:动态规划法和分治法

阅读更多
这个学期开了一门叫算法的课,为了今天的ITAT复赛,这两天研究了一下这门课。感觉算法真的是太神奇了。就比如说今天学了动态规划(小小的入门)。用它实现了斐波那契数,和原来的用分治法的一比较,差距出来了。相差十几几万倍(要算的数越大相差的倍数越多)。下面是实现:
#include <iostream>
#include <ctime>

using namespace std;

/*
* 动态规划法实现
*/
int f(int n, int a[])
{
	if (n < 0)
	{
		return 0;
	}
	if (n == 0 || n == 1)
	{
		return n;
	}
	else
	{
		/* 计算f(n-1) 与已经计算过的f(n-2)=a[n-2]*/
		// 如果febonacci函数中没有for语句的事先填表
		// 可以用a[n] = a[n-1] + a[n-2];实现动态填表
		return f(n-1,a) + a[n-2];
	}
}

/*
* 填表函数
*/
int febonacci(int n)
{
	int a[1000] = {0};
	a[0] = 0;
	a[1] = 1;
	/* 自底向上填表 */
	for (int i = 2; i <= n; i++)
	{
		a[i] = a[i-1] + a[i-2];
	}

	int sum = f(n,a);

	return sum;
}

/*
* 分治法实现
*/
int f2(int n)
{
	if (n == 0 || n == 1)
	{
		return n;
	}
	else
	{
		return f2(n-1) + f2(n-2);
	}
}

int main()
{
	time_t begin1,end1;
	time_t begin2,end2;

	// 斐波那契数的阶数
	int i = 33;

	begin1 = time(NULL);
	int sum1 = 0;
	// 计算100万次
	for(int k = 0; k < 1000000; k++)
	{
		sum1 = febonacci(i);
	}
		
	cout<<"sum1:"<<sum1<<endl;
	end1 = time(NULL);
	cout<<"Time:"<<end1 - begin1<<endl<<endl;
	
	begin2 = time(NULL);
	int sum2 = 0;
	// 计算100次
	for (int m = 0; m < 100; m++)
	{
		sum2 = f2(i);
	}	
	cout<<"sum2:"<<sum2<<endl<<endl;
	end2 = time(NULL);
	cout<<"Time:"<<end2 - begin2<<endl;

	return EXIT_SUCCESS;
}

运行结果:

  • 大小: 7.9 KB
分享到:
评论

相关推荐

    算法导论(part1)

    它深入浅出地介绍了大量的算法及相关的数据结构,以及用于解决一些复杂计算问题的高级策略(如动态规划、贪心算法、平摊分析等),重点在于算法的分析和设计。对于每一个专题,作者都试图提供目前最新的研究成果及样例...

    我用Python写的一些算法

    使用分治法的最大子数组(应该算成分治法) 使用自底向上方法实现的最大子数组 使用动态规划的两种方式实现的LCS(最大公共串)(下面的算法都会使用动态规划的两种方式来实现) 加权有向无环图中最短路径和最长路径...

    算法分析与设计实验代码.cpp

    动态规划法在图问题中的应用——全源最短路径问题 99. 退出本实验 ------------------------- 请输入您所要执行的操作(1,2,3,4,5,99): 2)点击操作后进入相应的实验项目...

    算法导论(第二版 中文高清版)

    2.3.1 分治法 2.3.2 分治法分析 第3章 函数的增长 3.1 渐近记号 3.2 标准记号和常用函数 第4章 传归式 4.1 代换法 4.2 递归树方法 4.3 主方法 4.4 主定理的证明 4.4.1 取正合幂时的证明 4.4.2 上取整函数和下取整...

    算法导论 第二版

    2.3.1 分治法 2.3.2 分治法分析 第3章 函数的增长 3.1 渐近记号 3.2 标准记号和常用函数 第4章 传归式 4.1 代换法 4.2 递归树方法 4.3 主方法 4.4 主定理的证明 4.4.1 取正合幂时的证明 4.4.2 上取整函数和下取整...

    算法导论 第二版 (完整版)

    2.3.2 分治法分析 第3章 函数的增长 3.1 渐近记号 3.2 标准记号和常用函数 第4章 传归式 4.1 代换法 4.2 递归树方法 4.3 主方法 4.4 主定理的证明 4.4.1 取正合幂时的证明 4.4.2 上取整函数和下取整函数 第5章 概率...

    算法设计与分析PPT(C语言完整版)

    4.5.3突出阶段性的动态规划应用 4.5.4突出递推的动态规划应用 4.6算法策略间的比较 4.6.1不同算法策略特点小结 4.6.2算法策略间的关联 4.6.3算法策略侧重的问题类型 习题 第5章图的搜索算法 5.1图搜索概述 5.1.1图...

    计算机算法分析与设计实验源代码共计五个程序

    动态规划法在图问题中的应用——全源最短路径问题 3. 实验要求 (1)实现Floyd算法; (2)算法的输入可以手动输入,也可以自动生成; (3)算法不仅要输出从每个顶点到其他所有顶点之间的最短路径,还有输出最短...

    Algrotihem_boxed.exe

    算法分析课设,包括斐波那契(递归、迭代、公式),堆排序(随机生成数),矩阵相乘(蛮力法,分块法),假硬币(分治法找不同硬币),动态规划(查找传递闭包),QT可视化,源码私聊。

    数据结构和算法必知必会的50个代码实现

    ## 数组* 实现一个支持动态扩容的数组* 实现一个大小固定的有序数组,支持动态增删改操作* 实现两个有序数组合并为一个有序数组 ## 链表* 实现单链表、循环链表、双向链表,支持增删操作* 实现单链表反转* 实现两个...

    算法导论(part2)

    它深入浅出地介绍了大量的算法及相关的数据结构,以及用于解决一些复杂计算问题的高级策略(如动态规划、贪心算法、平摊分析等),重点在于算法的分析和设计。对于每一个专题,作者都试图提供目前最新的研究成果及样例...

    算法导论中文版

     2.3.1 分治法  2.3.2 分析分治算法  思考题  本章注记 第3章 函数的增长  3.1 渐近记号  3.2 标准记号与常用函数  思考题  本章注记 第4章 分治策略  4.1 最大子数组问题  4.2 矩阵乘法的...

    leetcode答案-leetcode:一个星期日穿leetcode

    动态规划:背包问题、最长子序列、计数问题 基础技巧:分治、倍增、二分、贪心 数据结构 - Data Structures 数组与链表:单 / 双向链表、跳舞链 栈与队列 树与图:最近公共祖先、并查集 哈希表 堆:大 / 小根堆、可...

    数据结构与算法分析 Java语言描述第2版

    算法设计技巧10.1 贪婪算法10.1.1 一个简单的调度问题10.1.2 哈夫曼编码10.1.3 近似装箱问题10.2 分治算法10.2.1 分治算法的运行时间10.2.2 最近点问题10.2.3 选择问题10.2.4 一些算术问题的理论改进10.3 动态规划...

    数据结构与算法分析_Java语言描述(第2版)

    10.3 动态规划 10.3.1 用一个表代替递归 10.3.2 矩阵乘法的顺序安排 10.3.3 最优二叉查找树 10.3.4 所有点对最短路径 10.4 随机化算法 10.4.1 随机数发生器 10.4.2 跳跃表 10.4.3 素性测试 10.5 回溯算法 10.5.1 ...

    数据结构与算法分析_Java语言描述(第2版)]

    算法设计技巧10.1 贪婪算法10.1.1 一个简单的调度问题10.1.2 哈夫曼编码10.1.3 近似装箱问题10.2 分治算法10.2.1 分治算法的运行时间10.2.2 最近点问题10.2.3 选择问题10.2.4 一些算术问题的理论改进10.3 动态规划...

    数据结构与算法分析C描述第三版

     10.3 动态规划   10.3.1 用表代替递归   10.3.2 矩阵乘法的顺序安排   10.3.3 最优二叉查找树   10.3.4 所有点对最短路径   10.4 随机化算法   10.4.1 随机数生成器   10.4.2 跳跃表   ...

    Data-Structure:《数据结构与算法分析》上的代码实现

    d# Data-Structure ##代码内容 《数据结构与算法分析》上的代码实现, 按照该书的章节顺序,主要实现书上给出的例子。 ##已经实现: ...-动态规划:斐波那契数列,递归关系,矩阵乘法顺序,最优搜索二叉树 -随

    数据结构与算法分析_Java_语言描述

    10.3 动态规划 10.3.1 用表代替递归 10.3.2 矩阵乘法的顺序安排 10.3.3 最优二叉查找树 10.3.4 所有点对最短路径 10.4 随机化算法 10.4.1 随机数发生器 10.4.2 跳跃表 10.4.3 素性测试 10.5 回溯...

Global site tag (gtag.js) - Google Analytics