查找算法之斐波那契查找

news/2024/5/18 12:49:53

目录

  • 前言
  • 一、查找算法预备知识
  • 二、斐波那契查找
  • 三、总结
    • 3.1 查找性能
    • 3.2 适用场景


前言

查找算法是一种用于在数据集合中查找特定元素的算法。在计算机科学中,查找算法通常被用于在数组、链表、树等数据结构中查找目标元素的位置或者判断目标元素是否存在。
查找算法的目标是在尽可能短的时间内找到目标元素,以提高程序的效率和性能。常见的查找算法包括但不限于二分查找、哈希表查找、线性查找、二叉查找树等。

一、查找算法预备知识

查找算法分类

1)静态查找和动态查找;
注:静态或者动态都是针对查找表而言的。动态表指查找表中有删除和插入操作的表。
2)无序查找和有序查找。
无序查找:被查找数列有序无序均可;
有序查找:被查找数列必须为有序数列。

平均查找长度(Average Search Length,ASL)
需和指定key进行比较的关键字的个数的期望值,称为查找算法在查找成功时的平均查找长度。
对于含有n个数据元素的查找表,查找成功的平均查找长度为:ASL = Pi*Ci的和。

Pi:查找表中第i个数据元素的概率。
Ci:找到第i个数据元素时已经比较过的次数。

二、斐波那契查找

斐波那契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、・・・・,在数学上,斐波那契被递归方法如下定义:F (1)=1,F (2)=1,F (n)=f (n-1)+F (n-2) (n>=2)。该数列越往后相邻的两个数的比值越趋向于黄金比例值(0.618)。

斐波那契查找就是在二分查找的基础上根据斐波那契数列进行分割的。在斐波那契数列找一个等于略大于查找表中元素个数的数 F [n],将原查找表扩展为长度为 F[n](如果要补充元素,则补充重复最后一个元素,直到满足 F[n] 个元素),完成后进行斐波那契分割,即 F [n] 个元素分割为前半部分 F [n-1] 个元素,后半部分 F [n-2] 个元素,找出要查找的元素在那一部分并递归,直到找到。
通过利用黄金分割原理来确定查找的位置。与二分查找类似,但是斐波那契查找对比较次数的期望值略低于二分查找。

