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

Fibonacci数字已经成为计算机科学学生递归的一个流行的介绍,并且有一个强烈的论据,他们坚持在自然界。 出于这些原因,我们很多人都熟悉它们。

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

我想到了两个主要的例子:

Fibonacci堆更好摊销运行时间比二项式堆。

斐波那契搜索共享O(log N)二进制运行时间搜索有序数组。

这些数字是否有某些特殊属性可以使它们优于其他数字序列? 这是空间质量吗? 他们还有哪些其他可能的应用程序?

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

8个解决方案

67 votes

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

它们以指数级增长。 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)运行时。这就是Fibonacci堆称为Fibonacci堆的真正原因 - 证明了出队时间之后堆的数量涉及使用Fibonacci数限制一定深度的节点数。

任何数字都可以写成唯一斐波纳契数的总和。 Fibonacci数的这个属性对于让Fibonacci搜索工作至关重要; 如果你不能将唯一的Fibonacci数字加到任何可能的数字中,那么这个搜索将不起作用。 与许多其他系列对比,如3n或加泰罗尼亚数字。 这也是部分原因,我认为很多算法都像2的幂。

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搜索使用它来定位内存中的值,而类似的算法可用于快速有效地计算对数。

他们在教学上很有用。 教学递归很棘手,Fibonacci系列是介绍它的好方法。 在介绍该系列时,您可以谈论直接递归,关于memoization或动态编程。 此外,Fibonacci数的惊人封闭形式通常被教导为归纳或无限级数分析中的运动,而Fibonacci数的相关矩阵方程通常在线性代数中作为特征向量和特征值背后的动机引入。 我认为这是他们在入门课程中如此高调的原因之一。

我确信有更多的理由不仅仅是这个,但我确信其中一些原因是主要因素。 希望这可以帮助!

templatetypedef answered 2019-05-05T06:41:56Z

4 votes

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

我忘了它的一个重要事项是黄金比例,它对现实生活有非常重要的影响(例如你喜欢宽屏显示器:)

Saeed Amiri answered 2019-05-05T06:42:32Z

1 votes

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

savalia answered 2019-05-05T06:42:58Z

1 votes

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

Fibonacci堆已经被提到了; 堆中每个节点的子节点数最多为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]

Adrian answered 2019-05-05T06:44:37Z

0 votes

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

DVK answered 2019-05-05T06:45:07Z

0 votes

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

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

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

I GIVE CRAP ANSWERS answered 2019-05-05T06:45:52Z

0 votes

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

Mihaela answered 2019-05-05T06:46:20Z

0 votes

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

Dmitry Rubanovich answered 2019-05-05T06:46:46Z

在计算机科学中算法指的是,算法 - 为什么斐波纳契数在计算机科学中具有重要意义?...相关推荐

  1. python个数计算公式_使用python中的公式计算第n个斐波纳契数

    你确实看到了舍入错误. 矩阵形式是更准确和更快的算法. Literateprograms.org列出了一个很好的实现,但它还列出了基于Lucas数的以下算法: def powLF(n): if n = ...

  2. 算法时间复杂度lg是多少_斐波那契数的 O(lgn) 时间复杂度算法 | 学步园

    看了 This problem compares the efficiency of three methods for computing the nth Fibonacci number Fn, ...

  3. 代码随想录算法训练营第三十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯。

    Leetcode 509. 斐波那契数 题目链接:509. 斐波那契数 class Solution {public:int fib(int n) {if(n <= 1)return n;int ...

  4. 编写c语言程序 斐波那契,请编写一个函数,生成并显示前n个斐波那契数.在主程序中测试...

    编写一个函数求n!,并编写主函数调用该函数 计算e=1+I/1!+1/2!+1/3!+...+1/n!:当n=10时结束 #includeintjiecheng(int);voidmain(){flo ...

  5. python输入n个数、输出最小的数字_程序查找最少的斐波纳契数以在Python中加到n?...

    假设我们有一个数字n:我们必须找到加n所需的最小斐波纳契数. 因此,如果输入像n = 20,那么输出将为3,因为我们可以使用斐波那契数[2,5,13]求和为20. 为了解决这个问题,我们将按照以下步骤 ...

  6. 算法笔记_001:斐波那契数的多种解法(Java)

    本篇文章解决的问题来源于算法设计与分析课程的课堂作业,主要是运用多种方法来计算斐波那契数.具体问题及解法如下: 一.问题1: 问题描述:利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数是第 ...

  7. [算法学习]斐波那契数的计算

    决定开始看algorithms,而且尽量多思考,多写点代码.第一个碰到的算法就很具有启发性,一些看似正确的算法,实际的复杂度却很高.我们直接看问题: 问题:假设fibonacci(0)=0,fibon ...

  8. JavaScript实现闭式函数计算特定位置的斐波那契数fibonacciNthClosedForm算法(附完整源码)

    JavaScript实现闭式函数计算特定位置的斐波那契数fibonacciNthClosedForm算法(附完整源码) fibonacciNthClosedForm.js完整源代码 fibonacci ...

  9. JavaScript实现动态规划方法计算特定位置的斐波那契数fibonacciNth算法(附完整源码)

    JavaScript实现动态规划方法计算特定位置的斐波那契数fibonacciNth算法(附完整源码) fibonacciNth.js完整源代码 fibonacciNth.js完整源代码 export ...

最新文章

  1. idea配置echache.xml报错Cannot resolve file 'ehcache.xsd'
  2. RDKit | 从ChEMBL数据库提取大分子HELM单体(XML转换为DataFrame并搜索部分结构)
  3. Windows Mobile 7 梦幻之旅系列1之- What’s New?
  4. Xcode中Info.plist文件各个键的作用说明【搜藏】
  5. python3.6.1安装,linux下安装Python3.6.1
  6. Canvas or SVG?一张好图,两手准备,就在 ECharts 4.0
  7. 【Office Word】论文排版有关技巧
  8. oracle md,Oracle笔记.md
  9. 《Dive Into Deeping Learing》学习笔记:深度学习基础
  10. 极速office如何插入超链接
  11. Android一键锁屏与抬手亮屏的实现
  12. python简易自动化之pyautogui 2020-12-19
  13. 【微信小程序】图片被压扁怎么办?在image中添加 mode=widthFix
  14. 7-14 输出大写英文字母 (15分) 瞎搞
  15. 小程序验证:人的男女偏见对出生性别比例平衡的影响
  16. 5.5leecode刷题记录(leecode704.二分查找,leecode.27移除元素)
  17. 笔记本电脑屏幕PWM调光频率测试调节软件
  18. 每个老板心里都有一个波斯顿矩阵
  19. 关于微信分享申请应用APPkey时该注意的地方
  20. 导入mysql示例数据库employees

热门文章

  1. 微信计步器怎么不计步_送我一顶圣诞帽@星尘StarDust,制作一个圣诞创意微信头像...
  2. HTTP协议详细介绍~超详细
  3. 【二分法】计蒜客:二分快速幂
  4. 采用dlopen、dlsym、dlclose加载动态链接库
  5. MPEG2简单码流分析
  6. android计算汇率代码,android studio 开发实例 连接网络获取汇率
  7. ios获取新数据要不要关_iPhone用户注意!不要再滑动关后台,否则……
  8. python实验报告_20193102 实验一 《python程序设计》实验报告
  9. oracle获取用户名,Oracle 用户名详解
  10. win11没有hyper-v