对比分析折半查找与Fibonacci查找算法

①二分查找算法

算法思想:

首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较

如果两者相等,则查找成功;

否则利用中间位置记录将表分成前、后两个子表,

如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,

否则进一步查找后一子表。

重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

例:假设已知有序数组为{1,2,4,5,7,8,11,12,15,19,21},查找元素为11,则查找过程如下。


算法时间复杂度:O(log n)

代码实现:

int search(int guan[], int imp, int n)
{int mid;int low = 1, high = n;while (low <= high){mid = (low + high) / 2;if (imp == guan[mid])return mid;else if (imp < guan[mid])high = mid - 1;else if (imp > guan[mid])low = mid + 1;}return 0;
}

②Fibonacci查找算法

斐波那契查找也要求数据是有序的。斐波那契查找采用和二分查找相似的区间分割策略,都是通过不断的分割区间缩小搜索的范围。不过它的分割方法不是二分查找中原有的中值 mid 的求解方式,其 mid 不再代表中值,而是代表了黄金分割点,要搞清楚这一点,我们先要介绍Fibonacci数列;

Fibonacci数列:

又名黄金分割数列(因为它的前一项与后一项的比值随着数字数量的增多逐渐逼近黄金分割比值0.618)

斐波那契数列以如下递推的方法定义:
F(0)=0,F(1)=1,F(n)=F(n−1)+F(n−2)(n≥2,n∈N∗)F(0)=0, F(1)=1, F(n)=F(n−1)+F(n−2)(n≥2,n∈N∗) F(0)=0,F(1)=1,F(n)=F(n−1)+F(n−2)(n≥2,n∈N∗)
斐波那契数列从第三项开始,每一项都等于前两项之和

例如: F = { 1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , . . . }

Fibonacci查找算法的思想

根据斐波那契数列的特点,而我们可以利用它来做区间分割:可以将一个长度为 F(n) 的数组看作左右两数组,左边数组长度是 F(n-1),右边数组长度是 F(n-2)。

那如何找到这个中间值mid呢?

不难看出,它就等于最左边的位置+F(n-1)

但是数组元素下标从0开始,所以要**-1**

故斐波那契查找算法的查找点的计算公式如下:

mid=left+F(n−1)−1m i d = l e f t + F ( n − 1 ) − 1 mid=left+F(n−1)−1

所以,对于每一个数组,我们首先需要确认它的长度是不是Fibonacci数列中的一个数F(n),如果是,我们计算它的mid位置,就可以把它分成F(n-1)和F(n-2)

那如果不是怎么办呢?

我们可以找到比它的长度大的最小的Fibonacci数F(n),把它扩充成为一个长度为F(n)的数组,可以把它的最后一个元素补充到原数组后面,直到长度等于F(n)为止。

例:

接下来,我们就可以计算mid值,进行分割数组了,具体步骤如下:

斐波那契查找的基本步骤

①构建斐波那契数列;
②找出数组长度对应的斐波那契数列中的元素 F(n);
③如果数组长度小于斐波那契数列中对应的元素 F(n) 的值,则补充数组;
④确定查找点 mid = left+F(n-1)-1
⑤判断中间值 a[mid] 和目标值的关系:
如果目标值小于中间值,说明目标值在左边。舍弃右边,对左边执行 4、5 两步(这时left=left,n=n-1);
如果目标值大于中间值,说明目标值在右边。舍弃左边,对右边执行 4、5 两步(这时left=left+F(n-1),n=n-2);
如果目标值等于中间值,说明找到了目标值。但此时还需判别该目标值是原数组中的元素还是补充的元素:
如果是原数组中的元素,直接返回位置;
如果是补充元素,则返回length-1;

结束条件:数组不可再分。

举例:数组:{1,2,4,8,9,15,27},查找元素8

代码实现:
public static int fibonacciSearch(int[] arr, int findValue){int i = 0, mid,left = 0, right = arr.length-1; int[] fibonacci = getFibonacci(20);while(fibonacci[i] < arr.length){i++;}int[] temp = Arrays.copyOf(arr, fibonacci[i]);for (int j=arr.length; j<temp.length; j++){temp[j] = arr[arr.length-1];}while (left <= right){mid = left + fibonacci[i-1]-1;  if (temp[mid] < findValue){ left = mid + 1; i -= 2;}else if (temp[mid] > findValue){    right = mid - 1;i -= 1;}else{ if (mid <= right){  return mid;}else{  return right;}}}return -1;
}
public static int[] getFibonacci(int maxSize){int[] fibonacci = new int[maxSize];fibonacci[0] = 0;fibonacci[1] = 1;for (int i=2; i<maxSize; i++){fibonacci[i] = fibonacci[i-1] + fibonacci[i-2];}return fibonacci;
}

代码来源:https://blog.csdn.net/zhuxian1277/article/details/112648982
参考资料:https://blog.csdn.net/zhuxian1277/article/details/112648982

