查找算法-斐波那契查找法(Fibonacci Search)

目录

  查找算法-斐波那契查找法(Fibonacci Search)

1、说明

2、算法分析

3、C++代码 


  查找算法-斐波那契查找法(Fibonacci Search)

1、说明

斐波那契查找法又称为斐氏查找法,此查找法和二分法一样都是以分割范围来进行查找的,不同的是斐波那契查找法不是按对半方式来分割的,而是以斐波那契级数的方式来分割的。

斐波那契级数F(n)的定义如下:

        F_{0} = 0; F_{1} = 1;

        F_{i} = F_{i-1} + F_{i-2}

斐波那契级数:0、1、1、2、3、5、8、13、21、34、55、89、...。也就是除了第0个和第1个元素外,级数中的每个元素值都是前两个元素值的和。

斐波那契查找法的好处是只需要用到加减运算而不需要用到乘除运算,这从计算机运算的过程来看效率会高于前两种查找法。在尚未介绍斐波那契查找法之前,我们先来认识斐波那契树。所谓斐波那契树,是以斐波那契级数的特性来建立的二叉树,其建立的原则如下:

  1. 斐波那契树的左右子树均为斐波那契树。
  2. 当数据个数n确定时,若想确定斐波那契树的层数k值是多少,我们必须找到一个最小的k值,使得斐波那契层数的Fib(k+1)\geqslant n+1
  3. 斐波那契树的树根一定是一个斐波那契树,且子节点与父节点差值的绝对值为斐波那契数。
  4. k\geqslant 2时,斐波那契树的树根为Fib(k),左子树为(k-1)层斐波那契树(其树根为Fib(k-1)),右子树为(k-2)层斐波那契树(其树根为Fib(k)+Fib(k-2))。
  5. n+1值不是斐波那契树的值,则可以找出一个m,使得Fib(k+1)-m=n+1m=Fib(k+1)-(n+1),再按斐波那契树的建立原则完成斐波那契树的建立,最后斐波那契树的各节点再减去差值m即可,并把小于1的节点去掉。

2、算法分析

  1. 斐波那契查找法的平均比较次数少于二分查找法,但在最坏的情况下二分查找法较快,其平均时间复杂度为O(log_{2}n)
  2. 斐波那契查找法较为复杂,需额外产生斐波那契树。

3、C++代码 

#include<iostream>
using namespace std;void SetData(int* Data, int Size) {for (int i = 0; i < Size; i++) {Data[i] = rand() % 150 + 1;}
}void Sort(int* Data, int Size) {for (int i = 0; i < Size; i++) {for (int j = i + 1; j < Size; j++) {if (Data[i] > Data[j]) {int temp = Data[i];Data[i] = Data[j];Data[j] = temp;}}}
}void Print(int* Data, int Size) {for (int i = 0; i < Size ; i++) {cout << Data[i] << "  ";}cout << endl;
}int* Fibonacci(int Size) {int* fib = new int[Size];fib[0] = 0;fib[1] = 1;for (int i = 2; i < Size; i++) {fib[i] = fib[i - 1] + fib[i - 2];}return fib;
}int FibonacciSearch(int* Data, int Size, int Value) {int low = 0;int high = Size - 1;int k = 0;int mid = 0;int* fib = Fibonacci(Size);while (high > fib[k] - 1) {k++;}int* temp = new int[fib[k]];for (int i = 0; i < Size; i++) {temp[i] = Data[i];}for (int i = Size; i < fib[k]; i++) {temp[i] = Data[high];}while (low <= high) {mid = low + fib[k - 1] - 1;if (Value < temp[mid]) {high = mid - 1;k--;}else if (Value > temp[mid]) {low = mid + 1;k -= 2;}elsereturn mid <= high ? mid : high;}return -1;
}int main() {int Size = 20;int* Data = new int[Size] {0};SetData(Data, Size);Sort(Data, Size);cout << "原始数据:" << endl;Print(Data, Size);cout << "---------------------" << endl;int num = 0;cout << "请输入想要查找的数据:";cin >> num;int index = -1;index = FibonacciSearch(Data, Size, num);if (index != -1)cout << "查找的数据在数据库的第[ " << index + 1 << " ]位" << endl;elsecout << "在数据库中没有找到该数据" << endl;return 0;
}

