`
zeng1990
  • 浏览: 52064 次
  • 性别: 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
分享到:
评论

相关推荐

    算法设计 蛮力法 分治法 动态规划 贪心算法 分支限界法 回溯法 近似算法 减制法

    下面将详细讲解标题和描述中提及的八种算法设计方法:蛮力法、分治法、动态规划、贪心算法、分支限界法、回溯法、近似算法以及减制法。 1. **蛮力法(Brute Force)**: 蛮力法是最直观的解决问题的方法,通常通过...

    算法代码(回溯法,动态规划,分治法,贪心)

    这个压缩包文件包含了四种基本的算法实现:回溯法、动态规划、分治法和贪心算法。这些都是计算机科学中极其重要的概念,对于理解和解决复杂问题至关重要。 1. **回溯法**:回溯法是一种试探性的解题策略,它尝试...

    数据结构与算法-五大常用算法总结(分治法,回溯法,分治限界法,贪心算法,动态规划法),算法数据结构

    本文主要总结了五大常用算法,包括分治法、回溯法、分治限界法、贪心算法以及动态规划法。 1. 分治法(Recurrence and Divide-Conquer) 分治法是一种将大问题分解为小问题进行解决的策略。它适用于可以分解成独立...

    动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

    分治法通常处理独立的子问题,而动态规划则关注于子问题之间的重叠,避免重复计算,通过存储和复用已解的子问题来提高效率。 动态规划的基本步骤包括以下几个方面: 1. **最优解的性质刻画**:首先,我们需要明确...

    算法分析课件(堆和不相交数据结构,归纳法,分治法,动态规划,贪心算法,回溯法)

    本课件主要涵盖了六种重要的算法设计策略:堆和不相交数据结构、归纳法、分治法、动态规划、贪心算法以及回溯法。这些算法在解决复杂问题时扮演着至关重要的角色。 首先,我们来探讨堆和不相交数据结构。堆是一种...

    Fibonacci序列 分治法——C语言代码

    总的来说,Fibonacci序列和分治法是编程和算法设计中两个重要的概念。通过结合这两个概念,我们可以学到如何在遇到看似不适合的场景时,创造性地应用算法策略来解决问题。这个作业提供了一个有趣的练习,不仅锻炼了...

    (动态规划-分治法-贪心法-回溯法)算法练习题

    * 递归与分治法:递归和分治法是两种常用的解决问题的方法。递归是指将问题分解成小问题然后解决小问题,而分治法是指将问题分解成小问题然后解决小问题。 * Fibonacci 数列:Fibonacci 数列是一个经典的数学数列,...

    算法分析 递归与分治策略 动态规划 贪心算法 分支限界法 随机化算法等算法

    在IT领域,算法是解决问题的核心工具,而递归与分治策略、动态规划、贪心算法、回溯法、分支限界法以及随机化算法都是其中的重要组成部分。这些算法不仅适用于计算机科学,也在数据结构、优化问题和复杂计算中扮演着...

    suanfafenxi.rar_动态规划法

    1. **动态规划法**:动态规划的核心思想是避免重复计算,通过存储子问题的解来构建原问题的最优解。典型的例子有背包问题、最长公共子序列、斐波那契数列等。在“动态规划多阶段决策问题.rar”中,可能会详细介绍...

    c语言分治法求众数重数-五大常见算法策略之——递归与分治策略,算法数据结构

    在C语言中,分治法是一种强大的算法设计策略,它将复杂的问题分解为较小的子问题,然后分别解决这些子问题,最后将结果合并得到原问题的解。递归是实现分治法的一种常见手段,它允许函数调用自身来处理更小规模的...

    算法与程序设计:第2章 分治法.ppt

    分治法是一种重要的算法设计策略,它将复杂的问题分解成两个或更多的相同或相似的子问题,直到最后...然而,递归和分治法也可能导致大量的重复计算,因此在实际应用中,通常需要结合记忆化搜索或动态规划等技术来优化。

    c#精典五大算法 分治,动态规划,回溯法

    本压缩包文件包含的五个经典算法分别是分治策略、动态规划和回溯法,这些都是解决复杂问题的重要方法。 首先,分治策略是一种将大问题分解为小问题来解决的方法。它通常包含三个步骤:分解、解决和合并。例如,在C#...

    算法分析的PPT(贪心,动态规划,分治,递归)

    本PPT涵盖了四种基本且极其重要的算法设计策略:贪心算法、动态规划、分治法以及递归。这些算法不仅对于初学者理解计算问题的解决思路至关重要,也是进阶开发者优化代码性能的关键技能。 1. **贪心算法**: 贪心...

    五大算法基本思想—分治,动态规划,贪心,回溯,分支界限,算法数据结构

    二、动态规划法 动态规划是分治法的一种优化,它处理具有重叠子问题的问题。动态规划通过存储和重用已解决的子问题的解,避免了重复计算,提高了效率。以斐波那契数列为例,计算第n项值时,可以利用之前计算的第n-1...

    计算机编程算法的动态规划问题

    10. **动态规划与其他算法的比较**:动态规划与贪心、分治、回溯等其他算法相比较,各有优缺点,适合解决不同类型的问题。 总之,动态规划是解决复杂问题的强大工具,通过理解并掌握动态规划的原理和应用,可以解决...

    算法设计与分析:2-Lec6 .pdf

    动态规划和分治法都是算法设计策略,但它们有显著不同。与分治法相比,动态规划算法通常会枚举所有可能的分割策略,并通过“编程”来避免重复计算共同子问题。这里的“编程”意味着使用表格记录计算结果,而不是...

    刘汝佳动态规划经典课件

    2. **分治策略**:动态规划与分治法有相似之处,但不同在于动态规划处理子问题时通常不是独立的,而是有序依赖的。子问题的解被用来构建更大的解,直到达到问题的规模。 3. **记忆化搜索**:为了减少重复计算,动态...

    算法导论 动态规划

    - **算法2:动态规划**:使用自底向上的方法,逐层计算最大路径和,最终得到从顶部到底部的最大路径和。 ### 总结 动态规划是一种强大的算法设计策略,特别适用于解决具有最优子结构和重叠子问题的最优化问题。...

    分治递归动态规划贪心常用算法实例

    分治法是一种处理大问题的策略,它将大问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题,然后递归地解决这些子问题,最后将子问题的解合并得到原问题的解。一个经典的分治例子是快速排序,它通过选取...

    动态规划练习题目!!

    - **动态规划与贪心算法、分治算法的关系**:动态规划和贪心算法、分治算法有很多相似之处,但解决问题的侧重点有所不同,动态规划更侧重于问题的最优子结构和重叠子问题的求解。 #### 动态规划的挑战 动态规划的...

Global site tag (gtag.js) - Google Analytics