C#算法设计查找篇之04-斐波那契查找
斐波那契查找(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-斐波那契查找的更多相关文章
- 【Java】 大话数据结构(10) 查找算法(1)(顺序、二分、插值、斐波那契查找)
本文根据<大话数据结构>一书,实现了Java版的顺序查找.折半查找.插值查找.斐波那契查找. 注:为与书一致,记录均从下标为1开始. 顺序表查找 顺序查找 顺序查找(Sequential ...
- python实现斐波那契查找
通过在网上找教程解释和看书,总结出一套比较简单易懂的代码实现. 斐波那契查找和二分查找一样,针对的是有序序列,在此前提下: # 先创建一个Fibonacci函数 fib = lambda n: n i ...
- 斐波那契查找(Fibonacci Search)
斐波那契查找 斐波那契查找就是在二分查找的基础上根据斐波那契数列进行分割的. 在斐波那契数列找一个等于略大于查找表中元素个数的数F[n],将原查找表扩展为长度为F[n](如果要补充元素,则补充重复 ...
- 04斐波那契函数_Fibonacci--(栈与队列)
#include "stdio.h" int Fbi(int i) /* 斐波那契的递归函数 */ { ) ? : ; ) + Fbi(i - ); /* 这里Fbi就是函数自己, ...
- 经典算法详解(1)斐波那契数列的n项
斐波那契数列是一个常识性的知识,它指的是这样的一个数列,它的第一项是1,第二项是1,后面每一项都是它前面两项的和,如:1,1,2,3,5,8,13,21,34,55,89,144,233…… 说明:由 ...
- Java算法求最大最小值,倒序,冒泡排序,斐波纳契数列,日历一些经典算法
一,求最大,最小值 int[] a={21,31,4,2,766,345,2,34}; //这里防止数组中有负数,所以初始化的时候给的数组中的第一个数. int max=a[0]; int min=a ...
- python 斐波那契查找
def fibonacci_search(lis, key): # F = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987 ...
- 查找算法(4)--Fibonacci search--斐波那契查找
1.斐波那契查找 (1)说明 在介绍斐波那契查找算法之前,我们先介绍一下很它紧密相连并且大家都熟知的一个概念——黄金分割. 黄金比例又称黄金分割,是指事物各部分间一定的数学比例关系,即将整体一分为二, ...
- 裴波那契查找详解 - Python实现
裴波那契查找(Fibonacci Search)是利用黄金分割原理实现的查找方法. 斐波那契查找的核心是: 1.当key == a[mid]时,查找成功: 2.当key < a[mid]时,新的 ...
随机推荐
- Web Security Academy ___XXE injection___Lab
实验网站:https://portswigger.net/web-security/xxe XXE学习看一参考下面这篇文章,讲得很全: https://xz.aliyun.com/t/3357#toc ...
- accpet和connect设置超时
三次握手 TCP连接建立的开始是三次握手,通过三次交互确认连接成功,在客户端调用connect时,客户端发送sync消息给服务端,服务端收到sync消息后,返回一个ack+sync,并等待ack,客户 ...
- Flutter学习笔记(41)--自定义Dialog实现版本更新弹窗
如需转载,请注明出处:Flutter学习笔记(41)--自定义Dialog实现版本更新弹窗 功能点: 1.更新弹窗UI 2.强更与非强更且别控制 3.屏蔽物理返回键(因为强更的时候点击返回键,弹窗会消 ...
- PHP入门之函数
前言 之前对PHP的类型.运算符和流程控制简单说了一下.想了解的,这是地址. PHP入门之类型与运算符 PHP入门之流程控制 下面对函数简单说一下. 函数的基本概念 为完成某一个功能的程序指令的合集, ...
- 如何阅读一本书——分析阅读Pre
如何阅读一本书--分析阅读Pre 前情介绍 作者: 莫提默.艾德勒 查尔斯.范多伦 初版:1940年,一出版就是全美畅销书榜首一年多.钢铁侠Elon.Musk学过. 需要注意的句子: 成功的阅读牵涉到 ...
- MySQL 容器修改配置文件后无法启动问题(终极解决办法)
docker inspect 容器名称或容器 ID 例如: docker inspect mysql cd /var/lib/docker/overlay2/1d7877d715b9c730103e ...
- win10在html上运行java的applet程序
Applet是采用Java编程语言编写的小应用程序,该程序可以包含在 HTML(标准通用标记语言的一个应用)页中,与在页中包含图像的方式大致相同. 含有Applet的网页的HTML文件代码中部带有 和 ...
- PHP password_get_info() 函数
password_get_info() 函数用于返回指定散列(hash)的相关信息. PHP 版本要求: PHP 5 >= 5.5.0, PHP 7高佣联盟 www.cgewang.com 语法 ...
- css浮动属性
1.为什么需要浮动 HTML中的标签元素大致分为三类:块状元素.内联元素.内联块元素. 每种元素都有其各自的特点,其中块状元素会独占一行,而内联元素和内联块元素则会在一行内显示.如果我们想让两个甚至多 ...
- UOJ #310 黎明前的巧克力 FWT dp
LINK:黎明前的巧克力 我发现 很多难的FWT的题 都和方程有关. 上次那个西行寺无余涅槃 也是各种解方程...(不过这个题至今还未理解. 考虑dp 容易想到f[i][j][k]表示 第一个人得到巧 ...