输出结果 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/118554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有六家机器视觉公司今年11月份初放假到明年春节后,除夕不放假看住企业不跑路,不倒闭,明年大家日子会越来越甜

不幸的消息一个接着一个&#xff0c;请大家注意下面的消息 我已经收到已经有6家机器视觉公司今年11月份初放假到明年春节后&#xff0c;他们真的没有订单了&#xff0c;其中4家宣布员工可以自行寻找工作&#xff0c;今年除夕不放假是经济下行经济考量吗&#xff1f;看住企业不…

如何避免阿里云对象储存OSS被盗刷

网站app图片的云端存储离不开对象存储oss,而最难为的问题就是app做的出名了&#xff0c;少不了同行的攻击&#xff0c;包含ddos&#xff0c;cc攻击以及oss外链被盗刷&#xff01; 防盗链功能通过设置Referer白名单以及是否允许空Referer&#xff0c;限制仅白名单中的域名可以访…

OpenFeign实现分析、源码解析

什么是openfeign? 是springcloud全家桶的组件之一&#xff0c;其核心作用是为Rest API提供高效简洁的rpc调用方式。 为什么只定义接口而没有实现类&#xff1f; 源码解读&#xff08;省略&#xff09; 总结&#xff1a; 源码分析&#xff1a;如何发送http请求&#xff1f; …

竞赛 深度学习卫星遥感图像检测与识别 -opencv python 目标检测

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐…

vscode json文件添加注释报错

在vscode中创建json文件&#xff0c;想要注释一波时&#xff0c;发现报了个错&#xff1a;Comments are not permitted in JSON. (521)&#xff0c;意思是JSON中不允许注释 以下为解决方法&#xff1a; 在vscode的右下角中找到这个&#xff0c;点击 在出现的弹窗中输入json wit…

selenium4 元素定位

selenium4 9种元素定位 ID driver.find_element(By.ID,"kw")NAME driver.find_element(By.NAME,"tj_settingicon")CLASS_NAME driver.find_element(By.CLASS_NAME,"ipt_rec")TAG_NAME driver.find_element(By.TAG_NAME,"area")LINK_T…

python time 模块

时间的三种格式time模块中的其他函数时间三种格式之间的转化 一&#xff0c;时间的三种模块 在python中对于时间的描述存在三种格式&#xff1a;1&#xff0c;时间戳&#xff0c;2&#xff0c;时间结构体 3&#xff0c;按某种格式形式展示的字符串 1,时间戳 import time pr…

cola架构:有限状态机(FSM)源码分析

目录 0. cola状态机简述 1.cola状态机使用实例 2.cola状态机源码解析 2.1 语义模型源码 2.1.1 Condition和Action接口 2.1.2 State 2.1.3 Transition接口 2.1.4 StateMachine接口 2.2 Builder模式 2.2.1 StateMachine Builder模式 2.2.2 ExternalTransitionBuilder-…

热搜榜:最热门的话题文本排行榜API接口

近年来&#xff0c;随着社交媒体的兴起&#xff0c;热门话题的数量和更新速度都在不断增加&#xff0c;因此热门话题排行榜的需求也越来越大。在这篇文章中&#xff0c;我们将探讨如何使用#热搜榜# API接口获取最热门的话题文本排行榜&#xff0c;并给出相关代码示例。 一、API…

电脑QQ如何录制视频文件?

听说QQ可以录制视频&#xff0c;还很方便&#xff0c;请问该如何录制呢&#xff1f;是需要先打开QQ才可以录制吗&#xff1f;还是可以直接使用快捷键进行录制呢&#xff1f;录制的质量又如何呢&#xff1f; 不要着急&#xff0c;既然都打开这篇文章看了&#xff0c;那小编今天…

