斐波那契数列

sunner008 2010-06-12 08:17:33
斐波那契数列中的复杂度O(n)是如何通过黄金分割的那个公式导出来的请高手给我指点。
...全文
150 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunner008 2010-06-13
  • 打赏
  • 举报
回复
二楼回答的好像并没有告诉我怎么导出他的复杂度是O(n)吧?
wuyi8808 2010-06-13
  • 打赏
  • 举报
回复
斐波那契数列有通项公式:

超级大笨狼 2010-06-13
  • 打赏
  • 举报
回复
折半推导

算法导论,分治法,视频,就讲了这个例子,log(n)
就是michael122说的,利用01矩阵。

http://www.tudou.com/programs/view/EMQ6zqD7G-o/
showjim 2010-06-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sbwwkmyd 的回复:]
折半推导,假设数据已生成,从后向前观察数列,数N[2i]必定能由N[i]与N[i+-1]的平方运算求出,两两向前推导,类似数列求解log(n)
[/Quote]
也就是说,把最后一个数分解向前推,反序数列的系数(乘数)等于正序数列的值,所以推到中间必定是两个数的平方运算方程。
showjim 2010-06-13
  • 打赏
  • 举报
回复
折半推导,假设数据已生成,从后向前观察数列,数N[2i]必定能由N[i]与N[i+-1]的平方运算求出,两两向前推导,类似数列求解log(n)
        public static long nextSeries(int firstNumber, int secondNumber, int number)
{
long value = number == 1 ? firstNumber : (number == 2 ? secondNumber : 0);
if (number > 2)
{
checked
{
if (firstNumber == secondNumber) value = (long)(fibonacci(number) * (ulong)firstNumber);
else
{
long square, left = firstNumber, right = secondNumber, divisor = (long)firstNumber * firstNumber - (long)firstNumber * (secondNumber -= firstNumber) - (long)secondNumber * secondNumber;
for (int bits = ((uint)number).bits() - 2; bits >= 0; bits--)
{
right = (firstNumber * (square = left * left + right * right) - secondNumber * right * (right + (left << 1))) / divisor;
left = (square - firstNumber * right) / secondNumber;
if ((number & (1L << bits)) != 0) left = (right += left) - left;
}
value = left;
}
}
}
return value;
}
showjim 2010-06-13
  • 打赏
  • 举报
回复
没有处理溢出问题,用折半推导,时间复杂度log(n)
public static ulong fibonacci(int number)
{
ulong value = 0;
if (number > 0)
{
ulong[] values = { 0, 1, 1, 2, 3 };
if (number < values.Length) value = values[number];
else
{
int bits = ((uint)number).bits() - 2;
ulong square, left = (number & (1 << bits)) == 0 ? 1UL : 2UL, right = left + 1;
checked
{
for (bits--; bits > 0; bits--)
{
if ((number & (1 << bits)) == 0)
{
left = (right * left << 1) - (square = left * left);
right = right * right + square;
}
else
{
right = ((left + right) * right << 1) - (square = right * right);
left = square + left * left;
}
}
value = (number & 1) == 0 ? (right * left << 1) - left * left : (right * right + left * left);
}
}
}
return value;
}
michael122 2010-06-13
  • 打赏
  • 举报
回复
ls说的对,你一项一项算,复杂度不就是O(n) 吗?
实际上还可以达到logn的


(f(n),f(n-1))=(f(n-1),f(n-2))* A

A是一个矩阵 1 1
1 0

然后用二分法算矩阵A^n就行了
sunner008 2010-06-13
  • 打赏
  • 举报
回复
如果f(n)=⌊a^n/√5+1/2⌋,n>=1,a=(1+√5)/2
这种情况下O(logn)和O(n)如何导出呢?
谢谢大家的指导。
fanster28_ 2010-06-13
  • 打赏
  • 举报
回复
f(n)=f(n-1)+f(n-2) 特征方程x^2=x+1 得x1=(-1+sqrt(5))/2 x2=(-1-sqrt(5))/2
f(n)=A[(-1+sqrt(5))/2]^n+B[(-1-sqrt(5))/2]^n, A B两个常数,这个高中学过数学竞赛的肯定晓得这种方法
取n=1,2解出A,B就行了

这样计算 复杂度是O(lg(n)) 二分, 但是精度是个问题

f(n)=f(n-1)+f(n-2) 直接递推(尾递归的写法也可以)复杂度不就是O(n)么?
xinzaiyiqi 2010-06-12
  • 打赏
  • 举报
回复
还有背景故事
budweiser 2010-06-12
  • 打赏
  • 举报
回复
原文:http://education.biox.cn/education/200701/20070112195917_53245.shtml
budweiser 2010-06-12
  • 打赏
  • 举报
回复
黄金分割和斐波那契数

在1972年西方的报章报导了中国利用一种数学原理,对生产和科学研究中不同的试验项目,合理地安排试验点,减少试验的盲目性,比较快和准确的找到最好结果的一种试验方法。因此使到生产建设可以提高速度完成,而且质量优良,减少消耗浪费。消息还说随着这种方法的推广,预见中国的生产步伐会更加迅速前进。

过了不久,我们看到了中国拍摄的时事纪录片,有关中国数学家华罗庚教授在工人当中推广这种方法——优选法的情形。我们看到他怎么样用浅白的语言和生动的例子来解释这个方法,也看到工人们怎样把这理论方法用到实际的生产实践上,而获得优良的成果的情形。

今天我们要谈的是这种方法常要用到的一个数值1.618的来源以及它的一些故事。

古代希腊的“黄金分割”

在差不多二千年前希腊的数学家考虑了一个几何问题,这问题可以这样说:给出任何一个线段AB,我们要在这上面找出一点,这一点把这线段分成长短二部份。要求的是全线段的长和较长部份的比值是等于较长部分和较短部份的长的比值。

如果我们假设较长的部份是AC,较短的部份是CB,我们



由于AB=AC+CB,所以我们看到:



现在我们得到了一个代数方程,我们把这个方程化简它变成了x2-x-1=0





到1.6180339…。

优选法用的数是它的小数点后的数。一般我们在应用时只取准确到小数点后三位数,因此我们用1.618。这个数以往的数学家称为“黄金数”(Golden number)。今天我们来看这个名称真是给的恰到好处,这个数真是一个宝,它为国家创造了多少财富!

希腊数学家把这个几何问题里的点C称为把线段黄金分割(Golden section)。
待续。。。

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