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

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(使用前将#替换为@)

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

  • 用于插入/删除/排名/选择查询的最佳数据结构/算法

    到目前为止 我知道像AVL树和红黑树这样的自平衡BST可以在O log n 次内完成这些操作 然而 要使用这些结构 我们必须自己实现AVL树或RB树 我听说有一个算法 实现这四个操作而不使用自平衡 BST 有了我们自己定义的结构 我们就需要
  • 稀疏矩阵中的最大和子矩形

    求一个子矩形中的最大和NxN矩阵可以完成O n 3 正如其他帖子中指出的 使用 2 d kadane 算法的时间 然而 如果矩阵是稀疏的 具体来说O n 非零条目 可以O n 3 时间被打败了吗 如果有帮助的话 对于我感兴趣的当前应用程序
  • 在无向图中查找强连通分量

    我想在无向图中找到强连接的组件 即如果我从节点开始A然后我会回到节点A并且每条边都被恰好访问一次 对于有向图可以使用Tarjan算法来寻找强连通分量 但是对于无向图怎么办 我认为您错过了强连通分量的含义 强连接组件 如果所有顶点对之间都存在
  • 哪种数据聚类算法适合检测时间序列事件中未知数量的聚类?

    这是我的场景 考虑在不同地点和时间发生的一组事件 例如 考虑有人在高空记录暴风雨期间城市中的雷击 就我的目的而言 闪电是瞬时的 只能击中某些位置 例如高层建筑 还可以想象每次雷击都有一个唯一的 ID 以便以后可以参考该雷击 这个城市大约有1
  • 按度数在圆上找到一个点?

    假设我们有一个 100x100 坐标系 如下所示 0 0 是它的左上角 50 50 是它的中心点 100 100 是它的右下角 等等 现在我们需要从中心向外画一条线 我们知道线的角度 但需要计算其终点的坐标 您认为最好的方法是什么 例如 如
  • 按百分比减少多边形面积

    我有一个由点 x y 组成的多边形 我想做的是将其减少一个百分比 请记住 我不想只是扩大规模 多边形应该有一种内部边界 其宽度取决于百分比 该内部边界被多边形切断 谁知道可以实现这一目标的算法 输入 点数组 百分比 输出 点数组 你所寻求的
  • Java:如何实现3和?

    我正在研究 3 Sum 来自己实现它 并遇到了以下规则的实现 给定一个由 n 个整数组成的数组 S S 中是否存在满足 a b c 0 的元素 a b c 查找数组中所有总和为零的唯一三元组 注意 三元组 a b c 中的元素必须按非降序排
  • 从 python 中的缩进文本文件创建树/深度嵌套字典

    基本上 我想迭代一个文件并将每行的内容放入一个深层嵌套的字典中 其结构由每行开头的空格数量定义 本质上 目标是采取这样的事情 a b c d e 并将其变成这样的东西 a b c d e Or this apple colours red
  • 使用数学符号注释 Adob​​e Reader PDF

    我阅读的许多数学教科书和其他文献都是 PDF 格式 因此我经常使用 Adob e Reader 注释工具对它们进行注释 我确实找到了一个有用的指南 http cjasn asnjournals org site misc annotatin
  • 使到 n 个点的集合的欧氏距离之和最小的点

    我有一组点W x1 y1 x2 y2 xn yn 在 2D 平面上 你能找到一种算法 将这些点作为输入并返回一个点 x y 在 2D 平面上 距以下点的距离之和最小W 换句话说 如果 di Euclidean distance x y xi
  • 什么时候使用哈希表?

    什么情况下使用哈希表可以提高性能 什么情况下不能 哪些情况不适合使用哈希表 什么情况下使用哈希表可以提高性能 什么情况下不能 如果您有理由关心 请使用哈希表和您正在考虑的其他任何内容来实现 将您的实际数据放入其中 并衡量哪个性能更好 也就是
  • 使用FFT算法计算

    给定在平面上的点 1 0 2 0 n 0 上发现的一组 n 个粒子电荷载流子 在 i 0 点发现的粒子电荷记为 Qi 作用在粒子上的力由以下公式给出 C is a Coulomb s constant 给出一个算法来计算 Fi 对于总复杂度
  • 从日志文件中获取前 100 个 URL

    我的一位朋友在接受采访时被问到以下问题 谁能告诉我如何解决它 我们有一个相当大的日志文件 大约 5GB 日志文件的每一行都包含一个用户在我们网站上访问过的 URL 我们想要找出用户访问最多的 100 个 URL 怎么做 如果我们有超过 10
  • 在 O(n) 时间内找到 n x n 矩阵中的局部最小值

    所以 这不是我的家庭作业问题 而是取自 coursera 算法和数据结构课程的未评分作业 现已完成 You are given an n by n grid of distinct numbers A number is a local m
  • 节点*链表中的下一个

    我是数据结构和算法的新手 我遇到了以下代码 typedef struct node int data node next 谁能告诉我为什么我们要声明节点 next next 不能声明为 int next 吗 因为你希望能够做到n gt ne
  • 如何高效地在屏幕上精确绘制N个点?

    这听起来是一个简单的问题 但我发现要获得良好的性能是非常棘手的 我提出的第一个算法是随机绘制点 从一组中检查是否已绘制 否则绘制 如果我们只绘制几个点 那么这种方法效果很好 但当我们接近填满屏幕时 速度会灾难性地减慢 我想出的最好的方法是构
  • java数据结构模拟数据树

    我需要帮助定义使用什么方法 我有一个 SOAP 响应 给我一个 xml 文件 我需要在屏幕上显示 3 个相关列表 当您在第一个列表中选择一个项目时 相应的选择将出现在第二个列表中 依此类推 我只对从 xml 流中提取数据后如何有效地组织数据
  • 如何确定算法函数的复杂度?

    您如何知道算法函数对于特定操作是否需要线性 常数 对数时间 它取决于CPU周期吗 您可以通过三种方式 至少 做到这一点 在网上查找算法 看看它是如何描述其时间复杂度的 根据输入大小 自己检查算法 查看嵌套循环和递归条件等内容 以及每个循环运
  • 如何将一组重叠范围划分为不重叠范围?

    假设您有一组范围 0 100 一 0 75 b 95 150 c 120 130 d 显然 这些范围在某些点上重叠 您将如何剖析这些范围以生成不重叠范围的列表 同时保留与其原始范围相关的信息 在本例中为范围后面的字母 例如 运行算法后的上述
  • 点集子集的最小周长凸包

    给定平面上的 n 个点 没有 3 个共线 给定数字 k 找到 k 个点的子集 使得 k 个点的凸包在 k 个点的子集的任何凸包中具有最小周长 我可以想到一个简单的方法 运行时间为 O n k k log k 找到大小为 k 的每个子集的凸包

随机推荐

  • 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已经成为计算机科学专业学生对递归的流行介绍 并且有一个强有力的论据表明它们在自然界中持续存在 由于这些原因 我们许多人都熟悉它们 它们也存在