算法学习-第0篇 从Fibonacci开始

学习资源《Algorithms》,作者S.Dasgupta,C.H.Papadimitriou,and U.V.Vazirani。

电子版可到资源库中下载http://download.csdn.net/detail/segen_jaa/7900765

1、问题描述

Fibonacci数列想必大家都比较熟悉,后一位数字是前两位的和。

0,1,1,2,3,5,8,13,21,34

对应公式如下。

求第n位的Fibonacci数为多少?

2、迭代算法

实现语言:C语言。

win32程序下,计算Fibonacci数。

45位:1134903170

46位:1836311903

47位:-1323752223

计算到第47位long型已经不支持,故测试程序约定在50位以内。

#include "stdafx.h"
#define MAX_NUM 50

long fib1(int n)
{
	if (0 == n) return 0;
	if (1 == n) return 1;

	return fib1(n-1)+fib1(n-2);
}

int _tmain(int argc, _TCHAR* argv[])
{
	while(true)
	{
		int input = 0;
		printf("please input fibonacci number:");
		scanf("%d", &input);

		if (input>MAX_NUM)
		{
			printf("please input number less than %d", MAX_NUM);
			continue;
		}

		if (input<0)
		{
			break;
		}

		int result1 = fib1(input);
		printf("fib1 result:%d\n", result1);
	}

	return 0;
}

3、迭代算法分析

三个问题

①算法是否正确?

②算法复杂度多少?

③算法能否改进?

对应回答:

①实现完全按照定义公式,正确性没有疑问。

②看到递归,大家应该都知道了,这个算法时间复杂度有点高。

一次加减操作复杂度都为1,那么T(n)=T(n-1)+T(n-2)+3。

经过计算T(n)值≈

出现指数计算法,那么这个算法可以宣告失败了。这意味着计算机性能每提高1.6倍,只往前多计算出一位。

在这种算法下,大家可以在自己机器上试一下计算要多久。本机cpu i7测试,推算第50位接近1小时时间。如果要同样时间计算出第51位,只能等到i8、i9了。

③若要对算法进行改进,则首先分析为何复杂度如此高。

递归调用的过程如下。

可以看到同一个数被重复计算了多次。以F(n-3)为例,在下图中被计算了三次。那么我们的改进思路就从这里入手,已计算过的数字就缓存起来。

4、改进算法

#include "stdafx.h"
#define MAX_NUM 50

long fib2(int n)
{
	long array[MAX_NUM];
	array[0] = 0;
	array[1] = 1;

	for (int i=2; i<=n; ++i)
	{
		array[i] = array[i-1]+array[i-2];
	}

	return array[n];
}

int _tmain(int argc, _TCHAR* argv[])
{
	while(true)
	{
		int input = 0;
		printf("please input fibonacci number:");
		scanf("%d", &input);

		if (input>MAX_NUM)
		{
			printf("please input number less than %d", MAX_NUM);
			continue;
		}

		if (input<0)
		{
			break;
		}

		int result2 = fib2(input);
		printf("fib2 result:%d\n", result2);
	}

	return 0;
}

同样的问题

①算法是否正确?

答:正确。

②算法复杂度多少?

答:复杂度O(n)。

③算法能否改进?

答:性能已为线性,可不再改进。

时间: 2024-10-13 17:50:39

算法学习-第0篇 从Fibonacci开始的相关文章

算法学习-1 预备篇

最近开始我的算法学习,打算以<算法>(第4版)为基础来学习.“工欲善其事必先利其器”,作者自己开发了类库应用在书中的程序中,所以必须先在书的配套网站上下载相应的jar包,然后导入到eclipse中去. 首先,要打开书籍的官网http://algs4.cs.princeton.edu/home/,在左侧WEB RESOURCES栏下,单击code,在弹出的页面,会发现一大段中高亮的algs4.jar,单击,然后就开始下载.书中的I/O类都包含在了这个jar包中了. 下面把algs4.jar导入到

