搜索算法系列之四(斐波那契)

以下算法被验证过,如有什么问题或有补充的欢迎留言。

前言

斐波那契数列,又称黄金分割数列,是由意大利数学家(Leonardo Fibonacci)在1202年提出的。这个数列的递推关系是F(0)=1,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*),即每一项都是前两项的和。

斐波那契数列在自然界、数学、物理、工程技术和艺术等多个领域都有广泛的应用。

算法原理

斐波那契搜索算法是一种基于斐波那契数列的分割搜索技术,旨在优化查找过程的效率。它的原理可以概括如下:

  1. 斐波那契数列的选择

    • 首先,我们需要选择一个斐波那契数列,这个数列的长度应该比待搜索数组的长度略大。通常,选择的斐波那契数列是递增的,并且长度满足斐波那契数列的定义:每个数字是前两个数字之和。
  2. 计算斐波那契数列中的两个相邻数

    • 根据选定的斐波那契数列,计算相邻的两个斐波那契数列值,记为 fib1fib2
  3. 定义偏移量和搜索范围

    • 初始时,定义一个偏移量 offset 为 -1,表示初始搜索范围为整个数组。
    • 定义搜索范围的上限为 fib1n - 1 中较小的一个。
  4. 开始搜索

    • 在每一轮的搜索中,比较当前偏移量加上 fib2 的位置处的元素与待搜索的关键字。
    • 如果当前位置处的元素小于关键字,则说明关键字可能在当前位置的右侧,因此将搜索范围限制在右侧,并更新偏移量和斐波那契数列值。
    • 如果当前位置处的元素大于关键字,则说明关键字可能在当前位置的左侧,因此将搜索范围限制在左侧,并更新偏移量和斐波那契数列值。
    • 如果当前位置处的元素等于关键字,则搜索成功,返回当前位置的索引。
  5. 迭代搜索

    • 继续以上步骤,直到搜索范围缩小到只包含一个元素,或者直到找到关键字为止。

斐波那契搜索算法的核心思想在于通过斐波那契数列来定义搜索范围的分割点,从而实现更高效的搜索过程。与二分搜索类似,它也是一种分治策略,但相对于二分搜索,斐波那契搜索算法在某些情况下具有更好的效率,特别是当搜索的数组长度不是 2 的幂次方时。

代码实现(c)

#include <stdio.h>// 定义斐波那契搜索算法
int fibonacciSearch(int arr[], int n, int key) {int fib2 = 0; // (m-2)th Fibonacci numberint fib1 = 1; // (m-1)th Fibonacci numberint fib = fib1 + fib2; // mth Fibonacci number// 找到斐波那契数列中最接近数组长度的数while (fib < n) {fib2 = fib1;fib1 = fib;fib = fib1 + fib2;}int offset = -1; // 偏移量while (fib > 1) {int i = (offset + fib2) < (n - 1) ? (offset + fib2) : (n - 1);if (arr[i] < key) {fib = fib1;fib1 = fib2;fib2 = fib - fib1;offset = i;} else if (arr[i] > key) {fib = fib2;fib1 = fib1 - fib2;fib2 = fib - fib1;} else {return i; // 找到了,返回索引}}// 没有找到return -1;
}int main() {int arr[] = { 10, 22, 35, 40, 45, 50, 80, 82, 85, 90, 100 };int n = sizeof(arr) / sizeof(arr[0]);int key = 45;int index = fibonacciSearch(arr, n, key);if (index != -1) {printf("找到了数字 %d ,位于索引 %d 处。\n", key, index);} else {printf("未找到数字 %d 。\n", key);}return 0;
}

示例演示

说明假设:基于1的索引。目标元素x为85。阵列的长度n=11。
最小的斐波那契数大于或等于11是13。如图所示,fibMm2=5、fibMm1=8和fibM=13。
另一个实现细节是偏移量变量(初始化为零)。它标志着已经被淘汰的范围,从前面开始。我们将不定期更新它。
现在,由于offset值是一个索引,并且包括它和它下面的所有索引都已被消除,所以只需要向它添加一些东西。由于fibMm2标记了大约三分之一的数组,以及它标记的索引,肯定是有效的,我们可以将fibMm2添加到offset中,并检查索引i=min(offset+fibMm2,n)处的元素。

优点与局限性

优点:

  1. 时间复杂度较低: 斐波那契查找的时间复杂度为 O(log n),与二分查找一样,具有较高的查找效率。
  2. 适用性广泛: 与二分查找类似,斐波那契查找适用于有序数组,可以用于查找静态数据集。
  3. 比较次数较少: 在一些情况下,斐波那契查找比二分查找的比较次数更少,因此对于大型数据集或者查找次数较多的情况下,斐波那契查找可能更优。

