查找算法-斐波那契查找法(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;学长非常推荐…

图像处理入门 1(Introduction to image processing)

如何获得一张照片 &#xff08;How to obtain a photo&#xff09;&#xff1f; 每次看到一些光学设备的规格介绍的时候&#xff0c;一些专用名词&#xff0c;例如&#xff1a;等效焦距&#xff0c;曝光模式 等 让你一头雾水。爱学习的你一定十分好奇他们是什么意思。每次看到…

L2-026 小字辈 - java

L2-026 小字辈 时间限制 400 ms 内存限制 64 MB 题目描述&#xff1a; 本题给定一个庞大家族的家谱&#xff0c;要请你给出最小一辈的名单。 输入格式&#xff1a; 输入在第一行给出家族人口总数 N&#xff08;不超过 100 000 的正整数&#xff09; —— 简单起见&#xff0c…

vscode json文件添加注释报错

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

封装一个PHP可控限速下载文件的方法

说明 实测下载后的文件与源文件哈希值一致&#xff0c;保证数据传输安全一致。如果下载到的文件每次都165KB左右&#xff0c;和源文件大小不符合&#xff0c;需要用IDE打开下载的文件&#xff0c;看看是否报致命错误&#xff0c;提示超过最大内存限制。这个与php.ini中的“mem…

Docker 深度清除镜像缓存 (overlay2)

Docker 深度清除镜像缓存 &#xff08;overlay2&#xff09; 一般情况下&#xff0c;运维清理镜像是通过命令 docker rm i 删除镜像的。但是这条命令不会删除docker build命令产生的缓存文件。 这个时候需要使用 docker system 的系列命令来做相关处理。 docker system --hel…

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-…

Laplacian算子详解及例程

Laplacian算子是一种常用的边缘检测算法&#xff0c;它是通过对图像进行二阶微分来检测图像的边缘。Laplacian算子的优点是能够对不同方向的边缘进行检测&#xff0c;对于边缘的粗细和强度变化也比较敏感。 Laplacian算子的计算公式为&#xff1a; ∇f ∂f/∂x ∂f/∂y其中…

AUTOSAR汽车电子嵌入式编程精讲300篇-基于CAN总线的温度场测量装置的研究与设计

目录 前言 国内外研究现状 2 温度场测量装置的方案设计 2.1 技术指标

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

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

Centos7 Linux系统下生成https的crt和key证书

linux下生成https的crt和key证书 步骤如下&#xff1a; x509证书一般会用到三类文&#xff0c;key&#xff0c;csr&#xff0c;crt Key 是私用密钥openssl格&#xff0c;通常是rsa算法。 Csr 是证书请求文件&#xff0c;用于申请证书。在制作csr文件的时&#xff0c;必须使…

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

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

苹果IOS安装IPA, plist形式 Safari 浏览器点击安装

快速链接 苹果开发者账号链接 网址: https://developer.apple.com/account 苹果应用上架链接 网址: https://appstoreconnect.apple.com/ 应用证书文件及打包 参考教程: 最新uniapp打包IOS详细步骤&#xff08;2022&#xff09; 证书在线制作工具 网址: https://app.121xuexi.…

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

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

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

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