【数据结构与算法】斐波那契查找(黄金分割法)

news2024/11/17 11:34:37

斐波那契查找(黄金分割法)

黄金分割点是指把一条线段分割成两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是 0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神奇的数字,会带来意想不到的效果。

斐波那契数列 {1,1,2,3,5,8,13,21,34,55} 发现斐波那契数列的两个相邻数的比例,无限接近于黄金分割值 0.618。

斐波那契(黄金分割法)原理

斐波那契查找原理与二分查找和插值查找相似,仅仅改变了中间结点(mid)的位置,mid 不再是中间或者插值得到,而是位于黄金分割点附近,即 mid = lift + F(k - 1) - 1 (F代表斐波那契数列)

在这里插入图片描述

对 F(k - 1) - 1 的理解:

  1. 由斐波那契数列 F[k] = F[k - 1] + F[k - 2] 的性质,可以看到 (F[k] - 1) = (F[k - 1] - 1) + (F[k - 2] - 1) + 1。该式说明:只要顺序表的长度为 F[k] - 1,则可以将该表分成长度为 F[k - 1] - 1 和 F[k - 2] - 1 的两段,即如上图所示。从中间的位置为 mid = lift + F(k - 1) - 1
  2. 类似的,每一子段也可以用相同的方式分割
  3. 但顺序表长度 n 不一定刚好等于 F[k] - 1,所以需要将原来的顺序表长度 n 增加至 F[k] - 1。这里的 k 值只要能使得 F[k] - 1 恰好大于或等于 n 即可,由以下代码得到,顺序表长度增加后,新增的位置(从 n + 1 到 F[k] - 1 位置),都赋为 n 位置的值即可。
while(n > fib(k) - 1) {
    k++;
}

代码演示:

public class FibonacciSearch {
    public static int maxSize = 20;

    public static void main(String[] args) {
        int[] arr = {1, 8, 10, 89, 1000, 1234};

        System.out.println("index = " + fibSearch(arr, 89));
    }

    // 因为后面我们 mid = low + F(k - 1) - 1,需要使用斐波那契数列,因此我们需要获得一个斐波那契数列
    // 非递归方法得到一个斐波那契数列
    public static int[] fib() {
        int[] f = new int[maxSize];
        f[0] = 1;
        f[1] = 1;
        for (int i = 2; i < maxSize; i++) {
            f[i] = f[i - 1] + f[i - 2];
        }
        return f;
    }

    /**
     * 编写斐波那契查找算法
     * 使用非递归的方式编写算法
     *
     * @param a   数组
     * @param key 我们需要查找的关键码(值)
     * @return 返回对应下标,如果没有返回 -1
     */
    public static int fibSearch(int[] a, int key) {
        int low = 0;
        int high = a.length - 1;
        int k = 0; // 表示斐波那契分割数值的下标
        int mid = 0; // 存放 mid 值
        int[] f = fib(); // 获取斐波那契数组
        // 获取到斐波那契分割数值的下标
        while (high > f[k] - 1) {
            k++;
        }
        // 因为 f[k] 值可能大于 a 的长度,因此我们需要使用 Arrays 类,构造一个新的数组,并指向 a[]
        // 不足的部分会使用 0 填充
        int[] temp = Arrays.copyOf(a, f[k]);
        // 实际上需要使用 a 数组的最后的数填充 temp
        // 举例:temp = {1, 8, 10, 89, 1000, 1234, 0, 0, 0} => {1, 8, 10, 89, 1000, 1234, 1234, 1234, 1234}
        for (int i = high + 1; i < temp.length; i++) {
            temp[i] = a[high];
        }
        // 使用 while 循环处理,找到我们的数 key
        while (low <= high) { // 只要这个条件满足,就可以找
            mid = low + f[k - 1] - 1;
            if (key < temp[mid]) { // 我们应该继续向数组的前面查找(左边)
                high = mid - 1;
                // 为什么是 k--;
                // 说明
                // 1. 全部元素 = 前面的元素 + 后面的元素
                // 2. f[k] = f[k - 1] + f[k - 2]
                // 3. 因为前面有 f[k - 1] 个元素,所以乐意继续拆分 f[k - 1] = f[k - 2] + f[k - 3]
                // 4. 即 在 f[k - 1] 的前面继续查找 k--
                // 5. 即下次循环 mid = f[k - 1 - 1] - 1
                k--;
            } else if (key > temp[mid]) { // 我们应该继续向数组的后面查找(右边)
                low = mid + 1;
                // 为什么是 k -= 2;
                // 说明
                // 1. 全部元素 = 前面的元素 + 后面的元素
                // 2. f[k] = f[k - 1] + f[k - 2]
                // 3. 因为后面有 f[k - 2] 个元素,所以乐意继续拆分 f[k - 1] = f[k - 3] + f[k - 4]
                // 4. 即 在 f[k - 2] 的前面继续查找 k-= 2
                // 5. 即下次循环 mid = f[k - 1 - 2] - 1
                k -= 2;
            } else { // 找到
                // 需要确定返回的是哪个下标
                if (mid <= high) {
                    return mid;
                } else {
                    return high;
                }
            }
        }
        return -1;
    }
}

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

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