算法步骤:

  • 构建斐波那契数列,直到数列中的最大值大于等于要查找的数组长度。
  • 找到最接近且不超过数组长度的斐波那契数值,记为F(k)。
  • 根据F(k)将原数组扩展为长度为F(k)的新数组,将多出的元素用原数组中最后一个元素填充。
  • 初始化两个指针low和high,分别指向数组的起始和结束位置。
  • 计算中间位置的索引mid,根据目标值与arr[mid]的大小关系,更新low和high指针的位置。
  • 重复以上步骤,直到找到目标元素或者low > high为止。
  public static int[] fibonacci(){int[] f = new int[20];int i =0;f[0] = 1;f[1] = 1;for(i=2;i<MAXSIZE;i++){f[i] = f[i-1]+f[i-2];}System.out.println(Arrays.toString(f));return f;}public static int fibonacciSearch(int[] data,int key){int low = 0;int high = data.length-1;int mid = 0;//斐波那契分割数值下标int k = 0;//序列元素个数int i=0;// 获取斐波那契数列int[] f = fibonacci();//获取斐波那契分割数值下标while(data.length>f[k]-1){k++;}//创建临时数组int[] temp = new int[f[k]-1];for(int j=0;j<data.length;j++){temp[j] = data[j];}//序列补充至f[k]个元素//补充的元素值为最后一个元素的值for(i=data.length;i<f[k]-1;i++){temp[i]=temp[high];}for(int j:temp){System.out.print(j+" ");}System.out.println();while( low <= high ){// low:起始位置// 前半部分有f[k-1]个元素,由于下标从0开始// 则-1 获取 黄金分割位置元素的下标mid = low + f[k-1] - 1;if( temp[mid] > key ){// 查找前半部分,高位指针移动high = mid - 1;//将 k 减去 1,表示我们要查找前半部分。// 因为前半部分有 f[k-1] 个元素,所以我们更新 k = k - 1;。k = k - 1;}else if( temp[mid] < key ){// 查找后半部分,低位指针移动low = mid + 1;//将 k 减去 2,表示我们要查找后半部分。// 因为后半部分有 f[k-2] 个元素,所以我们更新 k = k - 2;。k = k - 2;}else{//如果为真则找到相应的位置if( mid <= high ){return mid;}else{//出现这种情况是查找到补充的元素//而补充的元素与high位置的元素一样return high;}}}return -1;}public static void test4() {int[] arr = {12, 11, 15, 50, 7, 65, 3, 99,100,101};bubbleSort(arr);System.out.println(Arrays.toString(arr));int result = fibonacciSearch(arr, 101);if (result != -1) {System.out.println("目标元素 " + 101 + " 在数组中的索引位置为: " + result);} else {System.out.println("目标元素 " + 101 + " 未找到");}}

在这里插入图片描述

三、总结

3.1 查找性能

平均情况下,时间复杂度为O(log n)。
最坏情况下,时间复杂度为O(log n)。
空间复杂度为O(1)。

3.2 适用场景

  • 数据量较大:当数据量较大时,斐波那契查找的效率优于二分查找。
  • 数据分布不均匀:对于数据分布不均匀的情况,斐波那契查找能够更快地定位目标元素。
  • 有序数组:适用于有序数组,可以在较短时间内找到目标元素。

参考链接:
斐波那契查找(黄金分割法查找)


http://www.mrgr.cn/p/61101662

相关文章

javaweb-maven

前端HTML,CSS,JS,Vue&#xff0c;Element&#xff0c;Nginx最后去复习&#xff0c; Java开发工程师 主要学习方向是服务端 所以进入javaweb的服务端的第一个知识点 maven 什么是maven 用于管理和构建java项目的工具 maven的官方网站 Maven – Welcome to Apache Maven …

邮件营销工具如何提升营销效果?如何选择?

邮件营销工具的核心功能&#xff1f;怎么确保营销工具的安全性&#xff1f; 如何有效地进行营销推广成为了每个企业关注的焦点。其中&#xff0c;邮件营销工具因其针对性强、成本较低的特点&#xff0c;成为了企业推广的重要手段。那么&#xff0c;邮件营销工具如何提升营销效…

怎么在电脑桌面上添加待办事项?

对于上班族来说,每天面对繁杂的工作任务,很容易遗漏或混淆重要事项。因此,在电脑桌面上添加待办事项清单显得尤为重要。这样做的好处是,能够随时查看和跟进任务,确保每项工作都能按时完成。例如,将一天中的关键会议、提交报告的时间节点、需要联系的客户等事项清晰列出,…

推荐一款好用的文档工具:docsify

docsify是什么 docsify 可以快速帮你生成文档网站。不同于 GitBook、Hexo 的地方是它不会生成静态的 .html 文件,所有转换工作都是在运行时。如果你想要开始使用它,只需要创建一个 index.html 就可以开始编写文档并直接部署在 GitHub Pages。编写一些团队内部研发规范、api接…

Seurat -- Introduction to scRNA-seq integration 跟随学习记录

文章目录 数据是如何转换的原始ifnb数据对象Splits object后的数据对象数据对象构建完成后的标准流程Normalization后的数据对象scale 后的数据对象 不同的样本进行整合JoinLayers干了什么 数据是如何转换的 seurat object 中assays R N A l a y e r s RNAlayers RNAlayersco…

打造灵活可配置的凉鞋ERP以适应不同业务需求

为了满足客户需求和提高客户满意度,企业需要有一套高效、准确的订单管理系统。顺通订单助手正是这样一款能够满足企业需求的订单管理工具,本文将深入探讨顺通订单助手的各项功能及如何提升客户满意度。顺通订单助手的最大优势在于其高效的处理能力。这种高效的处理能力减少了…

【精简改造版】大型多人在线游戏BrowserQuest服务器Golang框架解析(2)——服务端架构

1.架构选型 B/S架构&#xff1a;支持PC、平板、手机等多个平台 2.技术选型 &#xff08;1&#xff09;客户端web技术&#xff1a; HTML5 Canvas&#xff1a;支持基于2D平铺的图形引擎 Web workers&#xff1a;允许在不减慢主页UI的情况下初始化大型世界地图。 localStorag…

【多线程】JUC的常见类 | Callable接口 | ReentranLock | 线程安全的集合类

文章目录 一、JUC的常见类1.Callable接口2.ReentranrLock1.ReentranLock的优势1.两种加锁方法2.提供了公平锁的实现3.提供了更强大的等待通知机制。 二、线程安全的集合类1.多线程环境使用ArraList1.synchronizedList2.CopyOnWriteArrayList写时拷贝。局限性&#xff1a; 2.多线…

如何通过文件外发管理系统,保护企业机密数据不外泄?

在互联网时代,企业与外界进行频繁的信息沟通已成为必要的一种业务模式,而在交互的过程中很可能会涉及到企业的相关敏感信息,一旦不慎流出就将会面临失控的风险。像员工在掌握了公司的关键信息后另起炉灶,设立同类型公司,成为“老东家”的竞争对手;不法企业以高薪为诱饵,…

光学雨量计:高精度测量降水量的理想解决方案

光学雨量计:高精度测量降水量的理想解决方案 河北稳控科技光学雨量计是一种高精度测量降水量的理想解决方案。它利用光学原理,通过光束的衰减来测量降雨强度和累积降水量。相比传统的雨量计,光学雨量计具有更高的精度和可靠性,成为现代气象观测的重要工具。 传统的雨量计通…

HarmonyOS NEXT应用开发案例—状态栏显隐变化

介绍 本示例介绍使用Scroll组件的滚动事件 onScroll 实现状态栏显隐变化。该场景多用于各种软件的首页、我的等页面中。 效果预览图使用说明加载完成后显示状态栏显隐变化页面,上下拖动屏幕,顶端状态栏出现显隐变化。实现思路在置顶位置使用stack组件添加两层状态栏。 源码参…

昨晚坐地铁看到一个程序员哥们哭了……

​ 昨晚做地铁,看见一个哥们掩面痛哭,一看就是同行,我感慨发了个朋友圈……评论10个人7个评的是”被裁“了嘛,还有3个说是不是失恋了…… ✅顺便提供个不错的机会,部门也在捞人,前后端均可投 作为一名软件工程师,我深知在这个数字化时代,技术更新换代的速度远超我们的想…

重磅新品发布!云耀数据库HRDS,享受轻量级的极致体验

2024年4月30日云耀数据库HRDS将在北京、上海、广州、中国香港、新加坡正式商用本文分享自华为云社区《重磅新品发布!云耀数据库HRDS,享受轻量级的极致体验!》,作者:GaussDB 数据库。所谓,凡有井水处,即能歌柳词。 大数据时代,凡有数据处,必有数据库。随着业务需求的不…

uniapp使用z-paging插件

1.通过dcloud插件市场下载,导入Hbuiderx,参考官网: https://z-paging.zxlee.cn/start/install.html#%E9%80%9A%E8%BF%87%E6%8F%92%E4%BB%B6%E5%B8%82%E5%9C%BA%E5%AE%89%E8%A3%85 2.通过npm下载(uniapp小程序项目发现通过npm下载方式,主包体积比方式1小,所以使用)npm insta…

Flutter 插件站新升级: 加入优秀 GitHub 开源项目

Flutter 插件站新升级: 加入优秀 GitHub 开源项目 视频 https://youtu.be/qa49W6FaDGs https://www.bilibili.com/video/BV1L1421o7fV/ 前言 原文 https://ducafecat.com/blog/flutter-awesome-github-repo-download 这几天晚上抽空把 Flutter 插件站升级&#xff0c;现在支…

自动生成数据库设计文档,支持多数据源批量生成(Word文档)

在做项目时通常使用PowerDesigner设计数据库,但在项目完成交付项目给客户的时候常常需要一份Word版本的数据库文档给客户,你不能指望每个客户都会用PowerDesigner,所以基于当前开发数据库生成数据库文档就是最佳选择,如果手动编写数据库文档那将是一件非常痛苦的费力不讨好…

IDEA中使用密钥认证的方式通过ssh连接远程服务器

在Windows电脑上生成证书 确保电脑上ssh可用ssh命令可用的话,就继续在命令行窗口输入ssh-keygen -t rsa并敲击回车键生成公钥证书和私钥证书文件。生成的目录也指明了,通常在用户的.ssh目录下,其中id_rsa是私钥证书文件,id_rsa.pub为公钥证书文件。将公钥证书放到Linux服务…

园子周边第3季-博客园T恤:设计初稿第3版预览

在鼠标垫之后,T恤是园子周边的重头戏,而设计是重头戏中的难题,不仅众口难调,而且要求更高,不像鼠标垫放在桌上,这可是要穿在身上。 虽然设计挑战高,但我们没有被吓倒,甚至痴心妄想设计出独到,让园子里的T恤有不一样的味道,于是借鉴鼠标垫的一点骄傲,继续让星星成为主…

一键实现风险识别+处理,天翼云AOne助手尽在“掌”握!

随着企业数字化建设的不断加速,优化站点性能与响应速度成为当今时代的一个重要课题。对于政务、金融类机构来说,其门户网站、信用卡中心等代表着对外形象,如果出现访问不通或者时延严重的现象将影响业务办理效率以及机构的公信力。为进一步保障业务可靠性,企业需要对站点业…