斐波那契查找(黄金分割法查找)思路分析及代码实现

最优化-黄金分割法 原理及代码实现 黄金分割法,也叫0.618法,主要用于单峰函数,通过不断地分割迭代,从而找到近似于最小值的函数值。 阅读详情

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

斐波那契查找原理与前两种相似,仅仅改变了中间结点(mid)的位置,mid不再是中间或插值得到,而是位于黄金分割点附近,即mid=low+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=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位置的值即可。

注意

  1. 斐波那契数列查找需要在有序的数组中进行。
  2. 斐波那契查找算法借助的还是斐波那契数组进行黄金分割数组,即改变mid(中间结点)的值。

代码实现

package com.search;

import java.util.Arrays;

public class FibonaccSearch {

	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));
	}

	// 构建斐波那契数列
	// 非递归
	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 返回对应下标
	 */
	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]值可能大于数组的长度。因此我们需要Arrays类,构造一个新的数组,并指向temp[]
		// 不足的部分会使用0填充
		int[] temp = Arrays.copyOf(a, f[k]);
		// 实际需要使用a数组的最后的数填充temp
		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;
	}
}
黄金分割法matlab源代码-NumLib:NumLib 黄金分割法matlab源代码NumLib 我需要出于本自述文件目的部分中列出的目的而使用的代码 通常,我只是复制了我的旧代码,并根据需要在新项目中对其进行了修改,并留下一条评论说它源自我的另一个项目。 现在,我将拥有一种轻松的方法来维护项目间一致的代码以及标准化的实现。 目的 从常量访问大量数字信息 使用绘图和图形库显示数据 安装 克隆仓库,然后运行命令: python -m pip install -e NumLib (以这种方式运行可确保如果您正在使用Anaconda Envs,则可以在已激活的Env中运行它) 文件NumLib.py类NumLib 是用于将常量加载到NumLib实例的属性中的脚本 可以重新定义常量以更改代码在其中查找数字数据的文件(警告这并不意味着解析算法将理解该文件) (警告)出于与github限制文件大小pi-billion.txt有关的原因,此存储库中未提供...但是可以通过简单的Google搜索并找到MIT十亿位数pi的公开链接来获取。 ()在Linux中使用wget insert-link-here命令可能会有所帮助...本代码作者概不负责对此链接的滥用 立即下载

相关推荐

黄金分割法matlab源代码-365DaysOfCodingJournal:365DaysOfCodingJournal

黄金分割法matlab源代码365DaysOfCodeJournal 在此存储库中,我将记录我正在挑战的进度,结果和输出。 150天完成! 我将记录各种各样的活动,包括但不限于阅读,教程,课程,大学评估,附带项目,工作,解决问题,研究以及与编码/编程有关的一切。 第1天,2020年1月1日 今天的进展:指针的声明,访问,存储,解除引用,算术,动态内存分配以及将指针传递给函数,从C ++中的函数,引用,L和R值返回指针.Gulp JS崩溃过程包括移动和复制文件,串联文件,缩小(uglyfy)文件并优化图像。 想法:最近我一直在学习C ++,它感觉是如此强大,但是使用起来却很简单,因为我真的学会了用C进行编码,所以感觉很熟悉,但是最近我会遇到一些重要的区别。 指针看起来确实很底层,因为它与硬件进行了交互,它给了我力量和对我想做的事情的控制,这真的很有趣。 咕嘟咕嘟是一个方便的工具中,我能做些什么来提高工作流程一个很好的理解,我也不是在知识行李必须的,但相信这不会伤害到学习稍微深一点。 链接到工作/参考: 第2天,2020年1月2日 当今的进步:C ++中的OOP:类,构造函数,初始化列表,

MATLAB黄金分割法

并初始化了黄金分割法的参数。在迭代计算过程中,我们不断计算两个新的区间端点 x1 和 x2,并通过比较它们在目标函数上的取值来缩小区间。当区间长度小于指定的精度要求 tol 时,算法停止迭代,输出最小值和最优解。最后,我们通过绘图描述了优化过程,其中黄色圆点表示找到的最优解。从图中可以看出,在迭代过程中,算法不断收敛于最优解 -1,直至满足精度要求。上述代码中,我们使用 MATLAB 的匿名函数表达式定义了目标函数。以下是使用MATLAB编写黄金分割法的代码,以求解函数f(x)=x。

k42946的博客 6400

黄金分割法 C语言源程序

黄金分割法的搜索过程是: 1) 给出初始搜索区间 [a,b] 及收敛精度 e ,将 赋以0.618 2) 计算a1 和 a2,并计算起对应的函数值 f(a1),f(a2); , 3) 根据期间消去法原理缩短搜索区间,为了能用原来的坐标点计算公式,需进行区间名城的代换,并在保留区间中计算一个新的试验点及其函数值。 4) 检查区间是否缩短到足够小和函数值收敛到足够近,如果条件不满足则返回到步骤2。 5) 如果条件满足,则取最后两试验点的平均值作为极小点的数值近似解。

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