【Javascript】通过浏览器书签构建与执行自动刷新脚本

0x00 前言 日常工作中&#xff0c;经常遇到需要时不时点一下刷新这样的事情&#xff08;怪前端想不到写一个自动刷新&#xff09; 但是…… 没有自动刷新按钮&#xff0c;在这页面手动点刷新还是太浪费时间了。 有时候懒得等了去做别的事情&#xff0c;过一小时回来刷新一下&a…

OpenText 安全取证软件——降低成本和风险的同时,简化电子取证流程

OpenText 安全取证软件&#xff0c;行业标准的数字调查解决方案&#xff0c;适用于各种规模和各种行业的组织 降低成本和复杂性 • 远程调查比轮流调查过程更有效 对结果持有信心 • 磁盘级可见性可以完成相关端点数据的搜索和收集 谨慎调查 • 完整的网络调查&#xf…

【Java集合类面试二十七】、谈谈CopyOnWriteArrayList的原理

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;谈谈CopyOnWriteArrayLi…

安科瑞电能计量管理系统

安科瑞 崔丽洁 随着国家电网改革政策的逐步推进和落实&#xff0c;Acrel-3000WEB电能管理解决方案运用互联网和大数据技术&#xff0c;为电力运维公司提供电能管理解决方案。该平台作为连接运维单位和用电企业的纽带&#xff0c;全方面监视用户配电系统的运行状态和电量数据&am…

计算机毕设 opencv 图像识别 指纹识别 - python

文章目录 0 前言1 课题背景2 效果展示3 具体实现3.1 图像对比过滤3.2 图像二值化3.3 图像侵蚀细化3.4 图像增强3.5 特征点检测 4 OpenCV5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往…

MySQL——EXPLAIN用法详解

EXPLAIN是MySQL官方提供的sql分析的工具之一&#xff0c;可以用于模拟优化器执行sql查询语句&#xff0c;从而知道MySQL是如何处理sql语句。EXPLAIN主要用于分析查询语句或表结构的性能瓶颈。 以下是基于MySQL5.7.19版本进行分析的&#xff0c;不同版本之间略有差异。 1、EXP…

筹备三年,自动驾驶L3标准将至,智驾产业链的关键一跃

‍作者|张祥威 编辑|德新 多位知情人士告诉HiEV&#xff0c;智能网联汽车准入试点通知&#xff0c;乐观预计将在一个月内发布。试点的推动&#xff0c;意味着国家层面的自动驾驶L3标准随之到来。 「L3标准内容大部分与主机厂相关&#xff0c;由工信部牵头&#xff0c;找了几家…

Redis3.2.12版本服务器迁移

1.新机器更新yum源 yum -y update 2.新机器安装redis数据库 yum install redis 3.新机器下载fedora的epel仓库 systemctl enable redis 4.将旧机器上的/etc/redis.conf拷贝到新机器的/config目录下 scp -r -P22 redis.config root162.32.196.57:/config/redis.config 5.新机器启…

4、让电机转起来【51单片机控制步进电机-TB6600系列】

摘要&#xff1a;本节介绍用简单的方式&#xff0c;让步进电机转起来。其目的之一是对电机转动有直观的感受&#xff0c;二是熟悉整个开发流程。 本系列教程必要的51单片机基础包括IO口操作、中断、定时器三个部分&#xff0c;相关基础教程网上很多&#xff0c;可以自行学习 一…

王道p149 3.编写后序遍历二叉树的非递归算法(c语言代码实现)

本题代码如下 void postorder(tree* t) {struct treenode* stack[100];//初始化结构体数组int top -1;//让栈顶指向-1treenode* p *t;while (p || top ! -1)//p不为空&#xff0c;并且栈不为空{if (p){top;//p不为空&#xff0c;将p压入栈中stack[top] p;p p->lchild;/…