算法学习#02--斐波那契Fibonacci数列算法优化

算法列表 本文从时间效率和占用空间内存角度评估,找出最优算法. 经典递归算法Recursive algorithm(很慢) 动态存储算法Dynamic programming(慢) 矩阵幂算法Matrix exponentiation(快) 倍数公式算法Fast doubling(很快) 倍数公式算法+快速乘法Fast doubling with Karatsuba(最快) Fibonacci数列 1.数列介绍 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂

数据结构与算法学习 第0季 学前入门

2015年学习计划安排: http://www.cnblogs.com/cyrus-ho/p/4182275.html 数据结构:计算机内部数据的组织形式和存储方法.(不同的数据结构在实现同一个功能的时候,算法的选用不一定一样) 常用的数据结构:一对一 --- 线性结构:一对多 --- 树结构:多对多 --- 图结构 所谓的一对一,就是从前一个数据通过某种方式可以找到下一个数据(最多只有一个).线性结构主要包括:(important!从存储形式上分)顺序表和链表:(从逻辑功能上分)栈和队列.(同

【机器学习算法应用和学习_2_理论篇】2.2 M_分类_逻辑回归

一.原理阐述 算法类型:监督学习_分类算法 输入:数值型或标称型(标称型需要独热编码) V1.0 用回归方式解决二分类问题,通过引入一个Sigmoid函数将中间y值映射到实际二分类的y值上. 二.算法选择 三.算法过程 1.Sigmoid函数是一个x值域是(-∞,+∞),y值域是(0,1)的单调递增函数: 2.预测y值>0.5为1类,<0.5为0类,y值也可以解释为为1和0类的概率: 3.同样使用“最小二乘”概念,求得最佳方程,得到目标函数: 4.要使得目标函数达到最小,需要采用一种称为“梯度

算法中的思想(第0篇)

最近就快把本科的学分修完了,总算是有了一段自上大学以来最空闲的时间,之前也零散的接触过好多算法了,打算把这些算法中的重要思想整理一遍,后面会陆续发文章,主要参考到的博文和书将会在文章中列出来,如果有原文作者不满,可以与我联系撤下. 另外,感觉<Introduction to the Design and Analysis of Algorithms -- A STRATEGIC APPROACH>这本书写的非常好,将一些算法按照其中用到的思想做了一个分类,我也是主要参考这本书对算法做分类,书是

我的算法学习之路

关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门--当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾--反正最后考试划个重点也能过,于是这门整个计算机专业本

周总结(2017.2.16):第一周算法学习。

周总结:算法学习总结之DFS和BFS 一:DFS算法 目的:达到被搜索结构的叶节点. 定义:假定给定图G的初态是所有的定点都没有访问过,在G中任选一定点V为初始出发点,首先访问出发点并标记,然后依次从V出发搜索V的每个相邻点W,若W未曾出现过,则对W进行深度优先遍历(DFS),知道所有和V有路径相通的定点被访问. 如果从V0开始寻找一条长度为4的路径的话: 思路步骤: 先寻找V0的所有相邻点:dis{v1,v2,v3},V1没有访问过,所以对V1进行深度遍历并将V1标记为访问过,此时路径长度为1

算法学习 - 01背包问题(动态规划C++)

动态规划 01背包 问题描述 求解思路 代码实现 放入哪些物品 代码 动态规划 我在上一篇博客里已经讲了一点动态规划了,传送门:算法学习 - 动态规划(DP问题)(C++) 这里说一下,遇到动态规划应该如何去想,才能找到解决办法. 最主要的其实是要找状态转移的方程,例如上一篇博客里面,找的就是当前两条生产线的第i个station的最短时间和上一时刻的时间关系. minTime(station[1][i]) = minTime(station[1][i-1] + time[i], station[

Peng Gong:我的算法学习之路

原文出处: Lucida (@peng_gong) 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门--当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾--