AOCP(1)-----Fbonacci数

本文探讨了斐波那契数列的基本概念及其在计算机科学中的应用,包括斐波那契堆和斐波那契编码。此外,还介绍了几种计算斐波那契数的不同算法,如递归、循环及对数时间复杂度的方法。

FIBONACCI  NUMBERS

1. Fibonacci number

Fibonacci Numbers come form a very funny mathematical problem: “How many pairs of rabbits can be produced from a single pair rabbit?”

这是一个很有意思的话题, 我们可以从最基本的分析开始:

1          2          3          4          5          6          7…..

2          3          5          8          13        21        34…

从上面的序列我可以发现, 这个序列有一个特点就是第n个月的兔子是n-1个月跟n-2个月小白兔的和。(现在知道什么是人口爆炸了吧, 如果没有计划生育,我们就是小白兔….

写成数学公式就是:Fn = Fn-1 + Fn-2

这个公式很简单, 但是里面蕴含的道理深着呢。先给出几个公式:

 

这个公式的证明过程高老师用的是Euler 的方法证明的, 这个对我们以后的算法分析特别重要。

我们还是首先给你两种计算机求解fibonacii的两种版本: 递归和循环。 

#include "stdio.h"

 

static int fibonacci1 (int n)

{

    if (n == 0 || n == 1) {

        return n;

    } else if (n > 1) {

        return fibonacci1(n - 1) + fibonacci1(n - 2);

    } else {

        return 0;   

    }

}

 

static int fibonacci2 (int n)

{

    int i;

    int an_2 = 0;

    int an_1 = 1;

    int an;

   

    if (n <= 1 ) {

        return n;

    }

    for (i = 2; i <= n; ++i) {

        an = an_1 + an_2;

        an_2 = an_1, an_1 = an;

    }

    return an;

}

 

int main (char argc, char** argv)

{

   printf("The recusive version:%d/n", fibonacci1(10));

   printf("The cycle version:%d/n", fibonacci2(10));

   return 0;

}

递归呢是按照算法的意图来写,容易理解,也就是说从一个高度来俯视这个算法。呵呵,循环呢,就是从底层一点点的累积,最后构造出这个数。递归的时间复杂度是幂级别的,循环是n级别的(一维动态规划)。是不是还有别的方法呢?我们再给出一种logn的算法:

F_(2n) = F_(n+n) = F_n * F_(n+1) + F_(n-1) * F_n = F_n * (F_(n+1) + F_(n-1)) = F_n*F_n + 2 * F_n * F_(n-1)

F_(2n+1) = F_(n+1+n) = F_(n+1) * F_(n+1) + F_n * F_(n) = 2*F_n*F_n + 2*F_n*F_(n-1) + F_(n-1) * F_(n-1)  

static int fibonacci3 (int n) {

    int n_2 = n/2;

    int fn_2;

    int fn_2_1;

 

    if (n == 0 || n == 1) {

        return n;

    } else if (n > 1) {

        fn_2 = fibonacci3(n_2);

        fn_2_1 = fibonacci3(n_2 - 1);

        if (n % 2 == 0) {

            return fn_2 * (fn_2 + 2 * fn_2_1);

        } else {

            return 2 * fn_2 * fn_2 + 2 * fn_2 * fn_2_1 + fn_2_1 * fn_2_1;

        }

    } else {

        return 0;   

    }

}

这个算法的时间复杂度为cn,  c 是一个因子, 较前面的算法要高, 毕竟计算公式也是需要时间的。 呵呵相对于幂级的递归的算法来说这个已经是有很大的提高了。这个算法可以用循环去写,那样的时间复杂度为ln_n。其实我们还可以分析效率更高算法, 呵呵我们可以写出以3为底的算法,就是按照AOCP上的公式6去分析。

在实际的使用过程中,FIBONACCI的数应该都是存在memory中, 并不需要计算。 其实在实际的过程中,常数都不应该进行重复计算,除非在memory要求严格的系统中。

2. Fibonacci在计算机中的应用。

1Fibonacci heap

Fibonacci heap 是对的一种,它具有良好的插入与合并特性,在大型的数据中,插入特性对于一个系统的性能对系统的性能影响甚大。

(2)Fibonacci coding

            对这个研究不多, 知道他是一种同步码,也就是可以从数据中自恢复。收集了几个链接:

            http://wiki.tcl.tk/12324

            http://www.goldenmuseum.com/1508FibCode_engl.html

            http://www.mahalo.com/Fibonacci_Code

 

3. “美”

Fibonacci数是一个很“美”数字,看看这些Fibonacci数构成的完美图片吧。

 http://images.google.cn/images?hl=zh-CN&q=Fibonacci&btnG=%E6%90%9C%E7%B4%A2%E5%9B%BE%E7%89%87&gbv=2&aq=f&oq=

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值