斐波那契搜索

2024-03-25

有人请解释一下斐波那契搜索算法。

我尝试了很多资源并进行了很多搜索,但算法仍然不清楚。大多数资源都在与二分搜索的链接中描述了它,但我不明白它们。我知道斐波那契搜索算法是二分搜索的扩展,我对此非常了解。

我的书也未能解释。

我知道斐波那契数定义为 F(n) = F(n-1) + F(n-2),所以无需解释。

通过添加我不明白的内容来更新问题,正如 @AnthonyLabarre 所说:

我正在使用的书有奇怪的符号,没有任何解释。在这里发布算法,请帮忙。

if(key == a[mid]) return mid; // understood this, comes from binary search
if(key > a[mid]) {
  if(p == 1) return -1; // What is p? It comes as a function arg
  mid = mid + q; //Now what's this q? Again comes a function arg
  p = p - q; // Commented as p=fib(k-4)
  q = q-p; // q = fib(k-5)
 } else // key < a[mid] {
  if(q == 0) return -1;
  mid = mid - q;
  temp = p - q;
  p = q; // p=fib(k-3)
  q = temp; // q = fib(k-4)
  return fibsearch(a, key, mid, p, q);
}

我会尽量让事情简短明了。假设你有一个已排序的数组A。该数组中的元素的值递增。您必须在该数组中找到特定元素。您希望将整个数组划分为子数组,以便访问时间i数组中的第一个元素不成正比i。这意味着一种非线性的更快的方法。来了斐波那契数列 http://en.wikipedia.org/wiki/Fibonacci_number在帮助中。斐波那契数列最重要的属性之一是“黄金比例 http://en.wikipedia.org/wiki/Golden_ratio“。您将数组划分为斐波那契数列索引处的子数组(0,1,1,2,3,5,8,13,21,34...)。

所以你的数组将被划分为像 A[ 那样的区间0]...A[1], A[1]...A[1], A[1]...A[2], A[2]...A[3], A[3]...A[5], A[5]...A[13], A[13]...A[21], A[21]...A[34], 等等。现在,由于数组已排序,只需查看任何分区的起始和结束元素就会告诉您您的数字位于哪个分区。因此,您遍历元素 A[0], A[1], A[2], A[3], A[5], A[8], A[13], A[21], A[34]...除非当前元素大于您要查找的元素。现在您确定您的数字位于当前元素和您访问的最后一个元素之间。

接下来,保留 A[ 中的元素f(i-1)]..A[f(i)],其中 i 是当前正在遍历的索引; F(x)是斐波那契数列,并重复相同的过程,除非找到您的元素。

如果你尝试计算复杂度 https://stackoverflow.com/questions/360748/computational-complexity-of-fibonacci-sequence/360773#360773采用这种方法,时间复杂度为 O(log(x))。这样做的优点是减少了搜索所需的“平均”时间。

我相信你应该能够自己写出代码。

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

斐波那契搜索 的相关文章