(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。斐波那契数列如:{1,1,2,3,5,8,13,21,34,55},其从第三个数开始,后一个数是前2个数的和,并且斐波那契数列两个相邻的数,前一个数与后一个数的比值无限接近黄金分割值0.618.

weixin_43713707的博客 1401

matlab 斐波那契法 代码

matlab 斐波那契法 代码 运筹学作业编程实现

黄金分割算法

本程序利用黄金分割算法迭代搜索给定功能函数的最大值,同时画出迭代搜索曲线

【python代码】黄金分割法

黄金分割法的python代码实现

weixin_45610907的博客 877

DP83848以太网PHY芯片:自动协商与MII/RMII接口实战解析

以太网物理层(PHY)芯片是嵌入式网络通信的核心,负责数字信号与模拟信号的转换,其稳定性和兼容性直接影响系统性能。其工作原理基于IEEE标准,通过管理接口(MDC/MDIO)配置内部寄存器,实现链路速率、双工模式等关键参数的设定。这项技术的核心价值在于为工业控制、汽车电子等严苛环境提供可靠、自适应的网络连接。在实际应用中,PHY芯片通过自动协商(Auto-Negotiation)功能与对端设备智能匹配最佳通信模式,极大提升了产品的易用性。同时,其支持的MII与RMII接口为硬件设计提供了灵活性,前者是标准并

weixin_29189987的博客 373

黄金分割法(Python)

黄金分割法:(Golden Section Method):又叫做做0.618法,是用于单峰函数区间上求极小值的一种方法。 **基本思想:**通过去试探点和进行函数值比较,使包含极小点的探索区间不断减小,当区间达到一定的程度时,就得到了函数极小点的近似值。 取点法则: 对称取点 等区间收缩率 留点可用 步骤: 设置初始探索区间[a,b],并设置精度e,并计算左右试探点 ​ a1 = a+0.382(b-a) ​

weixin_46327567的博客 1万+

嵌入式NTC温度解算库:Steinhart-Hart定点实现与硬件解耦设计

NTC热敏电阻是嵌入式系统中最常用的模拟温度传感器,其阻值-温度关系高度非线性,需依赖Steinhart-Hart方程实现高精度转换。该方程通过三参数对数多项式建模,理论上可将误差控制在±0.1°C以内,但直接移植到MCU面临浮点开销大、定点溢出、系数精度损失等工程瓶颈。为此,归一化处理(ln(R/R₂₅))、Q24.8定点运算、查表+插值对数计算等优化技术成为资源受限场景下的关键技术路径。其核心价值在于将ADC采样与温度解算彻底解耦,适配各类HAL/裸机/RTOS环境,广泛应用于电池管理、工业PLC、Io

weixin_35756624的博客 647

解决若依Vue3前后端分离---路由切换时显示白屏

解决基于Vue3若依前后端分离项目中出现的路由正常切换但是就是不显示数据的问题,也就是不发起网络请求的问题。

简单点的博客 1604

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

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

猪奥奥的Blog 777

Windows 10 下 Nacos 3.0.2 单机版保姆级安装教程(含JDK 17配置与MySQL 8.0连接避坑)

本文提供Windows 10下Nacos 3.0.2单机版的详细安装教程,涵盖JDK 17配置、MySQL 8.0连接优化及生产级安全设置。通过步骤详解和常见问题解决方案,帮助开发者快速完成Nacos的安装与配置,确保服务发现与配置管理的高效运行。

weixin_29237635的博客 318

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

斐波那契查找思路分析代码实现 思路分析 FibonacciSearch(也叫黄金分割法)的思路分析: ==>实际上,这也是一个基于二分查找(也就是折半查找)的查找算法。只是在计算mid 的值时,加入了斐波那契数列的性质在里边: 1、由于斐波那契数列中,后一个元素与前一个元素之比,接近于0.618的黄金分割比例, 该查找算法就借助斐波那契数列来帮助每一次mid的确认【mid取的是:无限接近于黄金分割点的位置的坐标】 2、因为斐波那契数列的迭代公式为:f(k) = f(k-1) + f(k-2); 所以

qq_47888755的博客 739

LightGBM参数调优实战:从基础到高级技巧

本文深入探讨了LightGBM参数调优的实战技巧。文章从理解其Leaf-wise生长策略的核心逻辑出发,系统性地介绍了分层调参策略:首先调整控制模型结构的参数(如num_leaves),其次优化学习能力参数(如learning_rate),最后通过正则化与随机化参数提升泛化能力。文中还提供了从建立基线到最终微调的完整实战流程与高级避坑指南,帮助读者高效提升模型性能。

i8j9k0l1的博客 261

STM32实现等精度测频

上一章介绍了利用STM32的TIM的捕获功能实现频率测量的方法,但测量误差受被测信号频率的影响,不适合测量频率变化较大的。本章将介绍等精度测频的方法以及STM32的实现。STM3...

zhang062061的专栏 3456

数据结构与算法——Java实现查找算法—斐波那契查找、插值查找、线性查找

注意, 此时斐波那契数列是存放在数组中的, 所以会用F[]表示, 一定要注意跟F()的不同, 比如: F[6] =13 = F(7), F[0] = 1 = F(1)与二分查找法、插值查找法相似,仅仅改变了中间节点(mid)的位置,mid不再是中间或插值得到,而是位于黄金分割点附近。斐波那契数列{1,1,2,3,5,8,13,21,34,55}发现斐波那契数列的。, 说明你要查找的数在mid 的右边, 因此需要递归的向右查找。, 说明你要查找的数在mid 的左边, 因此需要递归的向左查找。

weixin_51351637的博客 811

解决开着代理情况下pip或魔搭下载失败

最近由于经常配环境导致,老是要来回切clash关掉代理,非常的不方便如下面的,魔搭模型下载失败如下面的,pip换源后下载失败。

风吹落叶的博客 2949

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

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

NeverGiveUp 374

chembl_webresource_client 包数据接口下载chembl数据库;ZINC数据库下载、simles获取

点击进去https://zinc.docking.org/subclasses/kinase/predictions/,然后下载sdf模式,这里可以转化simles格式,如果下载csv里面没有包含simles。参考:https://github.com/chembl/chembl_webresource_client/blob/master/demo_wrc.ipynb。参考:https://zinc.docking.org/这是网页搜索查看,16条数据。这个数据这下载特别慢。

weixin_42357472的博客 3046

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

简介 斐波那契搜索(Fibonacci search) ,又称斐波那契查找,是区间中单峰函数的搜索技术。 斐波那契搜索就是在二分查找的基础上根据斐波那契数列进行分割的。在斐波那契数列找一个等于略大于查找表中元素个数的数F[n],将原查找表扩展为长度为F[n] (如果要补充元素,则补充重复最后一个元素,直到满足F[n]个元素),完成后进行斐波那契分割,即F[n]个元素分割为前半部分F[n-1]个元素,后半部分F[n-2]个元素,找出要查找的元素在那一部分并递归,直到找到。 时间复杂度 O(log2n) 思

Fred-X的博客 785

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

查找算法以及代码实现

1.线性查找算法 特别简单的算法,就是遍历数组,一一比较,返回坐标 代码实现: public static void main(String[] args) { int arr[] = { 1, 9, 11, -1, 34, 89 };// 没有顺序的数组 int index = seqSearch(arr, -11); if(index == -1) { System.out....

Piratesa的博客 848

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

四种常用的查找算法(顺序、二分、插值、斐波那契查找)

文章目录1、查找算法2、线性查找算法2.1、基本介绍2.2、代码实现3、二分查找3.1、基本介绍3.2、代码实现4、插值查找4.1、基本介绍4.2、代码实现5、斐波那契(黄金分割法)查找5.1、基本介绍5.2、代码实现 1、查找算法 常用的查找算法有四种: 顺序(线性)查找 二分查找 / 折半查找 插值查找 斐波那契查找 / 黄金分割点查找 2、线性查找算法 2.1、基本介绍 【顺序查找】要求:如果找到了,就提示找到,并给出下标值。 2.2、代码实现 //顺序查找 public class S

qq_45974648的博客 664

查找算法:顺序查找、二分查找、插入查找、斐波那契查找

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

Fisher3652的博客 322

二分查找 + 插值查找 + 斐波那契(黄金分割法)查找

三种查找算法二分查找插值查找斐波那契(黄金分割法)查找 二分查找 思路 代码实现 public class BinarySearch { public static void main(String[] args) { int array[] = { 1, 8, 10, 89,1000,1000,1234}; //int value = binarySearch(array,1000,0,array.length-1); List list = b

desperado0726的博客 248

二分插值斐波那契查找算法和哈希表

查找算法介绍 在java中,我们常用的查找有四种:* 1) 顺序(线性)查找 2) 二分查找/折半查找 3) 插值查找 4) 斐波那契查找 1) 顺序(线性)查找 ​ 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值。 2) 二分查找/折半查找 二分查找的思路分析 首先确定该数组的中间的下标 mid = (left + right) / 2 然后让需要查找的数 findVal 和 arr[

lucylala007的博客 552
上一篇: 插入查找思路分析及代码实现
下一篇: 哈希表思路分析及代码实现
lu_long
博客等级 码龄8年 11粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值