对比分析折半查找与Fibonacci查找算法相关推荐

  1. 二分查找法和Fibonacci查找

    一.简要介绍二分查找算法 二分查找算法(Binary Search)是一种非常经典且有用的查找算法,它适用于有序数组的元素查找,并且思路简单,能够用非常简洁的代码来将其实现,经典版本的二分查找算法最优 ...

  2. 【深度学习】Swin-Transformer和EfficientNet对比分析

    [深度学习]Swin-Transformer和EfficientNet对比分析 文章目录 1 概述 2 算法解析2.1 Speed2.2 EfficientNet v2算法详解2.3 渐进学习 3 E ...

  3. FCM聚类与K-means聚类的实现和对比分析

    文章目录 一.收集数据 1.1数据来源 1.2数据描述 二.Fuzzy C-means 2.1FCM介绍 2.2 FCM的原理 2.3 FCM流程 2.4 对于收集的数据集的FCM代码及结果 2.4. ...

  4. C/C++ 折半查找与顺序查找【对比分析】

    在线性表的顺序存储结构中用到的查找方式莫过于顺序查找和折半查找: 尽管顺序查找的时间复杂度为O(n), 折半查找的时间复杂度为O(log2n),相比之下折半查找就显得效率更高, 但是二者使用的场合不同 ...

  5. 国考省考行测:细节理解,对错判断,要素查找,问什么,找什么,对比分析

    国考省考行测:细节理解,对错判断,要素查找,问什么,找什么,对比分析 2022找工作是学历.能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测, ...

  6. 数据结构 顺序查找和折半查找的平均查找长度分析关于ASL(平均查找长度)的简单总结

    顺序查找 折半查找的平均查找长度分析 ASL:平均查找长度 其中n为查找表中元素个数,Pi为查找第i个元素的概率,通常假设每个元素查找概率相同,Pi=1/n,Ci是找到第i个元素的比较次数. A S ...

  7. python二分法查找算法_顺序查找算法和折半(二分法)查找算法,C语言查找算法详解...

    查找是指在大量的信息中寻找一个特定的信息.在计算机中,查找是非常重要的一个应用,比如"百度".查找算法的好坏直接影响查找的速度. 常用的查找算法主要有顺序查找和折半(二分法)查找: ...

  8. 【C语言】详解:折半查找(二分查找算法)

    文章目录 前言 一.思路 二.代码的实现 前言 当我们需要在一堆有序的数组中(二分查找只支持有序数组)找到某个元素的位置,即下标的时候,最常见的是遍历的方法(暴力求解法),一个个核对,不相等就跳到下一 ...

  9. 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)

    目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...

  10. 【Java数据结构与算法】第九章 顺序查找、二分查找、插值查找和斐波那契查找

    第九章 顺序查找.二分查找.插值查找和斐波那契查找 文章目录 第九章 顺序查找.二分查找.插值查找和斐波那契查找 一.顺序查找 1.基本介绍 2.代码实现 二.二分查找 1.基本介绍 2.代码实现 三 ...

最新文章

  1. 腾讯云智能制造首次披露三大战略布局,发布“511”生态伙伴计划
  2. 自己整合优化的一个Android框架
  3. spark rdd saveAsTextFile保存为文件
  4. mdx格式的词典用什么软件打开_视频大神都用什么软件转换视频的格式?
  5. mysql索引失效_导致MySQL索引失效的几种常见写法
  6. 【特征选择】嵌入式特征选择法
  7. jquery中is()函数
  8. 程序员如何达到年薪百万?java程序员必读书籍!
  9. Linux——vi的使用
  10. CentOS 7 安装EOS 并启动钱包
  11. 华为云、百度、斗鱼的技术专家聚到一起在探讨什么?
  12. 什么是网络安全等级保护
  13. 单片机开发不可避免会遇到很多头疼的问题
  14. Web性能压力测试工具之WebBench详解
  15. gitlab从安装到使用到常见问题处理
  16. ionic中android的返回键
  17. 四苯基卟啉铜TPP-Cu(2+) cas14172-91-9分子量676.26600分子式C44H28CuN4
  18. STM32的矩阵按键程序思路
  19. mysql数据漂移_数据库漂移-和数据库漂移相关的内容-阿里云开发者社区
  20. HW弹药库之红队作战手册

热门文章

  1. Python之You-Get库学习
  2. 张一鸣:10年面试2000人,我发现混的好的人,全都有同一个特质
  3. 百度SEO站群WeLive免费在线客服系统 v5
  4. uniapp——ios端和android端微信分享,通过打开appStore和应用宝商店下载
  5. MaNGOS开源魔兽世界服务端
  6. 转载:王垠 的《完全用Linux工作》
  7. python实现爬虫_Python开发简单爬虫
  8. blackscholes matlab,基于MATLAB的Black-Scholes-Merton欧式期权定价模型的计算研究
  9. 英特尔vPro博锐技术激活
  10. 一文读懂ICO、IFO、IMO、IEO的区别,或许是全网最全科普