java实现斐波那契(黄金分割法)查找算法

23_斐波那契(黄金分割法)查找(附完整java代码) 23_斐波那契查找 一、算法原理 1.1斐波那契查找基本介绍 黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比,这是一个神奇的数字。 斐波那契数列 {1, 1, 2, 3, 5, 8, 13, 21, 34, 55 } ,可以发现斐波那契数列的两个相邻数的比例,无限接近黄金分割值0.618。 1.2斐波那契查找算法原理 斐波那契查找原理与前两种相似,仅仅改变了中间结点( 阅读详情

一、介绍

  1. 黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位 数字的近似值是 0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神 奇的数字,会带来意向不大的效果。
  2. 斐波那契数列{1,1,2,3,5,8,13,21,34,55}发现斐波那契数列的两个相邻数的比例,无限接近黄金分割值 0.618

二、原理

斐波那契查找原理与前两种相似,仅仅改变了中间结点(mid)的位置,mid 不再是中间或插值得到,而是位于黄金分割点附近,即 mid=low+F(k-1)-1(F 代表斐波那契数列),如下图所示
在这里插入图片描述

1、对 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=low+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++;

三、代码

package search;

import java.util.Arrays;

/**
 * @program: text
 * @description: 斐波那契查找
 * @author: min
 * @create: 2019-08-06 15:30
 **/
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));// 0
    }

    //因为后面我们 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 类,构造一个新的数组,并指向 temp[]
        // 不足的部分会使用 0 填充
        int[] temp = Arrays.copyOf(a, f[k]);
        //实际上需求使用 a 数组最后的数填充 temp
        //举例:
        //temp = {1,8, 10, 89, 1000, 1234, 0, 0} => {1,8, 10, 89, 1000, 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]
                //因为 前面有 f[k-1]个元素,所以可以继续拆分 f[k-1] = f[k-2] + f[k-3]
                //即 在 f[k-1] 的前面继续查找 k--
                //即下次循环 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;
    }
}

转载至:尚硅谷_韩顺平_图解Java数据结构和算法

 

本人原文地址:https://blog.youkuaiyun.com/qq1137623160/article/details/98620791

黄金分割算法java动态实现 黄金分割算法动态实现。java 立即下载

相关推荐

手机如何高效辅助林业调查

手机如何高效辅助林业调查 很多林业工作者将栅格类型的地形图处理后导入平板电脑,在林地使用平板电脑加载小班矢量图,辅助林业调查。但是,如果没有地形图底图,这种方法可能就有难度,而且最重要的是,大部分林地工作者没有能力配置平板电脑。大凡林业基层工作者在林地调查时,除调查记录本等部分纸质材料外,都必然携带手机和水杯,此外其他设备已经成为累赘,尤其是炎热的夏季在杂灌丛生的林地进行调查作业。因此,使用手机...

xu780820的博客 3078

java 中 BigDecimal 详解

首先,学习一个东西,我们都必须要带着问题去学,这边我分为 【为什么?】【是什么?】【怎么用?】 【为什么要用BigDecimal?】 首先,我们先看一下,下面这个现象 那为什么会出现这种情况呢? 因为不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。 注:根本原因是:十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可能不精确...

代码君的博客 20万+

MPU6050运动中断唤醒STM32低功耗休眠模式实战

本文详细介绍了如何使用MPU6050运动中断唤醒STM32低功耗休眠模式的实战方案。通过配置MPU6050的运动检测中断作为STM32的唤醒源,实现设备在静止时进入低功耗Stop模式,运动时快速唤醒,大幅延长电池续航。涵盖硬件连接、软件配置、参数调试等关键步骤,并提供实际应用案例和优化建议。

rgv23456789的博客 703

Java【动态规划】斐波那契数列模型, 图文思路详解 + 代码实现

总结分享四道[斐波那契数列模型] 的题目 : 第N个泰波那契数, 三步问题, 最小爬楼梯花费, 解码方案

yzhcjl_的博客 5575

别再只看成交量了!用通达信这个VOL监测公式,一眼识别主力吸筹与出货信号

本文详细介绍了通达信VOL监测公式的实战应用,通过彩色量柱和换手率分层技术,帮助投资者识别主力吸筹与出货信号。该公式结合动态量能标准化和多周期均线组合,提供可视化主力行为图谱,提升交易决策的准确性。

weixin_28693447的博客 662

寄存器与计数器设计(Verilog)

