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数构成的完美图片吧。