为什么斐波那契数字在计算机科学中具有重要意义?

时间:2010-12-31 18:24:29

标签: algorithm math data-structures fibonacci

Fibonacci numbers已经成为计算机科学学生递归的一个受欢迎的介绍,并且有一个强烈的论据,即它们在自然界中存在。由于这些原因,我们很多人都熟悉它们。

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

有两个主要的例子可以想到:

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

我觉得很奇怪,因为在其他递归问题中有很多自然数字序列,但我从未见过Catalan堆。

9 个答案:

答案 0 :(得分:68)

Fibonacci数字具有各种非常好的数学特性,使它们在计算机科学方面表现出色。这里有几个:

  1. 它们以指数方式快速增长。 Fibonacci系列出现的一个有趣的数据结构是AVL树,一种自平衡二叉树。这棵树背后的直觉是每个节点都保持一个平衡因子,这样左右子树的高度最多相差一个。因此,你可以想到获得高度为h的AVL树所需的最小节点数由一个看起来像N(h + 2)〜= N(h)+ N(h + 1)的重现来定义,看起来很像Fibonacci系列。如果你算出数学,你可以证明获得高度为h的AVL树所需的节点数是F(h + 2) - 1.因为Fibonacci系列呈指数级增长,这意味着AVL的高度树在节点数量上最多是对数,给你O(lg n)查询时间,我们知道并喜欢平衡二叉树。实际上,如果您可以使用Fibonacci数绑定某个结构的大小,则可能会在某些操作上获得O(lg n)运行时。这就是斐波纳契堆被称为斐波那契堆的真正原因 - 证明了出队时间之后的堆数量涉及将特定深度的节点数量与斐波那契数量联系起来。
  2. 任何数字都可以写成唯一斐波纳契数的总和。 Fibonacci数的这个属性对于让Fibonacci搜索工作至关重要;如果你不能将唯一的Fibonacci数字加到任何可能的数字中,那么这个搜索将不起作用。将此与其他许多系列进行对比,例如3 n 或加泰罗尼亚数字。这也是部分为什么很多算法如2的幂,我认为。
  3. Fibonacci数是有效可计算的。可以非常有效地生成序列的事实(你可以在O(n)中获得前n个项或在O(lg n)中获得任意项),然后很多使用它们的算法都不实用。生成加泰罗尼亚语的数字在计算上非常棘手,IIRC。除此之外,Fibonacci数有一个很好的属性,给定任意两个连续的Fibonacci数,假设F(k)和F(k + 1),我们可以通过添加两个值来轻松计算下一个或前一个Fibonacci数。 (F(k)+ F(k + 1)= F(k + 2))或减去它们(F(k + 1)-F(k)= F(k-1))。该属性在几个算法中被利用,与property(2)一起使用,将数字分成Fibonacci数的总和。例如,Fibonacci搜索使用它来定位内存中的值,而类似的算法可用于快速有效地计算对数。
  4. 他们在教学上很有用。教学递归很棘手,而Fibonacci系列是介绍它的好方法。在介绍该系列时,您可以谈论直接递归,关于memoization或动态编程。另外,惊人的closed-form for the Fibonacci numbers通常被教导为归纳练习或无限系列分析,相关的matrix equation for Fibonacci numbers通常作为特征向量和特征值背后的动机引入线性代数。我认为这是他们在入门课程中如此引人注目的原因之一。
  5. 我确信除此之外还有更多原因,但我确信其中一些原因是主要因素。希望这有帮助!

答案 1 :(得分:4)

Greatest Common Divisor是另一种魔力;有太多魔法,请参阅this。但Fibonacci数字很容易计算;它也有一个特定的名称。例如,自然数1,2,3,4,5有太多逻辑;所有素数都在其中; 1..n的总和是可计算的,每个人都可以与其他人一起生产,......但没有人照顾它们:)

我忘了它的一个重要事项是Golden Ratio,它在现实生活中具有非常重要的影响(例如你喜欢宽屏显示器)。

答案 2 :(得分:1)

如果你有一个可以用一个简单而简洁的方法成功解释的算法,在CS和自然界中有可以理解的例子,那么有人能提出哪种更好的教学工具?

答案 3 :(得分:1)

Fibonacci序列确实在自然界/生命中无处不在。它们可用于模拟动物种群的增长,植物细胞生长,雪花形状,植物形状,密码学,当然还有计算机科学。我听说它被称为自然的DNA模式。

斐波那契堆已经被提及;堆中每个节点的子节点数最多为log(n)。此外,以m个子节点开始节点的子树至少是(m + 2)个斐波纳契数。

像使用节点和超级节点系统的协议一样使用斐波纳契来决定何时需要新的超级节点以及它将管理多少个子节点。他们根据斐波纳契螺旋(黄金比率)进行节点管理。请参见下面的照片,如何拆分/合并节点(从一个大的广场划分为较小的广场,反之亦然)。见照片: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

答案 4 :(得分:0)

我认为没有确定的答案,但有一种可能性是将一组S分成两个分区S1和S2的操作,其中一个分区然后被分成子分区S11和S12,其中一个分区具有与S2相同的大小 - 是许多算法的可能方法,有时可以用数字描述为Fibonacci序列。

答案 5 :(得分:0)

让我为您添加另一个数据结构:Fibonacci树。它们很有趣,因为只需添加以前的节点就可以计算树中的下一个位置:

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

它与在AVL树上的templatetypedef的讨论很好地结合(AVL树在最坏的情况下可能具有斐波纳契结构)。在某些情况下,我也看到了在斐波那契步骤中延伸的缓冲,而不是2的幂。

答案 6 :(得分:0)

为了增加一个关于此的琐事,斐波纳契数字描述了兔子的面包屑。你从(1,1),两只兔子开始,然后他们的人口呈指数增长。

答案 7 :(得分:0)

作为[[0,1],[1,1]]矩阵的幂的计算可以被认为是运筹学中最原始的问题(有点像囚徒困境是最原始的问题博弈论)。

答案 8 :(得分:0)

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


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

huffman.ooz.ie/?text=ABBCCCDDDDDEEEEEEEE

enter image description here

进一步阅读:

  

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