为什么斐波那契数在计算机科学中很重要?


76

斐波那契数已成为计算机科学学生进行递归的热门介绍,并且有一个强有力的论据认为它们在自然界中会持久存在。由于这些原因,我们许多人都熟悉它们。

它们也存在于其他地方的计算机科学中。基于序列的令人惊讶的高效数据结构和算法。

我想到了两个主要示例:

这些数字是否具有某些特殊性质,使其比其他数字序列具有优势?是空间品质吗?他们还有什么其他可能的应用程序?

对我来说,这很奇怪,因为在其他递归问题中还有很多自然数序列,但是我从未见过加泰罗尼亚语堆。


熟悉不是最大的因素吗?
飓风

13
我认为这类问题属于cstheory或数学SE。有趣,但旧约。
弗雷德·富

7
@larsmans不同意。我最近看到的最有趣的问题之一,其相关性得到了这样的事实的支持:作为程序员,我们到处都能看到它。
迈克(Mike)2010年

2
这似乎与math.stackexchange.com上询问的“斐波那契数列的应用”有关。关于序列的特定应用,还有其他类似的问题。通常,这是讨论序列“属性”的好地方,因为它适用于更通用的算法。在我看来,这个问题正在接近计算理论的讨论,在那里可能会得到更好/更多的关注。
RobertB 2010年

1
我(显然)与larsmans一起工作,并且我同意cstheory将是与此相关的另一个好地方。
RobertB 2010年

Answers:


69

斐波那契数具有各种非常好的数学性质,使其在计算机科学中非常出色。这里有一些:

  1. 他们成倍增长。 斐波那契数列出现的一个有趣的数据结构是AVL树,这是一种自平衡二叉树。该树的直觉是每个节点都保持平衡因子,因此左右子树的高度最多相差一个。因此,您可以想到获得高度为h的AVL树所需的最小节点数是由看起来像N(h + 2)〜= N(h)+ N(h + 1)的递归定义的,看起来很像斐波那契数列 如果您进行数学计算,则可以证明获得高度为h的AVL树所需的节点数为F(h + 2)-1。因为Fibonacci级数呈指数增长,这意味着AVL的高度树最多是节点数的对数,因此您可以了解和喜欢平衡二叉树的O(lg n)查找时间。事实上,如果您可以用斐波那契数来限制某个结构的大小,则您可能会在某些操作上获得O(lg n)运行时。这就是将Fibonacci堆称为Fibonacci堆的真实原因-证明出队最少后的堆数涉及用Fibonacci数限制在一定深度内可以拥有的节点数。
  2. 任何数字都可以写为唯一斐波那契数字的总和。 斐波那契数字的此属性对于使斐波那契搜索完全起作用至关重要。如果您无法将唯一的斐波那契数字加到任何可能的数字中,则此搜索将无法进行。将此与许多其他系列(例如3 n或加泰罗尼亚数字)进行对比。我认为,这也是部分原因,原因是很多算法都喜欢使用2的幂。
  3. 斐波那契数是可以有效计算的。 可以非常有效地生成级数的事实(您可以在O(n)中获得前n个项,或者在O(lg n)中获得任意项),那么使用它们的许多算法都不实用。IIRC,生成加泰罗尼亚语的数字在计算上非常棘手。最重要的是,斐波那契数具有很好的属性,给定任意两个连续的斐波那契数,例如F(k)和F(k + 1),我们可以通过将两个值相加来轻松计算下一个或上一个斐波那契数(F(k)+ F(k +1)= F(k + 2))或减去它们(F(k +1)-F(k)= F(k-1))。此属性与属性(2)一起用于多种算法中,用于将数字分解为斐波纳契数的总和。例如,斐波那契搜索使用它来定位内存中的值,
  4. 它们在教学上很有用。 递归教学很棘手,斐波那契数列是介绍递归的好方法。介绍该系列文章时,您可以谈论直接递归,记忆化或动态编程。此外,斐波那契数的惊人的封闭形式通常作为归纳法或无穷级数分析中的一种练习而被教授,斐波那契数的相关矩阵方程通常在线性代数中引入,作为本征矢量和特征值背后的动机。我认为这是他们在入门课程中如此高调的原因之一。

我敢肯定,除了上述原因外,还有更多原因,但是我确信其中一些原因是主要因素。希望这可以帮助!


30
所有这一切也适用于2的幂;-)