缺点:

  1. 空间复杂度较高: 斐波那契查找需要额外的空间来存储斐波那契数列,因此在空间受限的情况下可能不太适用。
  2. 实现较复杂: 相对于简单的二分查找,斐波那契查找的实现较为复杂,需要计算斐波那契数列,并且需要考虑多个边界条件。
  3. 对数据结构要求高: 斐波那契查找要求数据集必须是有序的,对数据的插入、删除等操作会导致数据集无序,因此不太适用于动态数据集。

实际应用

https://www.mitrade.com/cn/insights/others/technical-analysis/fibonacci#/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/670512.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vscode 总是发现不到包package

Vscode 右下角&#xff0c;选择3.8.6就不再报错&#xff0c;其他最新版本的3.11.7就不行。

嵌入式学习67-C++(多线程,自定义信号合槽,串口通信)

知识零碎&#xff1a; QmessageBox 报错提示框 GPS传感器获取到的 经纬度信息并不是真实的物理坐标&#xff0c;还需要转换 signals&#xff1a; …

NEO 学习之session7

文章目录 选项 A&#xff1a;它涉及学习标记数据。 选项 B&#xff1a;它需要预定义的输出标签进行训练。 选项 C&#xff1a;它涉及在未标记的数据中寻找模式和关系。 选项 D&#xff1a;它专注于根据输入-输出对进行预测。 答案&#xff1a;选项 C 描述了无监督学习的本质&am…

杭电acm1013 Digital Roots 数字根 Java解法 高精度

Problem - 1013 (hdu.edu.cn) 高精度算术模拟 开long没过想到开bI 开bl一次过 import java.math.BigInteger; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);BigInteger i;while (!(i sc.nextB…

部署Gerapy

1.Gerapy 是什么&#xff1f; Gerapy 是一款基于 Python 3 的分布式爬虫管理框架&#xff0c;它旨在简化和优化分布式爬虫的部署、管理和监控过程。 2.作用与功能&#xff1f; 2.1分布式管理&#xff1a; Gerapy 允许用户在多台机器上部署和管理Scrapy爬虫&#xff0c;实现爬虫…

Nftables漏洞原理分析(CVE-2022-32250)

前言 在nftales中存在着集合(sets)&#xff0c;用于存储唯一值的集合。sets 提供了高效地检查一个元素是否存在于集合中的机制&#xff0c;它可以用于各种网络过滤和转发规则。 而CVE-2022-32250漏洞则是由于nftables在处理set时存在uaf的漏洞。 环境搭建 ubuntu20 QEMU-4…

MySQL数据库—DQL查询语句(一篇教会你快速找到想要的数据)

目录 ▐ 特定列查询 ▐ 逻辑处理 ▐ 字符函数操作 ▐ 分组函数统计 ▐ 数学函数 ▐ 日期函数 ▐ 条件查询 ▐ 排序 ▐ 数量限制 ▐ 合并 ▐ 分组查询 ▐ 前言&#xff1a; • DQL全称 Data Query Language 数据查询语言 • 可以从一个表中查询数据&#xff0c;也…

连锁收银系统批量调整商品价格教程

1、进入系统后台&#xff0c;系统后台登录网址&#xff1a; 2、点击商品>商品调价 3、将按模板整理好的商品价格数据导入即可。 Tips&#xff1a;每次导入的商品数量不要超过6000 条。

PHP基于B/S版 医院不良事件管理系统源码vscode+laravel8医院如何加强不良事件上报系统的管理 AEMS系统源码

PHP基于B/S版 医院不良事件管理系统源码vscodelaravel8医院如何加强不良事件上报系统的管理 AEMS系统源码 医院安全&#xff08;不良&#xff09;事件管理AEMS系统AEMS采用无责的、自愿的填报不良事件方式&#xff0c;有效地减轻医护人员的思想压力&#xff0c;实现以事件为主要…

ShardingSphere 5.x 系列【30】影子库

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 影子库与全链路压测2. 核心概念3. 使用限制4. 执行原理4.1 DML 语句4.2 D…

【driver2】设备读写,同步和互斥,ioctl,进程休眠,时间和延时,延缓

文章目录 1.实现设备读写&#xff1a;write函数中一个进程写没问题&#xff0c;两进程写&#xff1a;第一个进程运行到kzalloc时&#xff0c;第二个进程也执行了kzalloc&#xff0c;只第二个进程地址保存在c中&#xff0c;第一个进程分配内存空间地址丢失造成内存泄漏。第一个进…

[渗透利器]全能工具=信息收集->漏洞扫描->EXP调用

前言 hxd开发的工具&#xff0c;大致模块有&#xff08;信息收集&#xff0c;漏洞扫描&#xff0c;暴力破解&#xff0c;POC/EXP&#xff0c;常用编码&#xff09; 工具使用 下载后解压 安装环境 pip install -r requirements.txt 注意&#xff0c;该工具继承了两种不同的使…