always @(posedge Reset or posedge Clock)//请在括号中补充敏感信号列表。always @(negedge Resetn , posedge Clock)//请在括号中补充敏感信号列表。always @(negedge Resetn,posedge Clock)//请在括号中补充敏感信号列表。//为了便于自动评测,请勿更改n的值。//为了便于自动评测,请勿更改n的值。//为了便于自动评测,请勿更改n的值。//为了便于自动评测,请勿更改n的值。

M_inherit的博客 364

在Java中,有多种方法可以实现斐波那契数列。以下是几种常见的实现方式:

在实际应用中,递归方法虽然简洁,但效率不高,尤其是对于大数计算。动态规划方法和矩阵快速幂方法更适合计算大数斐波那契数列。贝祖等式虽然理论上可行,但由于精度问题,不推荐用于实际编程实现。在Java中,有多种方法可以实现斐波那契数列。以下是几种常见的实现方式:### 1. 递归方法(简单但效率低)```### 4. 贝祖等式(Binet公式,不推荐用于大数计算,因为存在精度问题)```### 3. 矩阵快速幂方法(高级方法,适用于大数斐波那契计算)```### 2. 动态规划方法(空间优化)

靡不有初,鲜克有终 947

基于 FPGA Vivado 信号发生器设计(附源工程)

今天给大侠带来基于 FPGA Vivado 信号发生器设计,开发板实现使用的是Digilent basys 3,如有想要入手basys3开发板的,可以联系牛总:18511371833。话不多说,上货。 本篇掌握基于 FPGA Vivado 信号发生器设计(附源工程),掌握基于添加文件和IP的Vivado工程设计流程,掌握基于Tcl的Vivado工程设计流程,学习信号发生器的基本组成结构。获取本篇相关源工程代码,可在公众号内回复“信号发生器设计源工程”。 设计原理 信号发生器...

7990

斐波那契数列java代码实现

斐波那契数列 斐波那契数列又称 黄金分割 数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“ 兔子数列 ”; * 指的是这样一个数列:1、1、2、3、5、8、13、21、34、…… *其规律是从第3个数开始,每个数都等于它前两个数的和。 java代码实现 1. 用递归的方法实现: package com; import java.util.Arrays; //1.递归方法 public class test2 { ......

拥抱白菜的猪博客 4万+

基于Spring Boot 3 + Vue 3 + UniApp的全栈高校社团管理小程序设计与实现

requestMatchers("/api/auth/**", "/doc.html", "/webjars/**", "/v3/api-docs/**").permitAll() // 公开接口。<u-search placeholder="搜索活动" v-model="searchKeyword" @search="loadActivities" :showAction="false"></u-search>R.success("活动创建成功") : R.error("活动创建失败");

2201_76125393的博客 369

C#上位机多PLC多协议开发思路:10年老工控师拆解实战方案,避坑90%的问题(附代码框架)

是否连接成功数据地址(如“DB1.DBW0”“D100”“4x0001”)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 953

查找算法java实现——斐波那契(黄金分割法)查找

斐波那契(黄金分割法)查找一、基本思路二、算法分析三、代码实现 一、基本思路 在介绍斐波那契查找之前,让我们先了解几个基本的概念: 黄金分割点:是指把一条线段分成两部分,使其中一部分与全长之比等于另一部分与这部分之比,其比值保留三位小数约为0.618。由于按此比例设计的造型十分美丽,因此成为黄金分割,也称为中外比。 斐波那契数列:{1,1,2,3,5,8,13,21,34,55…}即相邻两个数的和等于这两个数后面的数,通过计算我们可以发现,斐波那契数列中的两个相邻数的比例,无限接近黄金分割值0.618。

猪奥奥的Blog 778

倒立摆的PLC控制(模型分析+ SCL源代码)

首先简单介绍下倒立摆模型,下面这幅图是MATLAB网站上的倒立摆模型,下面我们利用牛顿第二运动定律建立摆杆的运动方程。

RXXW_Dor的博客 3336

查找算法——斐波那契(黄金分割法) Java实现

黄金分割点:取前三位 0.618 菲波那契数列 {1,1,2,3,5,8,13},我们会发现俩个相邻数的比值无限接近于0.618 斐波那契查找原理与前两种(二分、插值)相似,仅改变了中间结点(mid) 的位置,mid不再是中间或插值得到,而是位于黄金分割点附近,即middle = left + F(k-1)-1 (F代表斐波那契数列)。 由斐波那契数列 F (k) =F(x-1) + F(k-2) 的性质, 可以得到(F(k)-1) = ( F (k-1)-1) + (F(k-2) -1) +1。该式说明

共勉 1212

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

JAVA数据结构与算法 09.四大查找算法思路解析和代码实现 【线性查找、二分查找、插值查找、斐波那契(黄金分割法)查找】