按“ O(n)”顺序生成加泰罗尼亚语数字:perl -Mbignum -le'$n=0;$c=1;while(1){$n++;$c*=(4*$n-2);$c/=($n+1);print"$n\t$c"}' | head -n 100
A. Rex

3
在#2中,重要的是斐波那契数必须是非连续的,这样总和才能唯一。
kunigami 2011年

1
使斐波那契搜索有用的是,它们的生成多项式为x ^ 2-x-1。斐波那契搜索与黄金比例搜索共享属性,以获取连续函数的最小值。
Alexandre C.

@Alexandre C.-您能详细说明吗?我不熟悉为什么特定的生成多项式很有用。
templatetypedef

4

最大公约数是另一种魔法。看到太多的魔法。但是斐波那契数很容易计算。还有一个特定的名字。例如,自然数1,2,3,4,5逻辑太多;所有素数都在其中;1..n的总和是可计算的,每个人都可以与其他人一起生产,...但是没人照顾他们:)

我忘了的一件事很重要,那就是黄金分割率Golden Ratio),它对现实生活有非常重要的影响(例如,您喜欢宽屏显示器:)


1

如果您有一种算法可以用CS和自然界中的简单示例以简洁明了的方式成功进行解释,那么有人会想出哪种更好的教学工具?


1

斐波那契数列确实存在于自然/生命的任何地方。它们可用于模拟动物种群的增长,植物细胞的生长,雪花形状,植物形状,密码学以及计算机科学。我听说它被称为自然的DNA模式。

斐波那契堆已经被提及;堆中每个节点的子代数最多为log(n)。同样,从具有m个子节点的节点开始的子树至少是第(m + 2)个斐波那契数。

使用节点和超节点系统的类似Torrent的协议使用fibonacci来决定何时需要一个新的超级节点以及它将管理多少个子节点。他们根据斐波那契螺旋(黄金比例)进行节点管理。请参见下面的照片,如何将节点拆分/合并(从一个大正方形分成多个小正方形,反之亦然)。参见照片:http : //smartpei.typepad.com/.a/6a00d83451db7969e20115704556bd970b-pi

自然界中的某些事件

http://www.mcs.surrey.ac.uk/Personal/R.Knott/Fibonacci/sneezewort.GIF

http://img.blogster.com/view/anacoana/post-uploads/finger.gif

http://jwilson.coe.uga.edu/EMAT6680/Simmons/6690Pictures/pinecone3yellow.gif

http://2.bp.blogspot.com/-X5II-IhjXuU/TVbHrpmRnLI/AAAAAAAAABU/nv73Y9Ylkkw/s320/amazing_fun_featured_2561778790105101600S600x600Q85_200907231856306879.jpg


0

我认为没有确定的答案,但是一种可能性是将集合S分为两个分区S1和S2的操作,然后将其中一个分区分为子分区S11和S12,其中一个分区的大小与S2-是许多算法的一种可能方法,有时可以用数字描述为斐波纳契数列。


0

让我为您添加另一个数据结构:斐波那契树。它们很有趣,因为仅通过添加前一个节点即可完成树中下一个位置的计算:

http://xw2k.nist.gov/dads/html/fibonacciTree.html

它与AVL树上的templatetypedef的讨论密切相关(AVL树最坏的情况下可以具有斐波那契结构)。在某些情况下,我还看到缓冲区以斐波那契步长扩展,而不是2的幂。


0

对此不加赘述,斐波那契数字描述了兔子的面包屑。您从(1,1)开始,两只兔子,然后它们的数量成倍增长。



0

频率为连续斐波那契数的符号会创建最大深度霍夫曼树,该树对应于使用最大长度的二进制代码编码的源符号。非斐波那契源符号频率创建的树更均衡,代码更短。代码长度对负责解码给定霍夫曼代码的有限状态机的描述复杂度具有直接影响。


猜想:第一张(fib)图像将被压缩到38位,而第二张(统一)将被压缩到50位。似乎您的源符号频率与斐波那契数越接近,最终的二进制序列越短,压缩效果越好,这在霍夫曼模型中可能是最佳的。

huffman.ooz.ie/?text=ABBCCCDDDDDEEEEEEEE

在此处输入图片说明

进一步阅读:

Buro,M。(1993)。关于霍夫曼码的最大长度。信息处理快报,45(5),219-223。doi:10.1016 / 0020-0190(93)90207-p

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.