为什么斐波那契数列在计算机科学中有重要意义?
斐波纳契数字已经成为计算机科学学生recursion的一个stream行的介绍,有一个强有力的论点是他们坚持自然。 由于这些原因,我们很多人都熟悉它们。
他们也存在于计算机科学领域。 以惊人的高效数据结构和基于序列的algorithm。
有两个主要的例子可以想到:
- 斐波纳契堆的运行时间比二项堆更好。
- 斐波那契search在有序数组上使用二分search共享O(logN)运行时间。
这些数字有一些特殊的性质,使它们比其他数字序列有优势吗? 这是空间质量吗? 他们还有什么其他可能的应用?
对我来说这似乎很奇怪,因为在其他recursion问题中有很多自然数序列,但是我从来没有见过一个加泰罗尼亚堆。
斐波那契数列有各种非常好的math属性,使他们在计算机科学方面非常出色。 这里有几个:
- 他们快速成长。 斐波那契数列出现的一个有趣的数据结构是AVL树,一种自平衡二叉树forms。 这棵树背后的直觉是每个节点保持一个平衡因子,使得左右子树的高度相差至多一个。 正因为如此,你可以想到得到一个高度为AVL的树所需的最小节点数量是由类似N(h + 2)〜= N(h)+ N(h + 1)的复现来定义的,这看起来很像斐波那契数列。 如果算出math,可以certificate得到高度为h的AVL树所需的节点数为F(h + 2)-1。由于斐波那契数列以指数级快速增长,这意味着AVL树在节点数量上最多是对数的,给你我们所知道的O(lg n)查找时间,并且关于平衡二叉树。 事实上,如果你可以用一个斐波那契数来限制一些结构的大小,你可能会在某个操作中得到一个O(lg n)的运行时间。 这是Fibonacci堆被称为Fibonacci堆的真正原因 – certificate了在出队min之后堆的数量涉及用一个Fibonacci数限制一定深度的节点数。
- 任何数字都可以写成唯一斐波那契数的和。 斐波那契数的这个性质对于让斐波那契search起作用是至关重要的。 如果您无法将唯一的斐波纳契数字添加到任何可能的数字中,则此search不起作用。 将其与许多其他系列比较,如3 n或加泰罗尼亚语的数字。 这也是为什么许多像两个幂的algorithm,我想。
- 斐波那契数是有效可计算的。 事实上,该系列可以非常有效地生成(你可以得到O(n)中的前n项或O(lg n)中的任意项),那么使用它们的许多algorithm将是不实际的。 生成加泰罗尼亚语数字在计算上相当棘手,IIRC。 除此之外,斐波那契数有一个很好的性质,给定任意两个连续的斐波纳契数,假设F(k)和F(k + 1),我们可以很容易地计算下一个或前一个斐波那契数, (F(k)+ F(k + 1)= F(k + 2))或者减去它们。 这个属性在几个algorithm中被利用,结合属性(2),将数字拆分成斐波那契数的和。 例如,斐波那契search使用它来定位内存中的值,而类似的algorithm可以用来快速高效地计算对数。
- 他们在教学上是有用的。 教学recursion是棘手的,斐波那契数列是介绍它的好方法。 在介绍系列时,您可以谈论直递式,关于memoization或关于dynamic编程。 此外, 斐波纳契数的惊人封闭forms经常被用来作为归纳或分析无限级数的练习, 斐波那契数的相关matrix方程通常作为特征向量和特征值背后的动机被引入线性代数。 我认为这是他们在入门课上如此高调的原因之一。
我相信还有更多的原因,但我相信其中一些原因是主要因素。 希望这可以帮助!
最大的公约数是另一个魔法; 看到这个太多的魔法。 但斐波纳契数字很容易计算; 也有一个具体的名字。 例如,自然数1,2,3,4,5有太多的逻辑; 所有的素数都在他们之内; 总和1..n是可计算的,每个人都可以与其他人产生,但是没有人关心他们:)
我忘记了一个重要的事情是黄金比例 ,它在现实生活中有非常重要的影响(例如,你喜欢宽屏幕:)
如果你有一个algorithm,可以通过一个简单明了的方式,在CS和自然界可以理解的例子中被成功解释,那么有人可以提出更好的教学工具吗?
斐波那契数列在自然界/生活中无处不在。 它们在模拟动物种群生长,植物细胞生长,雪花形状,植物形状,密码学,当然还有计算机科学方面很有用。 我听说它被称为大自然的DNA模式。
斐波那契堆已经被提及; 堆中每个节点的子节点数最多为log(n)。 另外,以m个孩子开始节点的子树至less是第(m + 2)个斐波纳契数。
洪stream像使用节点和超节点系统的协议使用斐波那契来决定何时需要新的超级节点以及它将pipe理多less个子节点。 他们基于斐波那契螺旋(黄金比例)进行节点pipe理。 请看下面的照片如何分割/合并节点(从一个大方块分割成小方块,反之亦然)。 见照片: 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
我不认为有一个明确的答案,但有一种可能性是将一个集合S划分成两个分区S1和S2的操作,其中一个分区然后被分成子分区S11和S12,其中一个分区的大小与S2 – 是许多algorithm的一种可能的方法,有时可以用数字来描述为斐波那契数列。
让我给你添加另一个数据结构:斐波纳契树。 他们很有趣,因为只需添加以前的节点就可以完成树中下一个位置的计算:
http://xw2k.nist.gov/dads/html/fibonacciTree.html
它与AVL树上的templatetypedef的讨论紧密相关(AVL树最坏的情况下可以有斐波纳契结构)。 我也看到缓冲区扩展斐波那契步骤,而不是在某些情况下的权力。
只是为了增加一个琐事,斐波那契数字描述了兔子的育成。 你从(1,1),2只兔子开始,然后他们的人口呈指数增长。
它们作为[[0,1],[1,1]]matrix的幂的计算可以被认为是运筹学中最原始的问题(有点像囚徒困境是博弈论最原始的问题)。