相关文章

css 动画之旋转视差

序&#xff1a;网上看到的一个例子&#xff0c;做一下 效果图&#xff1a; 代码&#xff1a; <style>.content{width: 300px;height: 300px;margin: 139px auto;display: grid;grid-template-columns: repeat(3,1fr);grid-template-rows: repeat(3,1fr);grid-template:…

《水经注地图服务》发布的影像数据在MapBox中调用(仅墨卡托)

MapBox源码下载 由于MapBox的源码下载略微有点复杂&#xff0c;我们有必要在这里为大家分享一下它的下载的方法&#xff0c;如果你已经从百度网盘下载了MapBox源码&#xff0c;请略过本节。 首先打开MapBox官网&#xff0c;然后点击“Documentation\Mapbox GL js”&#xff0…

PostgreSql 锁

一、概述 在 PostgreSQL 事务中提到&#xff0c;多个用户访问相同数据时可能出现脏读&#xff0c;不可重复度&#xff0c;幻读&#xff0c;更新丢失的问题&#xff0c;为解决这些问题&#xff0c;定义了不同的隔离级别&#xff0c;而隔离级别的具体实现&#xff0c;依靠的就是数…

计算机图形学笔记2-Viewing 观测

观测主要解决的问题是如何把物体的三维“模型”变成我们在屏幕所看到的二维“图片”&#xff0c;我们在计算机看到实体模型可以分成这样几步&#xff1a; 相机变换(camera transformation)或眼变换(eye transformation)&#xff1a;想象把相机放在任意一个位置来观测物体&#…

实用上位机--QT

实用上位机–QT 通信协议如下 上位机设计界面 #------------------------------------------------- # # Project created by QtCreator 2023-07-29T21:22:32 # #-------------------------------------------------QT += core gui serialportgreaterThan(QT_MAJOR_V…

LLM - model batch generate 生成文本

一.引言 LLM model 类 generate 支持传递 num_return_sequences 进行批量生成&#xff0c;下面简单介绍下原始模型 generate 和 lora 模型 generate 的代码并给出基于 Baichuan-7B 和 ChatGLM 的批量预测效率。 二.generate 参数 介绍 batch generate 之前&#xff0c;先熟悉…

机器学习-Basic Concept

机器学习(Basic Concept) videopptblog Where does the error come from? 在前面我们讨论误差的时候&#xff0c;我们提到了Average Error On Testing Data是最重要的 A more complex model does not lead to better performance on test data Bias And Variance Bias(偏差) …

四通道本地互联网络(LIN)收发器SIT1024Q

特点&#xff1a; ➢ 兼容“LIN 2.x/ISO 17987-4:2016 (12V)/SAE J2602” 标准&#xff1b; ➢ 兼容 K 线&#xff1b; ➢ 内置过温保护功能&#xff08;热关断&#xff09;&#xff1b; ➢ 内置显性超时功能&#xff1b; ➢ 内置 30kΩ 总线上拉从机电阻&#xff1b; ➢…

微软开测“Moment4”启动包:Win11 23H2要来了

近日&#xff0c; 有用户在Win11最新的7月累积更新中发现&#xff0c;更新文件中已经开始出现了对“Moment4”的引用。 具体来说&#xff0c;在7月累积更新中&#xff0c;微软加入了“Microsoft-Windows-UpdateTargeting-ClientOS-SV2Moment4-EKB”“Microsoft-Windows-23H2Ena…

