这个学期开了一门叫算法的课,为了今天的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序列和分治法是编程和算法设计中两个重要的概念。通过结合这两个概念,我们可以学到如何在遇到看似不适合的场景时,创造性地应用算法策略来解决问题。这个作业提供了一个有趣的练习,不仅锻炼了...
* 递归与分治法:递归和分治法是两种常用的解决问题的方法。递归是指将问题分解成小问题然后解决小问题,而分治法是指将问题分解成小问题然后解决小问题。 * Fibonacci 数列:Fibonacci 数列是一个经典的数学数列,...
在IT领域,算法是解决问题的核心工具,而递归与分治策略、动态规划、贪心算法、回溯法、分支限界法以及随机化算法都是其中的重要组成部分。这些算法不仅适用于计算机科学,也在数据结构、优化问题和复杂计算中扮演着...
1. **动态规划法**:动态规划的核心思想是避免重复计算,通过存储子问题的解来构建原问题的最优解。典型的例子有背包问题、最长公共子序列、斐波那契数列等。在“动态规划多阶段决策问题.rar”中,可能会详细介绍...
在C语言中,分治法是一种强大的算法设计策略,它将复杂的问题分解为较小的子问题,然后分别解决这些子问题,最后将结果合并得到原问题的解。递归是实现分治法的一种常见手段,它允许函数调用自身来处理更小规模的...
分治法是一种重要的算法设计策略,它将复杂的问题分解成两个或更多的相同或相似的子问题,直到最后...然而,递归和分治法也可能导致大量的重复计算,因此在实际应用中,通常需要结合记忆化搜索或动态规划等技术来优化。
本压缩包文件包含的五个经典算法分别是分治策略、动态规划和回溯法,这些都是解决复杂问题的重要方法。 首先,分治策略是一种将大问题分解为小问题来解决的方法。它通常包含三个步骤:分解、解决和合并。例如,在C#...
本PPT涵盖了四种基本且极其重要的算法设计策略:贪心算法、动态规划、分治法以及递归。这些算法不仅对于初学者理解计算问题的解决思路至关重要,也是进阶开发者优化代码性能的关键技能。 1. **贪心算法**: 贪心...
二、动态规划法 动态规划是分治法的一种优化,它处理具有重叠子问题的问题。动态规划通过存储和重用已解决的子问题的解,避免了重复计算,提高了效率。以斐波那契数列为例,计算第n项值时,可以利用之前计算的第n-1...
10. **动态规划与其他算法的比较**:动态规划与贪心、分治、回溯等其他算法相比较,各有优缺点,适合解决不同类型的问题。 总之,动态规划是解决复杂问题的强大工具,通过理解并掌握动态规划的原理和应用,可以解决...
动态规划和分治法都是算法设计策略,但它们有显著不同。与分治法相比,动态规划算法通常会枚举所有可能的分割策略,并通过“编程”来避免重复计算共同子问题。这里的“编程”意味着使用表格记录计算结果,而不是...
2. **分治策略**:动态规划与分治法有相似之处,但不同在于动态规划处理子问题时通常不是独立的,而是有序依赖的。子问题的解被用来构建更大的解,直到达到问题的规模。 3. **记忆化搜索**:为了减少重复计算,动态...
- **算法2:动态规划**:使用自底向上的方法,逐层计算最大路径和,最终得到从顶部到底部的最大路径和。 ### 总结 动态规划是一种强大的算法设计策略,特别适用于解决具有最优子结构和重叠子问题的最优化问题。...
分治法是一种处理大问题的策略,它将大问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题,然后递归地解决这些子问题,最后将子问题的解合并得到原问题的解。一个经典的分治例子是快速排序,它通过选取...
- **动态规划与贪心算法、分治算法的关系**:动态规划和贪心算法、分治算法有很多相似之处,但解决问题的侧重点有所不同,动态规划更侧重于问题的最优子结构和重叠子问题的求解。 #### 动态规划的挑战 动态规划的...