数据结构(Java)——查找算法(二)

别再踩坑了!Vue3 + Vant 手把手教你搞定飞书网页应用免登(SSO),附完整代码和重定向URL配置 本文详细介绍了如何使用Vue3和Vant实现飞书H5应用的免登(SSO)功能,包括飞书后台配置的关键细节、Vue3前端实现的最佳实践以及常见问题排查指南。特别针对重定向URL配置、安全设置和错误处理等常见陷阱提供了解决方案,并附有完整代码示例和性能优化建议。 阅读详情

查找(二)

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

也是在有序数列中进行进行查找的一种方法

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

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

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

image-20211229200816714

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

F是斐波那契数列,k是斐波那契数列的第几个元素

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位置的值即可。

// 非递归方法得到一个斐波那契数列
	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;
	}
	
	public static int fibSearch(int[] a, int key) {//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;
	}

属实不太容易理解这个。

哈希表

是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

image-20211230085435538

应用实例:有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…),当输入该员工的id时,要求查找到该员工所有信息
要求:不使用数据库,速度越快越好=>哈希表(散列)

思路分析:

image-20211230090424242

一个散列函数的求法

public int hashFun(int id) {
		return id % size;
	}
对称加密中GCM和CBC俩种加密模式的区别 **CBC(Cipher Block Chaining)** 和 **GCM(Galois/Counter Mode)** 是两种常见的对称加密模式。它们的主要区别体现在加密方式、性能和安全性上。 阅读详情

相关推荐

半桥LLC谐振变换器及同步整流MATLAB仿真(二)

接上文,半桥LLC谐振变换器及同步整流MATLAB仿真

qq_55203246的博客 4331

以下哪种数据结构的查找效率最高

网易2017实习生招聘笔试题-Java开发工程师 以下哪种数据结构的查找效率最高 A 二叉树 B 队列 C 栈 D hash 个人参考答案:D欢迎下方讨论交流

xhyxxx的博客 2万+

Ubuntu系统下STM32开发环境搭建:从零配置CubeMX、VSCode与OpenOCD调试实战

本文详细介绍了在Ubuntu系统下搭建STM32开发环境的完整流程,包括CubeMX、VSCode和OpenOCD的安装配置。通过实战教程指导开发者从基础环境准备到工程创建与调试,提供高效的嵌入式开发解决方案,并分享常见问题解决方法。

potato的博客 942

java四个数24_【Java】基础24:数据的存与取

在计算机世界里面所有的一切皆是数据,其存在的形式为二进制,也就是只有0和1。那么对于计算机来说,它需要做好两件事:如何存这些数据?如何取这些数据?这两件事情的过程就是数据结构。所以不要看这个定义好像很复杂的样子,其实很好理解,就是如何存数据和如何取数据。现在主要介绍简单的几个数据结构。一、堆栈和队列其实关于这两种数据结构,用中国的一个成语推陈出新就可以理解,这里面还牵扯到了一个小故事。《九章算术...

weixin_34221197的博客 244

【AAAI2025】【小目标检测】FBRT-YOLO:更快速、更优的实时航拍图像检测方法

FBRT-YOLO是一种新型实时航拍图像检测方法,针对小目标检测的精度与效率平衡问题提出创新解决方案。该方法通过两个轻量级模块显著提升性能:特征互补映射模块(FCM)将浅层空间位置信息深度整合至网络深层,缓解信息失衡;多核感知单元(MKP)采用多尺度卷积增强多目标感知能力。实验表明,在VisDrone、UAVDT和AI-TOD数据集上,FBRT-YOLO在检测精度和速度方面均优于现有实时检测器,特别适用于资源受限的飞行设备。该模型通过精简网络结构,在保持高性能的同时降低了计算负担,为航拍实时检测提供了高效解

weixin_44184852的博客 2907

Cadence Virtuoso IC617:从零构建传输门与反相器的Schematic设计实战

本文详细介绍了使用Cadence Virtuoso IC617进行传输门与反相器Schematic设计的完整流程,包括环境准备、原理图绘制、Symbol创建、仿真验证及实用技巧。通过分步指导和实战经验分享,帮助初学者快速掌握集成电路设计基础,提升EDA工具应用能力。

weixin_29194693的博客 600

数据结构与算法之查找(Java版)

