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

2024-02-15

斐波那契数列 http://en.wikipedia.org/wiki/Fibonacci_number已经成为计算机科学专业学生对递归的流行介绍,并且有一个强有力的论据表明它们在自然界中持续存在。由于这些原因,我们许多人都熟悉它们。

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

我想到了两个主要例子:

  • 斐波那契堆 http://en.wikipedia.org/wiki/Fibonacci_heap哪些有更好的 摊销运行时间比二项式 堆。
  • 斐波那契搜索 http://en.wikipedia.org/wiki/Fibonacci_search_technique哪些共享 O(log N) 二进制运行时间 在有序数组上搜索。

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

这对我来说似乎很奇怪,因为在其他递归问题中出现了许多自然数序列,但我从未见过Catalan http://en.wikipedia.org/wiki/Catalan_number heap.


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

  1. 它们呈指数级快速增长。斐波那契数列出现的一个有趣的数据结构是 AVL 树,它是一种自平衡二叉树形式。这棵树背后的直觉是每个节点维护一个平衡因子,以便左右子树的高度最多相差一。因此,您可以认为获得高度为 h 的 AVL 树所需的最小节点数是由看起来像 N(h + 2) ~= N(h) + N(h + 1) 的递归定义的,这看起来很像斐波那契数列。如果你计算一下数学,你可以证明获得高度为 h 的 AVL 树所需的节点数为 F(h + 2) - 1。由于斐波那契数列呈指数增长,这意味着 AVL 的高度树的节点数量最多是对数,因此我们知道并喜欢平衡二叉树,因此查找时间为 O(lg n)。事实上,如果您可以使用斐波那契数来限制某些结构的大小,那么您可能会在某些操作上获得 O(lg n) 运行时间。这就是斐波那契堆被称为斐波那契堆的真正原因 - 证明出队最小值后的堆数量涉及使用斐波那契数限制在一定深度内可以拥有的节点数量。
  2. Any number can be written as the sum of unique Fibonacci numbers. This property of the Fibonacci numbers is critical to getting Fibonacci search working at all; if you couldn't add together unique Fibonacci numbers into any possible number, this search wouldn't work. Contrast this with a lot of other series, like 3n or the Catalan numbers. This is also partially why a lot of algorithms like powers of two, I think.
  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. 它们在教学上很有用。教学递归是很棘手的,斐波那契数列是介绍它的好方法。在介绍本系列时,您可以谈论直接递归、记忆或动态编程。此外,令人惊叹的斐波那契数列的封闭形式 http://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression通常作为归纳法或无穷级数分析的练习来教授,以及相关的斐波那契数列的矩阵方程 http://en.wikipedia.org/wiki/Fibonacci_number#Matrix_form通常在线性代数中作为特征向量和特征值背后的动机引入。我认为这是他们在入门课程中如此引人注目的原因之一。

