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

黄金分割具有严格的比例性、艺术性、和谐性,蕴藏着丰富的美学价值,这一比值能够引起人们的美感,被认为是建筑和艺术中最理想的比例。


蒙娜丽莎,断臂的维纳斯,这些我们经常见到的艺术品就是采用了黄金分割法,即0.618的比例。

而我们所熟知的斐波那契数列又叫做黄金分割数列,当它无限往下增加时,越到后面两个数的比例就越来越接近0.618即黄金分割点。
在我们眼里,编程也是一种艺术,那么我们能否利用这个万能的黄金分割法,运用到查找中呢?答案是肯定的,我们将斐波那契数与二分查找相结合,就得到了斐波那契查找,它与二分查找的思路相同,但是借助斐波那契数,可以仅仅使用加减法来完成查找,大大提高了效率。

那我们该如何实现呢?
例如我们要在

 int a[] ={1,3,5,7,9,11,13,15,17,19};

查找这个17
首先我们需要找到这个数组的长度n在斐波那契数中的位置

它所处的位置是斐波那契数列中的第七位,而a中只有10个元素,而斐波那契的第七个数为13,所以我们需要补全数组,将数组补充至13-1位,补充的值为最后一项的值


如果我们的key值小于mid的时候,我们按照上图,结合二分查找的思想,我们取到左边的一块,斐波那契数下标减1,我们的high值变为mid-1
而如果当key值大于mid的时候我们取到右边的一块,斐波那契数下标减2,我们的low值变为mid + 1

当我们的mid<=n时,说明mid即为我们查找到的下标。
当mid>n时,说明这个时候我们的mid为补全的下标,我们只需要返回一个原数组的最大下标就可以

完整代码:

#include<stdio.h>
#define MAXSIZE 100
void GitFib(int* fib)
{int i;fib[0] = 0;fib[1] = 1;for(i = 2; i < MAXSIZE; i++){fib[i] = fib[i - 1] + fib[i - 2];}
}
int FibonacciSearch(int *a,int n,int key)
{int i,mid,low=0,high= n ,k=0;int fib[MAXSIZE] = {0};GitFib(fib); while (n > fib[k] - 1){k++;}//找出n在斐波那契数中的位置 for (i = n; i<fib[k] -1; i++){a[i] = a[n];}//补全数组 while (low <= high){mid = low + fib[k-1] - 1;if (key <= a[mid]){high = mid - 1;k -= 1;}else if (key > a[mid]){low = mid + 1;k -= 2;}else{if (mid <= n)return mid;elsereturn n; }}
}
int main()
{int a[] ={1,3,5,7,9,11,13,15,17,19};int key,i,n;n = sizeof(a)/sizeof(a[0])-1;printf("请输入要查找的数据:");scanf("%d",&key);printf("%d\n",FibonacciSearch(a,n,key));return 0;
}

插值查找,斐波那契查找都是二分查找的一种变式,它们的本质上的不同时分隔点的选择不同,实际使用的时候根据数据的综合特点考虑再进行选择

数据结构与算法 | 斐波那契查找相关推荐

  1. Java数据结构与算法---斐波那契数列Fibonacci

    Java数据结构与算法-斐波那契数列Fibonacci 原理都很简单,直接上代码: package cn.m_fibonacci;public class Fibonacci {public stat ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. Interview:算法岗位面试—上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点—斐波那契数列、八皇后问题、两种LCS问题

    ML岗位面试:上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点-斐波那契数列.八皇后问题.两种LCS问题 Interview:算法岗位面试-上海某公司算法岗位(偏机器学 ...

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

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

最新文章

  1. 机器学习之贝叶斯分类(python实现)
  2. List------Linked 链表
  3. 一篇文章带你从认识Python装饰器到熟练使用
  4. 4)线性表[顺序表和链表]
  5. 收集 | 方便实用的在线网站
  6. number five
  7. LeetCode2——Add Two Numbers(两个链表中的数字相加,形成新链表)
  8. 小程序分类左右内容联动
  9. 基于RabbitMQ消息队列的分布式事务解决方案 - MQ分布式消息中间件实战
  10. 代码编辑器[0] - Vim/gVim[1] - Vim 的快捷键操作
  11. 关于垂直列行值转成水平行值及多列值转合并成单列值
  12. 计算机辅助英语教学mti,计算机辅助翻译介绍
  13. 交换机和路由器的登陆与管理
  14. 通过hutool工具包实现将数据库中的全量数据导出,一张表一个sheet页,包含目录页,目录页和sheet页之间可以互相跳转
  15. Exception】Chrome浏览器提示:此网页正试图从未经验证的来源加载脚本
  16. fluent中网格检查
  17. 1800勘误表_专业的ASP.NET 2.0勘误表
  18. 用源码论述Eclipse学习体会
  19. 【问题解决】SpringBoot工程无法找到父依赖 parent-pom Failure to find com.xxx:parent-pom:pom:1.0.0.RELEASE
  20. 城堡传说3服务器维护,城堡传说3隐藏攻略大全

热门文章

  1. Fanout交换器-搭建环境
  2. SpringBoot高级消-息-RabbitMQ基本概念简介
  3. LocalDateTime - Java处理日期和时间
  4. JVM--字节码执行引擎
  5. Xshell、Xftp入门使用
  6. 用css3实现ps蒙版效果+动画
  7. 看苏宁易购的运营保障体系如何hold住818大促
  8. zabbixproxy安装
  9. 关于Echarts的填坑之旅
  10. Ext JS 6开发实例(一)