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在計算機中的應用。
(1)Fibonacci heap
Fibonacci heap 是對的一種,它具有良好的插入與合併特性,在大型的數據中,插入特性對於一個系統的性能對系統的性能影響甚大。
(2)Fibonacci coding
對這個研究不多, 知道他是一種同步碼,也就是可以從數據中自恢復。收集了幾個鏈接:
http://www.goldenmuseum.com/1508FibCode_engl.html
http://www.mahalo.com/Fibonacci_Code
3. “美”
Fibonacci數是一個很“美”數字,看看這些Fibonacci數構成的完美圖片吧。