斐波那契查找详细注解版

2023-10-26

对于斐波那契数列:1、1、2、3、5、8、13、21、34、55、89……(也可以从0开始),前后两个数字的比值随着数列的增加,越来越接近黄金比值0.618。比如这里的89,把它想象成整个有序表的元素个数,而89是由前面的两个斐波那契数34和55相加之后的和,也就是说把元素个数为89的有序表分成由前55个数据元素组成的前半段和由后34个数据元素组成的后半段,那么前半段元素个数和整个有序表长度的比值就接近黄金比值0.618,假如要查找的元素在前半段,那么继续按照斐波那契数列来看,55 = 34 + 21,所以继续把前半段分成前34个数据元素的前半段和后21个元素的后半段,继续查找,如此反复,直到查找成功或失败,这样就把斐波那契数列应用到查找算法中了。如下图:
在这里插入图片描述 从图中可以看出,当有序表的元素个数不是斐波那契数列中的某个数字时,需要把有序表的元素个数长度补齐,让它成为斐波那契数列中的一个数值,当然把原有序表截断肯定是不可能的,不然还怎么查找。然后图中标识每次取斐波那契数列中的某个值时(F[k]),都会进行-1操作,这是因为有序表数组位序从0开始的,纯粹是为了迎合位序从0开始。(fib[k]是数组的长度,而数组索引是从0开始的,所以需要进行-1来跟数组索引匹配)
————————————————
mid = low + f[k - 1] - 1, k代表斐波那契的第几个元素
f[k - 1] = (f[k - 1] - 1) + (f[k - 1] - 1) + 1
也就是只要顺序表的长度为f[k ] - 1则可以将表分割成长度为f[k - 1] - 1和f[k - 2] - 1的两段,
mid = low + f[ k - 1] - 1
但原来的顺序表长度不一定刚好等于f[k - 1],因此需要将其长度增加到f[k - 1]

 // 生成斐波那契数组,因为斐波那契相邻的数之间都很接近0.618
    // {1,1,2,3,5,8,13,21,34,55}
    // f[k] = f[k - 1] + f[k - 2];
    public static int[] f(){

        int[] f = new int[20];
        f[0] = 1;
        f[1] = 1;
        for (int i = 2; i < f.length; i++){
            f[i] = f[i - 1] + f[i - 2];
        }

        return f;
    }

    // mid = low + F(k - 1) - 1
    public static int search(int[] arrs, int key) {

        int low = 0;
        int high = arrs.length - 1;
        int k = 0;
        int mid = 0;
        int[] f = f();

        // 找出f中最接近arrs.length的值,因为high = arrs.length - 1,所以f[k] - 1
        while(high > f[k] - 1){
            k++;
        }

        // 因为f[k]的长度可能大于arrs.length,所以要用进行补全,由于是递增的,所以用arrs中的最大值进行补足
        int[] temp = Arrays.copyOf(arrs, f[k]);
        for (int i = high + 1; i < temp.length; i++) {
            temp[i] = arrs[high];
        }

        while (low <= high){
            // 中间值求取,套公式
            mid = low + f[k - 1] - 1;
            if  (key < temp[mid]){ // 查看是否在左半段
                high = mid - 1; // 到左半段进行查找
                k--; // 按照黄金分割f[k-1] + f[k-2] = f[k], 左半段分为按f[k - 1]的长度,所以此处减去1,去左半段继续找mid
            }else if (key > temp[mid]){ // 查看是否在右半段
                low = mid + 1; // 到右半段进行查找
                k -= 2; // 按照黄金分割f[k-1] + f[k-2] = f[k], 右半段是f[k - 2]的长度,所以此处减去2,去右半段继续找mid
            }else {
                // 如果mid > high的话说明查找到的是补全值
                return Math.min(mid, high);
            }
        }
        return -1;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

斐波那契查找详细注解版 的相关文章

随机推荐

  • Proteus(8.9版本) 51单片机-烟雾探测器的设计-仿真

    第一步是收集有关室外温度 湿度和气体浓度的信息 作为敏感元件烟雾传感器的输入信息 当信号输入值与放大模块的A D转换器输入电平相匹配时 无需放大放大器 当信号输入值与放大模块的A D转换器输入级别不匹配时 放大器将放大电气信号 A D电路的
  • 小熊派学习:手册查询和ADC深入使用

    弯曲传感器 折弯弯曲传感器 它的电阻值就会上升 那么flex value的值就会越来越小 连带地让led value的值越小 LED就会越暗 涉及到 上下拉电阻 电源至元器件引脚上的电阻称为上拉电阻 作用是平时使该引脚为高电平 地至元器件引
  • sqli-labs第二十三关(注释过滤绕过)

    从源码可知此关将注释符全部过滤掉 需要绕过 使用and 1 1即可 http localhost 90 sqli labs master Less 23 id 1 union select 111 select group concat s
  • 【linux-kali】网络模式host-only设置及注意事项

    网络模式 host only 设置 环境 kali vmware windows10 步骤 1 关闭kali系统下 虚拟机 编辑 虚拟机网络编辑器 Vmnet1 设置或确认子网IP 192 167 0 0 和DHCP范围 2 宿主机 上网网
  • CentOS8安装mysql8.0.24

    记录一下CentOS8安装mysql的过程 CentOS系统版本为CentOS Linux release 8 1 1911 安装的mysql版本为8 0 24 一 下载mysql安装包并解压 执行以下命令 创建mysql安装目录 mkdi
  • WebSocket的基本使用

    目录 为何使用websocket 1 后端搭建 2 搭建webSocket前后分离 1 配置跨域过滤器与初始化websocket 2 定义websocket服务 3 定义控制器进行测试webSocket向前端发送消息 2 前端准备 3 进行
  • 如何从gitee上拉项目?

    目录 第一步 下载git软件 第二步 一直下一步 傻瓜式安装 第三部 使用 新建一个文件夹 2 右击 打开命令窗口 3 复制项目下载url 4 命令窗口输入这样一串命令 第一步 下载git软件 CNPM Binaries Mirror np
  • spring-boot是否还和spring mvc一样存在父子容器

    文章目录 一 spring boot在自动集成了spring springmvc后是否在有父子容器之分 1 看下spring boot run方法 2 为什么spring mvc弄了一个父子容器 二 spring mvc中父子容器初始化过程
  • @Autowired 和 @Resource 的区别

    Autowired 和 Resource 的区别 区别 Autowired Resource 区别 区别1 Autowired 是spring提供的注解 Resource 是JDK提供的注解 区别2 Autowired 默认的注入方式是By
  • 第三十章、containers容器类部件QMdiArea多文档界面部件功能介绍及开发应用

    专栏 Python基础教程目录 专栏 使用PyQt开发图形界面Python应用 专栏 PyQt入门学习 老猿Python博文目录 一 引言 老猿在前期学习PyQt相关知识时 对每个组件的属性及方法都研究得很透彻 并将学习的感悟都写成了博文
  • linux中jdk安装/java环境安装

    第一步首先下载java jdk jdk 8u144 linux x64链接 https pan baidu com s 1uvSB 7JP037AdZJPDdGF6A 提取码 mdat 然后使用工具将文件传输到linux上 然后将tar g
  • 在树莓派中安装ROS系统(Kinetic)

    在树莓派中安装ROS系统 重新梳理了一下树莓派的安装流程 现在我们来开始吧 打开官网教程 http wiki ros org kinetic step1 安装源 中国 sudo sh c etc lsb release echo deb h
  • 物联网+区块链溯源方案

    物联网硬件 蓝牙 wifi 加区块链的方式可有效对现实世界中的实例进行链上映射 本文介绍一种基于硬件的轮胎区块链防伪溯源以及渠道管控的方案思路 更多区块链技术与应用分类 区块链应用 区块链开发 以太坊 Fabric BCOS 密码技术 共识
  • 服务器搭建系列之7:k8s安装postgresql数据库,2022最新版本

    Dockerfile FROM postgres EXPOSE 5432 deploy yaml 命名空间 apiVersion v1 kind Namespace metadata name fandai apiVersion apps
  • Maven安装与配置,Eclipse配置Maven【图文并茂的保姆级教程】

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于Maven的相关操作吧 目录 Welcome Huihui s Code World 一 Maven是什么 二 Maven的下载 辉辉小贴士 maven中各个
  • Svm实现多分类

    机器学习 Svm实现多分类详解 Svm实现多类分类原理 代码实现 训练的图片 Svm实现多类分类原理 1 支持向量机分类算法最初只用于解决二分类问题 缺乏处理多分类问题的能力 后来随着需求的变化 需要svm处理多分类分为 目前构造多分类支持
  • 各种音视频编解码学习详解(11)--Flash Video系列

    用于在 Flash 中压缩视频 FLV流媒体格式是一种新的视频格式 它的出现有效地解决了视频文件导入Flash后 使导出的SWF文件体积庞大 不能在网络上有效使用等 缺点 一般FLV文件包在SWF PLAYER 的壳里 并且FLV可以很好的
  • Linux Memcached 安装

    1 Linux系统安装memcached 首先要先安装libevent库 memcache依赖于libevent 必须先安装 自动下载安装方式 也可使用源码安装方式 yum install libevent devel yum instal
  • 陪我到可可西里看一看海,不要未来,只要你来。——大冰 《陪我到可可西里去看海》

    陪我到可可西里看一看海 不要未来 只要你来 大冰 陪我到可可西里去看海
  • 斐波那契查找详细注解版

    对于斐波那契数列 1 1 2 3 5 8 13 21 34 55 89 也可以从0开始 前后两个数字的比值随着数列的增加 越来越接近黄金比值0 618 比如这里的89 把它想象成整个有序表的元素个数 而89是由前面的两个斐波那契数34和55