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

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

前言

斐波那契数列,又称黄金分割数列,是由意大利数学家(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.mzph.cn/diannao/7144.shtml

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

相关文章

【数据库】docker搭建mysql8一主两从节点,配置proxysql读写分离

docker搭建mysql8一主两从节点&#xff0c;配置proxysql读写分离 一、docker 搭建 mysql8 一主两从节点1.1 相关配置文件与docker启动1.2 半同步复制1.3 主从同步异常处理 二、mysql 中间件 ProxySql 配置读写分离2.1 在mysql服务里创建给proxySQL访问的用户2.2 安装ProxySql及…

测试用例执行的结果pass_fail_block_skip

pass fail block skip 测试用例的执行结果通常包括以下几个方面&#xff1a; 1. **测试结果状态**&#xff1a;通常分为“通过”、“失败”、“阻塞”和“跳过”等状态。 - **通过**&#xff1a;测试用例执行完毕&#xff0c;预期结果与实际结果一致。 - **失败**&am…

【MySQL】——用户和权限管理(二)

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

大模型争霸的下一站:不仅是超越GPT-4,更是寻求模型之间的平衡应用

文 | 智能相对论 作者 | 沈浪 知名科学杂志《Nature》发表了一篇关于大模型规模参数大小争议的文章《In Al, is bigger always better?》——AI大模型&#xff0c;越大越好吗&#xff1f;随着大模型应用走向实践&#xff0c;这一问题不可避免地成为了当前AI行业发展的焦点与…

OpenGL 入门(二)—— 渲染摄像头采集的预览画面

本篇主要内容&#xff1a; 将摄像头采集到的图像通过 OpenGL 绘制到屏幕上FBO 离屏渲染 在开始上述流程前&#xff0c;我们有必要对 SurfaceTexture 做一个简单了解&#xff0c;因为 OpenGL 需要通过它获取要绘制的图像。 1、认识 SurfaceTexture SurfaceTexture 是 Androi…

(论文阅读-优化器)Selectivity Estimation using Probabilistic Models

目录 摘要 一、简介 二、单表估计 2.1 条件独立Condition Independence 2.2 贝叶斯网络Bayesian Networks 2.3 查询评估中的贝叶斯网络 三、Join选择性估计 3.1 两表Join 3.2 概率关系模型 3.3 使用PRMs的选择性估计 四、PRM构建 4.1 评分标准 4.2 参数估计 4.3 结…

堡垒机——网络技术手段

目录 一、简介 1.什么是跳板机 2.跳板机缺陷 3.什么是堡垒机 4.为什么要使用堡垒机 4.1堡垒机设计理念 4.2堡垒机的建设目标 4.3堡垒机的价值 4.4总结 5.堡垒机的分类 6.堡垒机的原理 7.堡垒机的身份认证 8.堡垒机的运维方式常见有以下几种 9.堡垒机其他常见功能…

基于springboot+vue+Mysql的在线动漫信息平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

大数据分析入门之10分钟掌握GROUP BY语法

前言 书接上回大数据分析入门10分钟快速了解SQL。 本篇将会进一步介绍group by语法。 基本语法 SELECT column_name, aggregate_function(column_name) FROM table_name GROUP BY column_name HAVING condition假设我们有students表&#xff0c;其中有id,grade_number,class…

网络文件共享

存储类型分三类 直连式存储&#xff1a;DAS存储区域网络&#xff1a;SAN网络附加存储&#xff1a;NAS 三种存储架构的应用场景 DAS虽然比较古老了&#xff0c;但是还是很适用于那些数据量不大&#xff0c;对磁盘访问速度要求较高的中小企业SAN多适用于文件服务器&#xff0c…

C/C++ BM33 二叉树的镜像

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 总结 前言 镜像说的好听&#xff0c;无非就是换下节点。 题目 操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像。 数据范围&#xff1a;二叉树的节点数 0 ≤ n ≤ 1000 0≤n≤1000 0≤n≤1000&#xff0c; 二叉树每…

华为ensp中USG6000V防火墙双机热备VRRP+HRP原理及配置

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年5月6日20点26分 华为防火墙双机热备是一种高可用性解决方案&#xff0c;可以将两台防火墙设备组成一个双机热备组&#xff0c;实现主备切换。当主用防火墙出现故障时&…

景源畅信:抖音运营做什么工作内容?

在如今这个信息爆炸的时代&#xff0c;抖音已经成为了人们生活中不可或缺的一部分。无论是消磨时间、获取信息还是展示自我&#xff0c;抖音都扮演着重要的角色。那么&#xff0c;作为抖音运营&#xff0c;他们需要做些什么呢? 一、内容策划与制作 抖音运营的首要任务就是内容…

【动态规划】路径问题

1.不同路径 不同路径 思路&#xff1a; 状态表示 状态转移方程 class Solution { public:int uniquePaths(int m, int n) {// 创建dp表// 初始化// 填表// 返回值vector<vector<int>> dp(m 1, vector<int>(n 1));dp[0][1] 1;for(int i 1; i < m; i…

【数据结构】C++语言实现栈(详细解读)

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

AI预测体彩排3第3套算法实战化赚米验证第2弹2024年5月6日第2次测试

由于今天白天事情比较多&#xff0c;回来比较晚了&#xff0c;趁着还未开奖&#xff0c;赶紧把预测结果发出来吧~今天是第2次测试~ 2024年5月6日排列3预测结果 6-7码定位方案如下&#xff1a; 百位&#xff1a;2、3、1、5、0、6 十位&#xff1a;4、3、6、8、0、9 个位&#xf…

4.任务创建和删除的API函数

一、简介 二、动态创建任务函数:xTaskCreate() 此函数用于使用动态的方式创建任务&#xff0c;任务的任务控制块以及任务的栈空间所需的内存&#xff0c;均由 FreeRTOS 从 FreeRTOS 管理的堆中分配&#xff0c;若使用此函数&#xff0c;需要在 FreeRTOSConfig.h 文件 中将宏 c…

【智能算法】PID搜索算法(PSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2023年&#xff0c;Y Gao受到PID控制理论启发&#xff0c;提出了PID搜索算法&#xff08;PID-based Search Algorithm, PSA&#xff09;。 2.算法原理 2.1算法思想 PID算法是控制领域的…

安卓应用开发(一):工具与环境

开发工具 Android Studio&#xff0c;用于开发 Android 应用的官方集成开发环境 (IDE)。包括以下功能&#xff1a; 基于Gradle的构建系统 gradle是一个项目构建工具&#xff0c;将源工程打包构建为apk 安卓模拟器统一环境代码编辑模拟器实时更新Github集成Lint功能&#xff0…

4+1视图,注意区分类图与对象图

注意区分类图和对象图。对象图标记的是对象名&#xff0c;命名形式 对象名:类名&#xff0c;或者:类名。这里没有出现冒号&#xff0c;表示的是类图。 对象图(object diagram)。 对象图描述一组对象及它们之间的关系。对象图描述了在类图中所建立的事物实例的静态快照。和类图一…