我确信还有更多原因,但我确信其中一些原因是主要因素。希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么斐波那契数在计算机科学中很重要? 的相关文章

  • 如何计算 3D 坐标的线性索引,反之亦然?

    如果我有一个点 x y z 如何找到该点的线性索引 i 我的编号方案是 0 0 0 是 0 1 0 0 是 1 0 1 0 是最大 x 维度 另外 如果我有一个线性坐标 i 我如何找到 x y z 我似乎无法在谷歌上找到这个 所有结果都充满
  • 连接红黑树

    OCaml 标准库有一个很棒的Set使用非常有效的分而治之算法来计算的实现union两套 我相信它会从一组中获取整个子树 而不仅仅是单个元素 并将它们插入到另一组中 并在必要时重新平衡 我想知道这是否需要 OCaml 使用的 AVL 树中保
  • 排序矩阵的选择算法

    这是谷歌面试问题 给定一个 N N 矩阵 所有行均已排序 所有列均已排序 找到矩阵的第 K 个最大元素 在 n 2 中执行它很简单 我们可以使用堆或合并排序 n lg n 对它进行排序 然后得到它 但是有没有更好的方法 比 n lg n 更
  • 颜色变换器功能上的堆栈溢出错误

    我有两种颜色 红色 和 鲑鱼色 我需要动态创建面板以及面板背景颜色 这些颜色必须介于两种颜色之间 红色 public Color x y protected void Page Load object sender EventArgs e
  • 查找字符串中最常见的子字符串的算法

    是否有任何算法可用于查找字符串中最常见的短语 或子字符串 例如 以下字符串将 hello world 作为其最常见的两个单词短语 hello world this is hello world hello world repeats thr
  • 占据花车的地板

    我发现了两种在 Python 中占据发言权的方法 3 1415 1 and import math math floor 3 1415 第一种方法的问题是它返回一个浮点数 即3 0 第二种方法感觉很笨拙而且太长 在 Python 中是否有替
  • 从给定的项目列表创建子列表

    我首先要说的是以下问题不是为了家庭作业目的即使因为我几个月前就完成了软件工程师的工作 无论如何 今天我正在工作 一位朋友向我询问了这个奇怪的排序问题 我有一个包含 1000 行的列表 每行代表一个数字 我想创建 10 个子列表 每个子列表都
  • 双向链表转 JSON

    我有一个三维结构 实际上是一个具有六个节点的双向链表 即左 右 上 下 进 出 如果一个节点位于另一个节点的右侧 那么该节点将毫无疑问位于第一个节点的左侧 喜欢 实际上这是一个 3D 结构 但为了便于理解 我给出了一个 2D 示例 现在我必
  • 如何以最低的价格优化购物车?

    我有一个我想买的物品清单 这些商品由不同的商店提供 价格也不同 商店有单独的送货费用 我正在寻找一种最佳的购物策略 以及支持它的java库 以最低的总价购买所有商品 Example 商品 1 在 Shop1 的售价为 100 美元 在 Sh
  • 使用递归返回嵌套列表中第二小的数字

    我必须归还第二小的使用递归的 python 列表中的数字 以及no loops 我所做的是创建一个辅助函数 它返回列表中 最小 第二小的 值的元组 然后我只取tuple 1 in my second smallest func def s
  • 查找最接近点的多边形顶点的索引

    Heading 我需要找到最接近点的多边形的索引 所以在这种情况下 输出将是 4 和 0 这样 如果添加了红点 我就知 道将顶点放置在数组中的位置 有谁知道从哪里开始 抱歉 如果标题有误导性 我不知道如何正确表达它 In this case
  • 确定一组日期的事件重复模式

    我正在寻找一种模式 算法或库 它将采用一组日期并在退出时返回重复的描述 即集合 11 01 2010 11 08 2010 11 15 2010 11 22 2010 11 29 2010 会产生类似 十一月的每个星期一 的结果 有没有人以
  • Java中的对象池模式

    所以我实现了自己的对象池模式 它工作得很好并且符合预期 从列表中返回我的 老师 对象 并在没有对象时创建它们 我的问题 返回的对象 Teacher 然后需要被转换为它的专门子类之一 例如 生物老师 获得这种功能的最佳方法是什么 编辑 抱歉
  • 更改计划的开始日期以优化资源

    我有很多工作需要在特定的时间间隔执行 然而 我们每天完成这项工作的资源有限 因此 我正在尝试优化开始时间日期 开始时间日期只能向前移动 不能向后移动 以便每天使用的资源与我们的预算更加不相似 这些函数在下面的示例中使用 Function t
  • 找到与圆相切的向量

    我需要围绕中心圆通过固定范数的向量移动一个点 因此 要做到这一点 我需要计算应用于我的点的圆切向量 Here is a descriptive graph 所以我知道p1坐标 圆半径和圆心 以及向量范数d 我需要找到 p2 找到向量 v 方
  • 先增后减的最长子序列

    我正在尝试解决以下问题 元素值先减小后增大的序列称为V序列 在有效的 V 序列中 递减臂中应至少有一个元素 递增臂中至少应有一个元素 例如 5 3 1 9 17 23 是一个有效的 V 序列 在递减臂中具有两个元素 即 5 和 3 在递增臂
  • 对文本变量进行数学求和? (例如 5865/100 )

    我有一个变量是 whatever 5865 100 这是一个文本变量 我希望它计算 5865 100 以便我可以将其添加到其他数字并进行计算 Number format 不起作用 因为它只返回 5 865 而我希望它返回 58 65 我可以
  • 系统地将函数应用于 haskell 记录的所有字段

    我有一条包含不同类型字段的记录 以及一个适用于所有这些类型的函数 举一个小 愚蠢 的例子 data Rec Rec flnum Float intnum Int deriving Show 比如说 我想定义一个为每个字段添加两条记录的函数
  • 我应该如何在软件中实现通用 FMA/FMAF 指令?

    FMA是一个融合乘加指令 这fmaf float x float y float z 函数于glibc称为vfmadd213ss操作说明 我想知道这个指令是如何执行的 据我的理解 添加的指数x and y 尾数相乘x and y 将结果归一
  • 大小为 k 的非连续子序列的最大值的最小值

    在开始之前 我希望这个问题不是重复的 我发现了几个类似的问题 但它们似乎都没有描述完全相同的问题 但如果它是重复的 我会很高兴看到一个解决方案 即使它与我的算法不同 我一直在尝试回答这个问题 https stackoverflow com