0101日志-运维-mysql

1 错误日志 错误日志&#xff08;Error Log&#xff09;&#xff1a;错误日志记录了MySQL引擎在运行过程中出现的错误和异常情况。这些错误可能包括启动和关闭问题、数据库崩溃、权限问题等。错误日志对于排查和解决MySQL引擎问题非常有帮助。 改日志默认开启&#xff0c;默认存…

python在不同坐标系中绘制曲线

文章目录 平面直角坐标系空间直角坐标系极坐标地理坐标 平面直角坐标系 回顾我们的数据可视化的学习历程&#xff0c;其实始于笛卡尔坐标系的创建&#xff0c;并由此建立了数与形的对应关系。在笛卡尔坐标系中随便点上一点&#xff0c;这个点天生具备坐标&#xff0c;从而与数…

基于LSTM神经网络的电力负荷预测(Python代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f308;3 Python代码及数据 &#x1f389;4 参考文献 &#x1f4a5;1 概述 前馈神经网络的输出只依赖当前输入&#xff0c;但是在文本、视频、语音等时序数据中&#xff0c;时序数据长度并不固定&#xff0c;前馈神经…

我对排序算法的理解

排序算法一直是一个很困惑我的问题&#xff0c;早在刚开始接触 数据结构的时候&#xff0c;这个地方就很让我不解。就是那种&#xff0c;总是感觉少了些什么的感觉。一开始&#xff0c;重新来过&#xff0c;认真来学习这一部分&#xff0c;也总是学着学着就把概念记住了。过了一…

词典项目练习

思维导图 客户端 #include "head.h" //用户提示界面 void help_info1() {printf("\t-----------------------------------------------\n");printf("\t| HENRY 在线辞典 |\n");printf("\t|版本:0.0.1 …

官方实锤!AMD真的已经有了大小核:不搞Intel那一套

Intel 12代酷睿开始引入大小核混合架构&#xff0c;多核跑分提升立竿见影&#xff0c;在游戏、渲染等场景中也有很好的辅助作用&#xff0c;但因为大核心、小核心基于完全不同的架构&#xff0c;需要复杂的系统、软件调度配合&#xff0c;也直接导致失去了AVX-512指令集。 AMD也…

解决多线程环境下单例模式同时访问生成多个实例

如何满足单例&#xff1a;1.构造方法是private、static方法、if语句判断 ①、单线程 Single类 //Single类&#xff0c;定义一个GetInstance操作&#xff0c;允许客户访问它的唯一实例。GetInstance是一个静态方法&#xff0c;主要负责创建自己的唯一实例 public class LazySi…

浅析hooks,复杂前端业务解题之道

hooks 大势所趋 2019年年初&#xff0c;react 在 16.8.x 版本正式具备了 hooks 能力&#xff0c;同年6月&#xff1b;尤雨溪在 vue/github-issues 里提出了关于 vue3 Component API 的提案&#xff08;vue hooks的基础&#xff09;。在Vue3的组合式API出现后&#xff0c;githu…

VS2017配置Qt开发环境

VS2017配置Qt开发环境 安装Qt5.12.11安装Qt插件在VS2017中进行设置参考教程 安装Qt5.12.11 安装Qt插件 在VS2017中进行设置 参考教程 # Qt下载地址 https://download.qt.io/ # Qt安装 https://blog.csdn.net/jjxcsdn/article/details/125432165?spm1001.2014.3001.5506 # VS2…

【LeetCode】解码方法(动态规划)

解码方法 题目描述算法流程编程代码代码优化 链接: 解码方法 题目描述 算法流程 编程代码 class Solution { public:int numDecodings(string s) {int n s.size();vector<int> dp(n);dp[0] s[0] ! 0;if(n 1) return dp[0];if(s[1] < 9 && s[1] > 1) d…

Packet Tracer – 使用 TFTP 服务器升级思科 IOS 映像。

Packet Tracer – 使用 TFTP 服务器升级思科 IOS 映像。 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 R1 F0/0 192.168.2.1 255.255.255.0 不适用 R2 G0/0 192.168.2.2 255.255.255.0 不适用 S1 VLAN 1 192.168.2.3 255.255.255.0 192.168.2.1 TFTP …