斐波那契查找算法介绍

斐波那契查找法肯定与斐波那契相关嘛,斐波那契数列 又称黄金分割数列。所以我们先把黄金分割弄懂,后面代码才能看得懂!黄金分割点大家都知道吧。1:0.618或者1.618:1,我们的斐波那契数列越往后的项数 越接近黄金分割比例,打个比方

斐波那契数列第k项 F[k] = F[k-1]+F[k-2]。F[k-1] : F[k-2] ≈ 1:0.618 。回忆下我们的折半查找mid = (low+high)/2取中间的位置,我们的插值查找呢 mid = (low+high)*(key-arr[low])/(arr[high]-arr[low])根据key值的一个占比来确定mid的位置。那么我们的斐波那契查找呢,就是采用斐波那契数列来确定 mid的位置!mid = low + F[k-1] - 1;看下图:

斐波那契算法代码实现

代码和折半查找很相似,计算mid的公式变为mid = low + F[k-1] - 1;然后就是将目标数组数据扩充至F[k]-1个,扩充元素值为最值。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>void PrintArr(int* arr,int length)
{for (int i = 0; i < length; i++){printf("%3d ",arr[i]);}printf("\n");return;
}//构造斐波那契数列
int* Fibonacci_Arr(int length)
{int* arr = malloc(sizeof(int)*length);arr[0] = 0;arr[1] = 1;for (int i = 2; i < length; i++){arr[i] = arr[i - 1] + arr[i - 2];}return arr;
}//斐波那契查找法
//arr 数组,下标为[0,length-1],length 数组长度,key 查找的关键字
//返回查找值的下标 ,没查找到 返回-1
int Fibonacci_Search(int *arr,int* F, int length, int key)
{int low = 0;      //低位下标int high = length-1;//高位下标int mid;           //中间值下标int k = 0;          //斐波那契数列下标//计算arr的length 位于斐波那契数列的位置while (length > F[k] - 1){k++;}//arr数组长度不满足斐波那契数据项长度 将后面的值填充为最大值for (int i = length; i < F[k]-1; i++){arr[i] = arr[high];}while (low <= high){mid = low + F[k - 1] - 1;//将mid的值设置为黄金分割点位置if (key < arr[mid]){high = mid - 1;k = k - 1;}else if(key > arr[mid]){low = mid + 1;k = k - 2;}else{if (mid <= length - 1){return mid;}else{return length - 1;}}}return -1;
}
int main(int argc, char *argv[])
{int arr[15] = { 0,1,2,13,24,35,46,57,68,99};//10个元素,空几个位置预留用int length = 10;//构造斐波那契数列int *F = Fibonacci_Arr(length);printf("斐波那契数列:");PrintArr(F, length);printf("目标数组    :");PrintArr(arr, 10);//斐波那契查找int key = 46;int index = Fibonacci_Search(arr, F, length, key);printf("%d的下标index = %d\n", key, index);key = 56;index = Fibonacci_Search(arr, F, length, key);printf("%d的下标index = %d\n", key, index);return 0;
}

代码运行检测

查找算法:斐波那契查找算法实现及分析相关推荐

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

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

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

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

  3. Java有序表查找:折半查找、二分查找、差值查找和斐波那契查找

    Java有序表查找:折半查找.二分查找.差值查找和斐波那契查找     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51 ...

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

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

  5. 算法:静态查找表(Static Search Table)(顺序查找、二分查找、插值查找、斐波纳契查找)

    转载 BinarySearch.java /*** @ClassName BinarySearch* @Description 折半查找** 可以使用插值公式将折半查找性能优化** 只需将其中的 mi ...

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

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

  7. 顺序,二分,插值,斐波那契 查找算法

    总结: 博客详细描述:(http://www.cnblogs.com/maybe2030/p/4715035.html#_label4) 关注: 二分查找.插值查找以及斐波那契查找都可以归为一类插值查 ...

  8. 007.斐波拉契查找算法

    1. 斐波拉契查找算法 斐波拉契查找算法也称为黄金分割查找算法,它是在折半查找算法的基础上根据斐波拉契数列进行分割.折半法是取排序好的中间值进行分割,而斐波拉契查找算法是根据黄金分割点进行分割. 黄金 ...

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

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

最新文章

  1. 网站流量UV是什么意思?什么是流量UV/PV/IP
  2. R语言使用pROC包绘制ROC曲线、获取最优阈值(threshold)及最优阈值对应的置信区间
  3. RHEL6下squid代理之正向代理
  4. Spring bean依赖注入、bean的装配及相关注解
  5. 信息系统项目管理师-案例分析
  6. 《社会智能与综合集成系统》第1章1.节参考文献
  7. fastdfs 测试客户端_分布式文件服务 FastDFS (第一篇)
  8. 如何处理Angular项目在Visual Studio Code打开报关于@Decorators的警告信息
  9. 计算机设备的热量,帮我计算机一下这块冰能吸收多少热量?
  10. 可视化计算java_Java可视化计算器
  11. mysql挂载到iscsi_corosync+pacemaker+iscsi磁盘实现mysql高可用
  12. 【学习笔记】MOOC 数学文化赏析 笔记
  13. java web相对路径_java(Web)中相对路径,绝对路径问题总结
  14. RangeError: Maximum call stack size exceeded
  15. DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144
  16. python程序写诗_python:为你写诗
  17. python 余弦定理_自己实现文本相似度算法(余弦定理)
  18. 客户期望,客户满意度,客户体验和客户忠诚度之间存在的联系
  19. 两化融合的定义和两化融合如何认定
  20. unity拖拽UI生成Cube并跟随鼠标移动,放置点可放下

热门文章

  1. macOS Big Sur 11.1更新了!苹果macOS Big Sur 11.1正式版发布
  2. 音频插件组合:Arturia Prophet V3 for Mac
  3. openpyxl模块_Openpyxl让Excel飞(一)
  4. 1.3编程基础之算术表达式与顺序执行 03 计算(a+b) c的值
  5. 《小学生C++趣味编程》 第23课 打车费用
  6. RTX5 | 事件标志组03 - 线程同步(逻辑或)
  7. java运行时异常与非运行时异常_java 运行时异常与非运行时异常理解
  8. plpythonu_PostgreSQL PL/Python 函数
  9. Python笔记-centos7使用adb连接真实手机及初始化uiautomatro2项目
  10. Java工作笔记-JPA查询达梦7数据库(Spring Boot + ORM)