随机推荐

  • CSS 模拟 Chrome 中的缩放

    我想模拟 Chrome 中的打印设置 比例 在 IE11 中 我添加了 css 这似乎修复了它 但在 Chrome 中却没有 page size A4 portrait margin 1mm 1mm 0 5mm 在 Chrome 中 我必须
  • ftplib连接SFTP服务器没有错误

    我前段时间创建了一个完整的FTP库 现在我想连接到 SFTP 服务器 据我在研究中发现 使用 ftplib 是不可能的 尽管如此 我尝试连接到仅限 SFTP 的服务器 它工作正常 没有任何问题 没有错误 也没有例外 现在我有点困惑 因为我不
  • data.table v1.9.5 (R) 中 shift() 函数的奇怪行为

    我正在使用当前的开发版本data table v1 9 5 很大程度上是因为它拥有出色的内置功能shift 功能 我注意到 当尝试将语句分组时data table呼叫 其中之一是呼叫shift 我从中得到了一些奇怪的行为 library d
  • 如果我在调用 JVM 时多次指定系统属性,则使用哪个值?

    如果我在调用 JVM 时多次指定系统属性 那么当我检索该属性时 我实际会得到哪个值 例如 java Dprop A Dprop B jar my jar 当我打电话时会得到什么结果System getProperty prop The Ja
  • 将字体大小应用于 img alt 属性而不影响图像大小

    您好 我正在尝试将字体大小设置为 img替代属性但它会影响图像大小 我正在 css 中做类似的事情 HTML Code img alt Some Text src http www someimage com img 010 jpg CSS
  • 我无法在命令窗口中创建 virtualenv 来运行 django 项目

    谁能帮我解决 Windows 10 64 位电脑上的 virtuaenv 问题 当我尝试使用 Windows Powershell 命令窗口创建虚拟环境来安装 Django 项目时 我反复收到此错误 错误消息 mkvirtualenv 术语
  • Redis Slave 无法与 Master 同步

    Redis 从站不会与主站同步 连接性 我发出去的时候可以连接到master HOST NAME fakehost redis cli h HOST NAME 并使用如下命令检查主状态INFO 因此连接性不是问题 设置 从奴隶箱中 我发出了
  • 使用 Espresso IdlingResource 进行 Android 测试

    我正在尝试测试AutoCompleteTextView将在输入一些单词后显示项目 但输入和显示弹出窗口之间存在延迟 首先我用的是Thread sleep 它工作得很好 但我知道这种方法并不明确 所以我试图用IdlingResource 但这
  • 在 NetBeans 中禁用自动构建

    我正在使用 Netbeans IDE 6 7 1 我希望禁用自动构建功能 或者以某种方式更改此自动构建线程的优先级 它总是在构建 并且大大减慢了我的计算机速度 我认为正因为如此 Netbeans 有时会占用我 80 左右的 CPU 我真的不
  • HTML/CSS:滚动条出现在 HTML 元素下方

    在 Chrome 和 Safari 中 垂直滚动条出现在页面上的 HTML 内容下方 如下所示 我摆弄着 webkit scrollbar 但我能得到的最接近的是将滚动条宽度更改为0px 该部分的 div 是 displayContent
  • 如何使用 php 获取 MySQL 数据库中的枚举可能值? [复制]

    这个问题在这里已经有答案了 可能的重复 Mysql 选择枚举值 https stackoverflow com questions 4644220 mysql select enum values 我已经设立了一个专栏Mysql type
  • 如何使用 php 从 HTML 创建 pdf 文件,然后将其保存在服务器上

    我有一个项目来保存用 php 动态创建的页面并将它们存储在服务器上 我计划将该页面的副本存储为 pdf 格式 以及他们所有的图像 表格和布局 我尝试使用这些工具 DOMPDF http eclecticgeek com dompdf doc
  • android动画可以改变视图的大小吗

    是否可以通过动画改变图像大小 我想要实现的是我有一个imageView 我想使用动画来调整它的大小 将其放大 就像我设置的那样200dip在xml文件中 动画之后它变成500dip 这可能吗 我到底应该使用什么方法 任何帮助和指导将不胜感激
  • 应用程序在后台时不显示 iOS UILocalNotification

    FIXED 好的 找到了 有一个错误 UIApplication sharedApplication cancelAllLocalNotifications 在我没有预料到的时候被解雇了 好吧 这就是你的问题 感谢大家的帮助 很抱歉这只是愚
  • PHP 脚本在超过 60 秒时执行两次

    好吧 在过去的 3 个小时里 我一直在绞尽脑汁地思考这个问题 疯狂地谷歌搜索 但没有解决问题 因此 我编写了一个示例脚本来重现这一点 因为我的原始脚本大约有 800 行
  • php-excel-reader 是否支持 xlsx

    我在用php excel reader 但读取时出错 xlsx文件 那么这个支持xlsx格式吗 或者还有什么其他可用的解决方案 我的要求只是读取文件 xls xlsx and ods 并在html页面上渲染 PHPExcel似乎太多了 因为
  • Java 中的“new”有什么作用?类加载器?

    我无法在 JLS JVMSpec 或 SO 中轻松找到它 我确信肯定有人问过 那么 新 到底有什么作用呢 假设我们在A中实例化一个类B class A new B 这相当于 class A A class getClassLoader lo
  • 当不在除 P、DIV、SPAN、TD 之外的 html 标签内时,jQuery 查找/替换 html 文本

    我有一个 html 文本片段 它是页面 DOM 的一部分 我需要在其上运行查找 替换 并且我需要一些帮助来找出创建查找 替换函数的最佳方法 例如 我想获取 id content 的 dom 对象的内容 并使用目标搜索短语运行查找替换 我需要
  • python 中使用 unicode 数据的 string.translate()

    我有 3 个 API 它们将 json 数据返回到 3 个字典变量 我正在从字典中取出一些值来处理它们 我在列表中读取了我想要的具体值valuelist 步骤之一是删除其中的标点符号 我通常使用string translate None s
  • 为什么斐波那契数在计算机科学中很重要?

    斐波那契数列 http en wikipedia org wiki Fibonacci number已经成为计算机科学专业学生对递归的流行介绍 并且有一个强有力的论据表明它们在自然界中持续存在 由于这些原因 我们许多人都熟悉它们 它们也存在