斐波那契查找(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时,值13
int[] 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;
}
} //查找不到时返回-1
return -1;
} }

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

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

10

分析:

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

C#算法设计查找篇之04-斐波那契查找的更多相关文章

  1. 【Java】 大话数据结构(10) 查找算法(1)(顺序、二分、插值、斐波那契查找)

    本文根据<大话数据结构>一书,实现了Java版的顺序查找.折半查找.插值查找.斐波那契查找. 注:为与书一致,记录均从下标为1开始. 顺序表查找 顺序查找  顺序查找(Sequential ...

  2. python实现斐波那契查找

    通过在网上找教程解释和看书,总结出一套比较简单易懂的代码实现. 斐波那契查找和二分查找一样,针对的是有序序列,在此前提下: # 先创建一个Fibonacci函数 fib = lambda n: n i ...

  3. 斐波那契查找(Fibonacci Search)

    斐波那契查找 斐波那契查找就是在二分查找的基础上根据斐波那契数列进行分割的.   在斐波那契数列找一个等于略大于查找表中元素个数的数F[n],将原查找表扩展为长度为F[n](如果要补充元素,则补充重复 ...

  4. 04斐波那契函数_Fibonacci--(栈与队列)

    #include "stdio.h" int Fbi(int i) /* 斐波那契的递归函数 */ { ) ? : ; ) + Fbi(i - ); /* 这里Fbi就是函数自己, ...

  5. 经典算法详解(1)斐波那契数列的n项

    斐波那契数列是一个常识性的知识,它指的是这样的一个数列,它的第一项是1,第二项是1,后面每一项都是它前面两项的和,如:1,1,2,3,5,8,13,21,34,55,89,144,233…… 说明:由 ...

  6. Java算法求最大最小值,倒序,冒泡排序,斐波纳契数列,日历一些经典算法

    一,求最大,最小值 int[] a={21,31,4,2,766,345,2,34}; //这里防止数组中有负数,所以初始化的时候给的数组中的第一个数. int max=a[0]; int min=a ...

  7. python 斐波那契查找

    def fibonacci_search(lis, key): # F = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987 ...

  8. 查找算法(4)--Fibonacci search--斐波那契查找

    1.斐波那契查找 (1)说明 在介绍斐波那契查找算法之前,我们先介绍一下很它紧密相连并且大家都熟知的一个概念——黄金分割. 黄金比例又称黄金分割,是指事物各部分间一定的数学比例关系,即将整体一分为二, ...

  9. 裴波那契查找详解 - Python实现

    裴波那契查找(Fibonacci Search)是利用黄金分割原理实现的查找方法. 斐波那契查找的核心是: 1.当key == a[mid]时,查找成功: 2.当key < a[mid]时,新的 ...

随机推荐

  1. 没内鬼,来点干货!SQL优化和诊断

    SQL优化与诊断 Explain诊断 Explain各参数的含义如下: 列名 说明 id 执行编号,标识select所属的行.如果在语句中没有子查询或关联查询,只有唯一的select,每行都将显示1. ...

  2. 工作3年java面试题整理(自用)

    基础题目 1.Java线程的状态  一. 线程状态类型:1. 新建状态(New):新创建了一个线程对象.2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该 ...

  3. P3913 车的攻击

    大致题意: 求出被车攻击到的格子 基本思路: 如果直接暴力出奇迹的话是存不下的, 所以就以另外的思路来想. 容斥原理! 我们可以先把那些在同一行或同一列的车去重,然后把去重后的行数列数记作cntx,c ...

  4. db2创建nickname

    db2创建nickname创建步骤 1.创建 server create server servername type DB2/AIX version 10.5 wrapper drda authid ...

  5. react实战 : react 与 svg

    有一个需求是这样的. 一个组件里若干个区块.区块数量不定. 区块里面是一个波浪效果组件,而这个一般用 SVG 做. 所以就变成了在 react 中使用 SVG 的问题. 首先是波浪效果需要的样式. . ...

  6. @RequestMapping中的produces的作用和使用方式

    转发:原博客 1.他的作用是指定返回值类型和返回值编码 2.consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html; 一 ...

  7. 软件测试工程师之必备SQL语句基础

    作为一个软件测试工程师,我们在测试过程中往往需要对数据库数据进行操作,但是我们的操作大多以查询居多,有时会涉及到新增,修改,删除等操作,所以我们其实并不需要对数据库的操作有特别深入的了解,以下是我在工 ...

  8. 京东阅读(web)体验优化

    京东有电子书可以购买,可以多端阅读.比如PC客户端,移动端,以及本文提到的PC网站端. 先换个镜头,读书要记笔记(电子版本), 方便以后查阅. 镜头换回来,但是,我们为了方便肯定是想复制,下载啊,分享 ...

  9. ✨Shell脚本实现Base64 加密解密

    加密算法 # !/bin/bash # 全局变量 str="" base64_encode_string(){ # 源数据 source_string=$1 echo " ...

  10. SpringMV学习之拦截器的简单使用

    一.拦截器介绍 我们知道SpringMVC的拦截器(Interceptor)非常重要,尤其在Web应用中使用非常广泛,其功能类似于过滤器,用于拦截用户请求并作相应的处理.我们使用比较多的场景是系统登陆 ...