斐波那契查找(Fibonacci Search)

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/704 访问。

斐波那契查找是区间中单峰函数的搜索技术,它在二分查找的基础上根据斐波那契数列进行分割的。在斐波那契数列找一个等于或略大于查找表中元素个数的数F[n],如果原查找表长度不足F[n],则补充重复最后一个元素,直到满足F[n]个元素时为止。完成后进行斐波那契分割,即F[n]个元素分割为前半部分F[n-1]个元素,后半部分F[n-2]个元素,根据值的关系确定往前或往后查找,直到找到时为止。如果一直找不到,则返回-1。


示例: 

public class Program {public static void Main(string[] args) {int[] array = { 8, 11, 21, 28, 32, 43, 48, 56, 69, 72, 80, 94 };CalculateFibonacci();Console.WriteLine(FibonacciSearch(array, 80));Console.ReadKey();}private const int MAXSIZE = 47;private static int[] _fibonacciArray = new int[MAXSIZE];private static void CalculateFibonacci() {_fibonacciArray[0] = 1;_fibonacciArray[1] = 1;//计算斐波那契数,使用数组保存中间结防止重复计算,//注意MAXSIZE为48时,斐波那契数将会溢出整型范围。//1,1,2,3,5,8,13,21,34,55,89...for(int i = 2; i < _fibonacciArray.Length; i++)_fibonacciArray[i] = _fibonacciArray[i - 1] + _fibonacciArray[i - 2];}private static int FibonacciSearch(int[] array, int key) {int length = array.Length;int low = 0, high = length - 1, mid, k = 0;//先查找到距离最近的斐波那契数,本案例为k=6时,值13int[] banlance;while(length > _fibonacciArray[k])k++;//数组的数量必须为_fibonacciArray[k],所以使用一个中间平衡数组if(length < _fibonacciArray[k]) {banlance = new int[_fibonacciArray[k]];for(int i = 0; i <= length - 1; i++)banlance[i] = array[i];} else {banlance = array;}//平衡数组中的后半部分用前面的最后一个值补全for(int i = length; i < _fibonacciArray[k]; i++)banlance[i] = banlance[length - 1];//接下来的过程和二分查找类似while(low <= high) {mid = low + _fibonacciArray[k - 1] - 1;if(banlance[mid] > key) {high = mid - 1;k--;} else if(banlance[mid] < key) {low = mid + 1;k -= 2;} else {//防止索引出界if(mid <= length - 1)return mid;return length - 1;}}//查找不到时返回-1return -1;}}

以上是斐波那契查找算法的一种实现,以下是这个案例的输出结果:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/704 访问。

10

分析:

在最坏的情况下斐波那契查找的时间复杂度为:  。

C#算法设计查找篇之04-斐波那契查找相关推荐

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

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

  2. 【数据结构与算法】插值查找算法、斐波那契查找算法(黄金分割法)的介绍和程序实现

    目录 1. 插值查找算法 1.1 插值查找算法的介绍 1.2 插值查找算法的程序实现 2. 斐波那契查找算法 2.1 斐波那契查找算法的介绍 2.2 斐波那契查找算法的程序实现 1. 插值查找算法 1 ...

  3. JAVA数据结构与算法之斐波那契查找(黄金分割点)

    前言 最近面临毕业就业,在复习数据结构与算法,为了更好地掌握,加深印象,所以决定写一些博客来知识复现. 温馨提示:这篇博客可能不适合刚学数据结构的新手. 算法的简单介绍 黄金分割点是指把一条线段分割为 ...

  4. java斐波那契查找_详解Java Fibonacci Search斐波那契搜索算法代码实现

    一, 斐波那契搜索算法简述 斐波那契搜索(Fibonacci search) ,又称斐波那契查找,是区间中单峰函数的搜索技术. 斐波那契搜索采用分而治之的方法,其中我们按照斐波那契数列对元素进行不均等 ...

  5. 二十三、斐波那契查找算法

    一.基本介绍 1.黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比.取其前三位 数字的近似值是 0.618.由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为 ...

  6. 数据结构与算法 | 斐波那契查找

    要想能够理解这一算法,需要先了解 1.二分查找 https://blog.csdn.net/qq_35423154/article/details/101383518 2.斐波那契数 https:// ...

  7. 查找算法-(顺序查找、二分查找、插值查找、斐波那契查找)

    1)顺序查找或叫线性查找 就是顺序遍历匹配 2)二分查找 package search;public class BinarySearch {/*** 二分查找数组必须有序*//**** @param ...

  8. 查找算法:斐波那契查找算法实现及分析

    斐波那契查找算法介绍 斐波那契查找法肯定与斐波那契相关嘛,斐波那契数列 又称黄金分割数列.所以我们先把黄金分割弄懂,后面代码才能看得懂!黄金分割点大家都知道吧.1:0.618或者1.618:1,我们的 ...

  9. 查找算法之斐波那契查找算法

    斐波那契(黄金分割法)查找算法 (一)算法简介 (1)斐波那契数列 在讲算法之前,我们先介绍一下斐波那契数列,该数列公式为F(K) = F(k-1) + F(k-2),即 1.1.2.3.5.8.13 ...

  10. 斐波那契查找算法解析

    文章目录 前言 一.斐波那契数列 二.斐波那契查找算法 前言 学数据结构的时候被斐波那契查找算法困扰,刚开始难以理解,脑袋有点懵,翻看了许多大佬的博文,加上自己的理解发了出来 一.斐波那契数列 我们先 ...

最新文章

  1. 看动画轻松理解“递归”与“动态规划”
  2. 如何制作python代码_如何使用50行Python代码制作一个计算器
  3. 深度学习-语音处理-语音分离入门学习(Speech separation)
  4. Opencv之Vs编译
  5. solidworks工程图模板与图纸格式的区别_教你DWG如何导入为图纸格式
  6. Atitit.论图片类型 垃圾文件的识别与清理  流程与设计原则 与api概要设计 v2 pbj
  7. 【Linux】Mac在VMware中安装ubuntu教程和安装时遇到键盘鼠标失效等问题的解决方案
  8. 基于Java实现的植物大战僵尸游戏
  9. 关于工信部191号文《App违法违规收集使用个人信息行为认定方法》的评估
  10. Python学习教程公开课:好玩的Python
  11. 计算机进入不了管理器,电脑没有桌面且任务管理器打不开怎么办
  12. 网页设计如何做?全流程其实只有这五步!
  13. 2台路由器串联接法(有线路由+无线路由)
  14. 嵌入式Qt5.6应用编程之触摸屏控制LED灯 - JZ2440V3
  15. OSChina 周日乱弹 —— 生活就像巧克力
  16. 皮尔松相关分析_皮尔西斯符号学与生物学认知
  17. 快速获取当天0点0分0秒(00:00:00),23点59分59秒(23:59:59)
  18. JS网站右下角悬浮视窗可关闭广告
  19. 凭什么是你从新星计划里面脱颖而出?答:凭这五点
  20. 惨!惨!惨!小木虫被封禁了

热门文章

  1. LeetCode 540. Single Element in a Sorted Array
  2. 【AI视野·今日CV 计算机视觉论文速览 第208期】Fri, 28 May 2021
  3. 爬虫-urlparse与urlsplit
  4. django 别名与命名空间 reverse反转得到路径
  5. request技巧-utils的功能-cookie对象与字典的转换-URL编码与解码-关掉SSL验证
  6. dj鲜生-13-类视图-使用篇
  7. django-模型类管理器-create方法-models属性
  8. jquery-滑动的选项卡
  9. python-去重的三种方式-成员判断-索引判断-集合
  10. gem5的安装、编译及运行