JAVA数据结构与算法 09.查找算法 在java中,常用的查找有四种: 顺序(线性)查找 二分查找/折半查找 插值查找 斐波那契查找 按照上面的顺序依次介绍 1. 线性查找 算法介绍:最简单的查找,通过遍历集合,匹配数组中数与待查询数value相同的数字,返回下标;匹配失败返回-1。 特点:顺序遍历;不需要数组有序 代码实现: public class SeqSearch { public static void main(String args[]){ int[] arr

NeverGiveUp 374

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

查找算法-斐波那契

1.黄金分割法基本介绍 黄金分割点是指把一条线段分割为两部分, 使其中一部分与全长之比等于另一部分与这部分之比。 取其前三位数字的近似值是 0.618 斐波那契数列 {1, 1, 2, 3, 5, 8, 13, 21, 34, 55 } 发现斐波那契数列的两个相邻数 的比例, 无限接近黄金分割值0.618 2.黄金分割法原理 斐波那契思想与二分法相类似,不过中间点不再是中点,而变成了黄金分割点的附近mid=low+F(k-1)-1,F代表斐波那契数列 对于F(k-1)-1的含义的理解 F代表的斐

相信明天的博客 635

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

斐波那契(黄金分割法)查找算法 斐波那契(黄金分割法)查找基本介绍: 黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位 数字的近似值是 0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神 奇的数字,会带来意向不大的效果。 斐波那契数列 {1, 1, 2, 3, 5, 8, 13, 21, 34, 55 } 发现斐波那契数列的两个相邻数 的比例,无限接近 黄金分割值 0.618 斐波那契(黄金分割法)原理: 斐波那契

跑马去追XX 434

数据结构之查找(1),2024年网易Java岗面试必问

/ * 2. 向mid 索引值的左边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList。// * 3. 向mid 索引值的右边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList。//向mid 索引值的左边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList。//向mid 索引值的右边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList。// 当 left > right 时,说明递归整个数组,但是没有找到。

2401_87613110的博客 448

查找算法四:斐波那契排序(黄金分割法)

原理: 注意:要求数组必须有序 代码演示及算法思路: package com.monster.search; import java.util.Arrays; /** * @author Monster * @version v1.0 * @time 03-20-2021 12:11:16 * @description: 斐波那契查找算法(黄金分割法):根据斐波那契数列后面一个数等于前面两个数的和把数组分割成两部分 */ public class FibonacciSearch {

qwertyu0103的博客 860

四种查找算法(Java实现)

目录 1.顺序()线性查找 2.二分查找(折半查找) 3.插值查找算法 4.斐波那契查找算法(黄金分割法) 1.顺序()线性查找 1.1代码实现 package com.ws; import java.util.ArrayList; import java.util.List; public class SeqSearch { /** * 顺序查找 * @param arr 要查的数组 * @param value 想查找的值 * @r

w7486的博客 235

查找算法3 斐波那契查找

斐波那契查找(黄金分割法查找) public class FibSearch { public static int maxSize = 20; public static void main(String[] args) { // TODO 自动生成的方法存根 int[] arr = { 1, 8, 10, 89, 1000, 1234 }; System.out.println("index="+fibSearch(arr,1)); } // mid=mid+F(

weixin_43747389的博客 190

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

1)由斐波那契数列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的两段,即如上图所示。3)但顺序表长度n不一定刚好等于F[k]-1,所以需要将原来的顺序表长度n增加至F[k]-1。这里的k值只要能使得F[k]-1恰好大于或等于n即可,由以下代码得到,顺序表长度增加后,新增的位置(从n+1到F[k]-1位置),都赋为n位置的值即可。

m0_63576475的博客 783

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

斐波那契查找算法

dastatham的博客 734

数据结构和算法:斐波那契查找算法

斐波那契查找算法又称黄金分割法查找算法,黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是0.618.由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神奇的数字,会带来意想不到的效果。斐波那契数列{1,1,2,3,5,8,13,21,34,55}发现斐波那契数列的两个相邻数的比例,无限接近黄金分割0.618;

weixin_43597208的博客 279

数据结构与算法---查找算法(Search Algorithm)

查找算法介绍 在java中,我们常用的查找有四种: 顺序(线性)查找 二分查找/折半查找 插值查找 斐波那契查找 1)线性查找算法 示例: 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值。 思路:将数列遍历匹配,就是用for循坏遍历,if匹配数据,找到下标值输出。 ...

weixin_30701575的博客 413
上一篇: java实现哈希表
下一篇: java实现插值查找算法
Roger_CoderLife
博客等级 码龄9年 211粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值