随机推荐

  • Mongoose 验证外键(参考)

    我尝试了几种不同的方法来验证 Mongoose 中的外键 但无法弄清楚 我有一个这样的架构 Doctors js var schema mongoose Schema email type String module exports mon
  • 使用 Django 上传表单清空 Request.FILES

    尝试使用非常简单的形式将文件上传到新的类实例中 我希望这两个文件都在request FILES但它是空的 我在捆绑的开发服务器上 被困在这里并解决了所有相关问题 wayfinder map media file request FILES
  • 复选框样式并使其选中

    从数据库检索到的复选框太长了 它是向下的 有什么办法使它成为四层 单击 所有字段 复选框时 必须选中所有复选框 这要怎么做呢 我的代码 protected function getConfigForm sql SELECT id order
  • 检查字符串中的字符是否都是唯一的

    我正在尝试使用 JS 通过数组来解决这个问题 var str abcdefgh for i 0 i lt 255 i arr i false function check for i 0 i lt str length i if arr s
  • 如何从实体管理器获取 jpa 数据源属性

    大家好 我想知道是否可以通过实体管理器获取数据库连接属性 我的 persistence xml 看起来像这样
  • 暂停事件在 PhoneGap iPhone 中无法正常工作?

    这是我的代码 This is an event that fires when a PhoneGap application is put into the background document addEventListener paus
  • Go 语言中的打印格式列表

    只是想知道使用 fmt 包的功能的打印格式列表 例如 v 用于打印值 T 可以打印值的类型 还有什么 动词 格式列表可在fmt 包的文档 http golang org pkg fmt General v the value in a de
  • 如何在.net6中使用WebApplicationFactory(没有可讲的入口点)

    在 ASP NET Core 6 中 默认模板将所有内容从Startup cs into Program cs 并使用 Program cs 中的顶级语句 因此不再有 可以说的 Program乙醚类 这看起来很棒 但现在 我需要测试所有这些
  • 在快速解析 Json 时无法将“NSNull”类型的值转换为“NSString”

    我有以下课程 class BannerResponse NSObject let URL Url let CONTACT NO ContactNo let IMAGE Image let BIG IMAGE BigImage let ID
  • 为什么 Evan 的调试器说我要转向 eax 而不是 rax?

    我正在将一些值移至 rax 但调试器显示它正在移至 eax 这是怎么回事 是用调试器 nasm 还是我的知识 无论如何 代码当然可以完美运行 我使用的调试器是 Evan s Debugger 简而言之 您和调试器都是正确的 当您将某物移动到
  • C++ 风格与性能?

    C 风格与性能 使用 C 风格的东西 比某些 C 等价物更快 这是不好的做法吗 例如 不要使用atoi itoa atol ETC 使用std stringstream 永远不要使用原始指针 而是使用智能指针 好吧 它们真的很有用 每个人都
  • QMediaplayer 无法在无框和半透明背景 PyQt5 上工作

    我正在使用 QMediaplayer 制作视频播放器 但它无法在无框和半透明背景窗口上工作 我想制作圆角窗口 所以我需要无框和半透明窗口 这是我的代码 from PyQt5 QtCore import Qt QUrl from PyQt5
  • Node.js 将图像通过管道传输到内存中并显示它

    我正在制作一个下载和显示图像的 Node js Electron 应用程序 我正在使用请求从互联网下载图像 我想将此图像保存在内存中并显示它 而不将文件保存在本地硬盘上 我知道我可以通过插入来完成我在这里提出的要求 img src url
  • 为什么初始化程序不能处理返回 list 的属性?

    找不到这个问题的答案 这一定是显而易见的 但仍然如此 我尝试在这个简化的示例中使用初始化程序 MyNode newNode new MyNode NodeName newNode Children Add smth mistake is h
  • 以串行对象作为参数的多进程

    我在使用 Python 并将串行对象作为参数传递给单独的进程时遇到问题 该程序在 Windows 8 中运行 因此不能选择使用全局变量 from multiprocessing import Queue from multiprocessi
  • 如何隐藏AG-Grid中的列?

    如何隐藏 AG Grid 中的列 并且它不应显示在工具面板中 var columnDefs headerName Stone ID field Stone ID width 100 hide true 您可以设置列属性抑制工具面板 http
  • 强制 VSProps 设置覆盖项目设置

    我有一个 vsprops 文件 它定义了针对 Visual Studio 2008 构建所有项目时应使用的优化 如果我将项目的属性设置为 从项目默认值的父级继承 它将起作用 并将它们填充到 vcproj 文件中 但是 这并不能保护我免受开发
  • R - 复制组内的值

    我有一个数据框 其中有某人在过去 3 年 2016 年 2017 年 2018 年 中获得的总分 还有他们每年的得分列 我的数据框如下所示 myDF lt data frame ID c 1 1 1 2 2 3 4 Dates c 2016
  • Rails 3 无效多字节字符 (US-ASCII)

    我发现了一个类似的帖子here https stackoverflow com questions 1739836 invalid multibyte char us ascii with ruby on rails但无论如何我都无法解决问
  • 斐波那契搜索

    有人请解释一下斐波那契搜索算法 我尝试了很多资源并进行了很多搜索 但算法仍然不清楚 大多数资源都在与二分搜索的链接中描述了它 但我不明白它们 我知道斐波那契搜索算法是二分搜索的扩展 我对此非常了解 我的书也未能解释 我知道斐波那契数定义为