顺序查找 代码实现: public class SeqSearch { public static void main(String[] args) { int[] arr ={1,9,11,-1,34,89}; int index = seqSearch(arr, 11); if (index == -1){ System.out.println("没有找到"); }else { Sys

weixin_45802793的博客 241

「点燃我,温暖你」用Python制作一个动态爱心效果

最近「点燃我,温暖你」这部剧非常火,讲述的是程序员的爱情故事。其中陈飞宇饰演的男主李峋,在剧中用程序做出的爱心跳动效果,非常炫。

Modeler_xiaoyu的博客 1万+

java 效率极高的查询数据结构——SkipList 跳表

前一阵子和朋友聊天,他和我讲在面试中被问到跳表。当时我也很迷从来没听说过跳表,赶快学习了一下,学习了之后才发现这个数据结构不是很难,而且效率非常高,在平均情况下查找的时间复杂度约为O(log n)堪比平衡树。而且具体的数据结构的实现也非常有趣。SkipList 跳跃列表原理跳跃列表是一种由多条链表组合而成的允许快速查询有序元素的数据结构。跳跃列表中的每条链表表示一个层,每一层存在的元素都是前一层(前

往事散云烟,十寸光阴换一钱 5012

「UG/NX」Block UI 曲线收集器CurveCollector

曲线收集器块用于选择一条或多条曲线,包括通过选择意图连接的末端曲线链。曲线选择意图用于此块,但它不支持“交点处停止”、“跟随圆角”、“中间链”和“特征内链”等规则选项。

何曾参静谧的博客 1090

【AI智能体】Codex + Seedance2.5 制作AI视频实战操作详解

【AI智能体】Codex + Seedance2.5 制作AI视频实战操作详解

congge_study的博客 3819

java查找排序的算法_java数据结构(二)常用简单的查找、排序算法

java数据结构(二)常用简单的查找、排序算法理解了Java数据结构,还必须要掌握一些常见的基本算法。理解算法之前必须要先理解的几个算法的概念:空间复杂度:一句来理解就是,此算法在规模为n的情况下额外消耗的储存空间。时间复杂度:一句来理解就是,此算法在规模为n的情况下,一个算法中的语句执行次数称为语句频度或时间频度。稳定性:主要是来描述算法,每次执行完,得到的结果都是一样的,但是可以不同的顺序输...

weixin_32672675的博客 262

Unity的粒子系统使用shadergraph(内置管线)制作的一个顶点偏移shader,但是粒子模型移动时,顶点也会偏移?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1174

JAVA数据结构和算法(二)—线性查找

Question:N个不重复的数,按照线性查找其中的某个数,则该数所查找用的次数为? Answer: (1)概念:线型查找:把数组的每一个元素和检索关键字比较,按顺序从第一个元素一直检索到要查找的元素, 平均来说,程序要把查找关键字与一半数组元素进行比较。 (2)举例说明(Java语言): int[] c = {1,2,3,4,5,6,7,8,9,10};(为了演示方便直接取的1

迎着晨曦,Keep Going 410

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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...

数据结构笔记(二)—— 排序算法和查找算法(java代码实现)

数据结构——绪论 数据结构简介 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7vaPjMSg-1624172502134)(C:\Users\value\AppData\Roaming\Typora\typora-user-images\image-20210321175244346.png)] 数据、数据元素、数据项、数据对象 数据 是能被输入计算机且能被计算机处理的各种符号的集合 信息的载体 是对客观事物符号化的表示 能够被计算机识别、存储和加工 包括

qq_45473439的博客 212

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数据结构Java版(二):用递归计算二叉树中叶子节点数目、实现图的存储、实现二分查找算法、实现双向冒泡排序算法

数据结构Java版(二):用递归计算二叉树中叶子节点数目、实现图的存储、实现二分查找算法、实现双向冒泡排序算法

weixin_50736686的博客 1055

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

使用Java实现数据结构和算法:排序、查找、图

数据结构和算法是计算机科学的两个基石,它们是解决各种复杂问题和优化计算机程序的关键工具。提高程序效率:好的数据结构和算法可以让程序更快地运行,更有效地利用计算资源。例如,使用快速排序算法比使用冒泡排序算法可以大大减少排序时间。解决复杂问题:数据结构和算法可以帮助开发人员解决各种复杂问题,如图形处理、人工智能、大数据处理等。例如,使用适当的数据结构和算法可以使搜索引擎更好地处理用户查询,并返回最相关的结果。提高程序可靠性:使用正确的数据结构和算法可以避免程序运行时出现各种错误和异常。

小易 178

Java基础算法与数据结构

包装类就是基本数据类型所对应的对象.

MOVEhomie的博客 736

java算法题思路_算法题思路总结

引言算法题,无外乎两类:一类考对基本算法实现的掌握,另一类考运用算法解决实际问题。第一类:排序:快排、归并排序、堆排序怎么实现的?查找:有序数组的二分查找、二叉查找树怎么实现的、红黑树是什么?字符串:KMP会吗?鄙人不才,只能想到算法世界里的冰山一角。这些基本算法的实现过程中的思想,需要掌握!最好能用自己的话讲明白。第二类:运用数据结构解决实际问题。这种题目有两个考察点:1、找到一种解决问题的算法...

weixin_39827798的博客 317

算法简介之二分查找

其实日常的开发中,因为更多的是复杂的业务逻辑,但分解之后,其实用到的算法知识并不多,更何况作为一名Java程序员,常用类库中已经实现了一些算法,例如排序,Hash等,但是随着开发的深入,我意识到算法其实不只是为了去解决一种特定的问题,也是开阔思维的一种很棒的办法,特开此篇,一方面学习,一方面记录。 其实二分查找的思想在生活中很多地方都有运用,比如我们猜数的时候,例如给定0-4000的范围选出一个数...

u012476022的博客 240

Java数据结构与算法入门

第一部分:Java数据结构要理解Java数据结构,必须能清楚何为数据结构?数据结构:Data_Structure,它是储存数据的一种结构体,在此结构中储存一些数据,而这些数据之间有一定的关系。而各数据元素之间的相互关系,又包括三个组成成分,数据的逻辑结构,数据的存储结构和数据运算结构。而一个数据结构的设计过程分成抽象层、数据结构层和实现层。数据结构在Java的语言体系中按逻辑结构可以分为两大类:线...

qq_37101453的博客 3万+

Java数据结构课程设计 二叉树查找

题目:在二叉树中查找值为X的结点,试设计打印值为X的结点的所有祖先的算法,假设值为X的结点不多于1个。 import java.util.*; public class BinTree { private List binTree; public static void main(String[] args) { Scanner reader = new Scanner(System

揸支枪|去打仗 1790

【数据结构查找算法篇】----线性查找【实战项目】

在数据结构中,有许多查找算法,它们根据数据的存储结构方式和结构的特点而有所区别,关于数据结构查找算法的学习,博主会依次详细的介绍现在比较常见的查找算法,通过对算法的介绍,搭配Java的实战项目,更深层次的对算法进行讲解。今天,我们就来介绍一下比较简单的查找算法----线性查找。线性查找,也叫顺序查找(Sequential Search),是一种最基本的查找算法。它适用于元素随机排列的数组(或者其他线性数据结构,如链表)。这种查找算法不要求数据被排序。线性查找的工作原理是。

m0_71685576的博客 1775

Java数据结构和算法

【前言】 Java数据结构和算法 BliBli视频链接地址为:《Java 数据结构与算法视频教程全集(195P)| 50 小时从入门到精通》 需要完整笔记课件等资料请联系邮箱:shaneholmes@qq.com 关于我的GitHub 以下是Java数据结构和算法的代码 Java数据结构和算法 ...

ShaneHolmes 2009

数据结构与算法【Java】06---七大查找算法总结

七大查找算法,查找算法分类,查找算法时间复杂度分析,查找算法代码实现,顺序查找,二分查找,插值查找,斐波那契查找,分块查找,哈希查找,树表查找,哈希表解决冲突的方法

鹤鸣呦呦、、的博客 2429

java数据结构与算法之“查找算法”

文章目录java数据结构与算法之“查找算法”查找算法介绍线性查找算法代码实现二分查找算法二分查找二分查找算法思路二分查找代码实现插值查找算法插值算法原理介绍举例说明插值查找算法 1-100 的数组代码实现注意事项斐波那契(黄金分割法)查找算法斐波那契(黄金分割法)查找基本介绍:斐波那契(黄金分割法)原理:对 F(k-1)-1 的理解:代码实现 java数据结构与算法之“查找算法” 查找算法介绍 在 java 中, 我们常用的查找有四种: 顺序(线性)查找 二分查找/折半查找 插值查找 斐波那契查找

ruan_luqingnian的博客 585
上一篇: 数据结构(Java)——查找算法(一)
下一篇: 关于vue点击下载的避坑指南
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

痞子三分冷ゾジ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值