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=

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章