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

最优化-黄金分割法 原理及代码实现 黄金分割法,也叫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

Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包

联网情况下在命令终端CMD中输入“pip install numpy”即可自动安装,pandas和matplotlib同理一样方法进行自动安装。 工作的电脑不能上外网,所以不能通过直接输入pip命令来安装。 环境:电脑上已经安装了Python(没有安装的请参考其他教程)。 Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包的步骤如下: ...

dayou7738的博客 4940

黄金分割法(Python)

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

weixin_46327567的博客 1万+

【上海大学计算机组成原理实验报告】七、程序转移机制

学习实现程序转移的硬件机制//掌握堆栈寄存器的使用//手动方式实现子程序调用转移过程//手动方式实现子程序返回转移过程//编程实现`OUT`寄存器交替显示`11`和`55`//若要求`11`和`55`各显示`50`次后停机,应该如何修改程序?//根据实验指导书的相关内容,实验箱系统的程序转移硬件机制在于,当`LDPC`有效时,如果此时`DUBS`上的值就是转移的目标地址,则此目标地址被打入`PC`,从而实现程序的转移;若`LDPC`为`0`是附带条件的,就形成“条件转移”。

HackerKevon的博客 2471

PyTorch实战:5步搞定Res2Net图像分类模型(附完整代码)

本文详细介绍了如何使用PyTorch在5步内构建高性能Res2Net图像分类模型,包括环境配置、核心模块实现、完整网络架构搭建、训练流程优化及模型部署技巧。Res2Net通过多尺度特征融合机制显著提升图像分类性能,附完整代码帮助开发者快速实践。

java5的博客 1022

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

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

猪奥奥的Blog 777

ATR2660:卫星导航高增益低噪声放大器芯片数据手册

中国BDS(北斗卫星导航系统),美国的GPS,俄罗斯的GLONASS和欧盟的GALILEO导航系统应用而专门设计。芯片支持3.3V至5V宽电源供电。采用2级放大器的结构设计,具有28dB高增益和0.85dB的低噪声系数。支持BDS、GPS、GALILEO、GLONASS等L。典型功率增益:30dB@5V;典型输入P1dB:-18dBm@3.3V;典型工作电流:12.7mA@3.3V;宽供电电压范围:3.3V~5V;典型噪声系数:0.85dB;频段的多个卫星导航系统;ATR2660是一颗。

YHPsophie的博客 560

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

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

qq_47888755的博客 739

FineBI学习总结

交叉表:一组作为行标题显示在表的左部,另一组作为列标题显示在表的顶部。连接到数据,如果数据不满足数据分析的需求,先进行自助数据集处理。数据集分类:DB表、SQL、Excel、自助数据集。分组表:将报表中的数据按相同项合并为一组显示。1、数据准备2、制作仪表板3、分享仪表板。左合并:保留左边全部数据,合并右边。右合并:保留右边全部数据,合并左边。上下拼接:上下拼接到一张表数据。3、如何实现拼表:多表拼一张。分组–业务包–数据集–字段。字段分类:数值、文本和日期。目录–仪表板–数据准备。维度:文本和日期类型。

Rsun2018的博客 1561

SillyTavern 酒馆在 Mac 和 Linux 上的部署教程(含启动器安装方法)

SillyTavern 是一个支持多种大模型聊天接口的本地前端项目,适用于 MacOS 和 Linux 系统。本文提供了两种部署方式:手动安装和使用 SillyTavern Launcher 安装器。手动安装需要先安装 Git 和 NodeJS,然后克隆项目源码并运行启动脚本。使用 Launcher 则更为简便,适合新手用户,能够自动安装依赖和配置环境。部署完成后,用户可以通过浏览器访问本地服务器,加载角色卡片并连接大模型 API,享受二次元角色扮演聊天的乐趣。无论是开发者还是终端用户,都能轻松完成 Sil

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3392

数据结构与算法——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

Open3D——点云构建Delaunay三角网【2026最新版】

点云构建Delaunay三角网

点云侠的博客 8365

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

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

NeverGiveUp 374

Agent驱动电商运营:从选品到售后的全链路革新

在当今竞争激烈的电商市场中,传统的电商运营模式面临着诸多挑战。从选品到售后,每个环节都需要大量的人力投入和专业知识。选品需要深入了解市场趋势和消费者需求,营销需要精准定位目标用户,客服需要24小时响应用户咨询。这些工作不仅耗时耗力,而且容易受到人为因素的影响,导致效率低下和成本高企。AI Agent是一种能够感知环境、做出决策并采取行动的智能系统。感知能力:能够获取和处理环境信息。决策能力:能够根据感知到的信息做出决策。行动能力:能够执行决策,对环境产生影响。学习能力。

AI 领航者的博客 354

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

Fred-X的博客 785

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

查找算法以及代码实现

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

文章目录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、付费专栏及课程。

余额充值