图解算法--查找算法

目录

查找算法

一、顺序查找

二、二分法查找

三、插值查找法

四、斐波那契查找法


查找算法

查找算法根据数据量的大小,可以将其分为以下两种

  1. 内部查找:内部查找是指在内存或内部存储器中进行查找操作的算法。内部查找适用于数据量较小、存储在内存中或者访问速度较快的情况。常见的内部查找算法有顺序查找、二分法查找、插值查找等。
  2. 外部查找:外部查找是指在大规模数据集合或存储在外部磁盘等辅助存储介质中进行查找操作的算法。

查找的表格或数据是否变动分为以下两种

  1. 静态查找:静态查找是指在不改变被查找数据的情况下进行的查找操作。即被查找的表格或数据在查找过程中保持不变。静态查找适用于对静态或只读数据进行查找的场景。一旦建立好索引或者表格,就可以反复进行查找操作而不需要修改数据。常见的静态查找算法有顺序查找、二分法查找、插值查找等。
  2. 动态查找:动态查找是指在查找过程中可能会修改被查找数据的情况下进行的查找操作。即被查找的表格或数据在查找过程中可能被增加、删除或更新。动态查找适用于对动态数据进行查找的场景,需要实时地对数据变动做出响应。常见的动态查找算法有二叉搜索树、AVL树、红黑树等,这些树结构可以实现高效的查找同时支持动态数据的插入、删除。

一、顺序查找

图解:

算法原理:顺序查找,也称线性查找,是一种基本的查找算法。它逐个地从待查找的元素序列中进行比较,直到找到目标元素或遍历完整个序列为止。具体步骤如下:

  • 从序列的第一个元素开始,依次与目标元素进行比较。
  • 若当前元素等于目标元素,则查找成功,并返回相应的位置。
  • 若当前元素不等于目标元素,则继续下一个元素进行比较。
  • 若遍历完整个序列仍未找到目标元素,则查找失败。

案例代码:

public class javaDemo1 {public static void main(String[] args) {int data[] = new int[100];int Target = 99;int TargetIndex = -1;Random random = new Random();for (int i=0;i< data.length;i++){data[i] = random.nextInt(100);}//        循序查找for (int j=0;j< data.length;j++){if (data[j] == Target){TargetIndex = j;break;}}System.out.println(Arrays.toString(data));if (TargetIndex!= -1){System.out.println("找到数据啦,在第"+(TargetIndex+1)+"个数据处");}else {System.out.println("抱歉,并没有找到目标数据 喵");}}
}

算法总结:顺序查找的时间复杂度为O(n),其中n为待查找序列的长度。由于其简单直观的特点,适用于小规模数据或者无序的数据集合。


二、二分法查找

图解:

算法原理:二分法查找,也称折半查找,是一种高效的查找算法,要求待查找的序列必须是有序的。它通过不断缩小查找范围来快速定位目标元素。具体步骤如下:

  • 将有序序列的首元素和尾元素分别作为左右边界。
  • 计算中间位置mid,取得序列中间的元素。
  • 若中间元素等于目标元素,则查找成功,并返回相应的位置。
  • 若中间元素大于目标元素,则目标元素可能在左半部分,缩小范围为左边界到mid-1的序列。
  • 若中间元素小于目标元素,则目标元素可能在右半部分,缩小范围为mid+1到右边界的序列。
  • 重复以上步骤,直到找到目标元素或查找范围为空。

案例代码:

public class javaDemo2 {public static void main(String[] args) {int data[] = new int[10];
//        目标值与目标值对应的下角标int Target = 3;int TargetIndex = -1;//        二分法的下界与上界int low = 0;int high = data.length-1;int middle;Random random = new Random();for (int i=0;i< data.length;i++){data[i] = random.nextInt(10);}
//        形成有序数组Arrays.sort(data);
//        二分法查找while (low<=high){middle = (low+high)/2;if (data[middle]>Target){high = middle-1;}else if (data[middle]<Target){low = middle + 1;}else {TargetIndex = middle;break;}}System.out.println(Arrays.toString(data));System.out.println("目标值为"+Target);if (TargetIndex!= -1){System.out.println("找到数据啦,在第"+(TargetIndex+1)+"个数据处");}else {System.out.println("抱歉,并没有找到目标数据 喵");}}
}

算法总结:二分法查找的时间复杂度为O(log n),其中n为待查找序列的长度。由于每次都将查找范围缩小一半,因此效率较高。


三、插值查找法

图解:

算法原理:插值查找法是一种基于二分法的优化查找算法,它在有序序列中根据目标元素的估计位置进行查找,从而提高了查找速度。具体步骤如下:

  • 计算目标元素相对于首尾元素的估计位置,即通过公式(target - arr[left]) / (arr[right] - arr[left]) * (right - left) + left 计算出插值位置mid。
  • 若插值位置mid超出数组范围,或目标元素小于首元素或大于尾元素,则说明目标元素不存在。
  • 若插值位置mid处的元素等于目标元素,则查找成功,并返回相应的位置。
  • 若插值位置mid处的元素大于目标元素,则目标元素可能在左半部分,缩小范围为左边界到mid-1的序列。
  • 若插值位置mid处的元素小于目标元素,则目标元素可能在右半部分,缩小范围为mid+1到右边界的序列。
  • 重复以上步骤,直到找到目标元素或查找范围为空。

案例代码:

public class InsertSerach {public static void main(String[] args) {int data[] = new int[10];int Target = 9;int TargetIndex = -1;int low = 0;int high = data.length-1;int middle;Random random = new Random();for (int i= 0;i< data.length;i++){data[i] = random.nextInt(10);}
//        实现数组排列有序Arrays.sort(data);
//        插入查找while (low<=high){middle = low + (high - low) * (Target - data[low]) / (data[high] - data[low]);if (data[middle]<Target){low = middle +1;}else if (data[middle]>Target){high= middle -1;}else {TargetIndex = middle;break;}}System.out.println(Arrays.toString(data));if (TargetIndex!= -1){System.out.println("找到数据啦,在第"+(TargetIndex+1)+"个数据处");}else {System.out.println("抱歉,并没有找到目标数据 喵");}}
}

算法总结:插值查找法的时间复杂度为O(log log n),其中n为待查找序列的长度。它适用于分布均匀的有序序列,但对于分布不均匀的序列效果可能不理想。


四、斐波那契查找法

图解:

算法原理:斐波那契查找法是一种改进的二分查找算法,它利用了黄金分割原理进行查找。首先,需要创建一个斐波那契数列,该数列中的每个元素都是前两个元素之和。

在使用斐波那契查找法时,首先要确定一个斐波那契数列的长度,使得该长度不小于待查找数组的长度。然后,根据斐波那契数列的长度确定两个斐波那契数值——F(k)-1和F(k-2)-1。

接着,在待查找的有序数组中,以F(k)-1位置的元素作为中间值进行比较:

  • 若目标值等于中间值,则查找成功,并返回相应的位置。
  • 若目标值小于中间值,则在中间值的左半部分继续斐波那契查找。
  • 若目标值大于中间值,则在中间值的右半部分继续斐波那契查找。

每次比较后,根据查找范围的缩小情况,选择新的中间值进行下一次的比较,直到找到目标值或者查找范围为空。

案例代码:

public class FibonacciSearch {public static void main(String[] args) {int data[] = new int[10];int Target = 9;int TargetIndex = -1;int low = 0;int high = data.length - 1;int middle = 0;Random random = new Random();for (int i = 0; i < data.length; i++) {data[i] = random.nextInt(10);}Arrays.sort(data);// 生成斐波那契数列int[] fibonacci = generateFibonacci(data.length);// 根据斐波那契数列确定数组长度的最接近值int length = getClosestFibonacciNumber(data.length);// 扩展数组长度至斐波那契数列长度int[] extendedData = Arrays.copyOf(data, length);for (int i = data.length; i < extendedData.length; i++) {extendedData[i] = extendedData[data.length - 1];}while (low <= high) {int k = fibonacci[middle - 1];if (Target < extendedData[middle]) {high = middle - 1;middle = low + k - 1;} else if (Target > extendedData[middle]) {low = middle + 1;middle = low + k;} else {TargetIndex = Math.min(middle, high);break;}}System.out.println(Arrays.toString(data));if (TargetIndex != -1) {System.out.println("找到数据啦,在第" + (TargetIndex + 1) + "个数据处");} else {System.out.println("抱歉,并没有找到目标数据 喵");}}// 生成斐波那契数列private static int[] generateFibonacci(int length) {int[] fibonacci = new int[length];fibonacci[0] = 1;fibonacci[1] = 1;for (int i = 2; i < length; i++) {fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];}return fibonacci;}// 获取斐波那契数列中与数组长度最接近的数值private static int getClosestFibonacciNumber(int n) {int a = 0;int b = 1;while (b <= n) {int temp = b;b = a + b;a = temp;}return a;}
}

算法总结:斐波那契查找法相比传统二分查找法的优点是,它能够更快地逼近目标值,并且避免了二分查找中取中间值时产生的整数溢出问题。但在某些情况下,斐波那契查找法的性能可能不如二分查找法,因此在实际应用中需要根据具体情况选择合适的查找算法。


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

概念解析 | 量子机器学习:将量子力学与人工智能的奇妙融合

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:量子机器学习。 量子机器学习:将量子力学与人工智能的奇妙融合 量子增强机器学习:量子经典混合卷积神经网络 量子机器学习是量子计算和机器学习的结合,它利用量子力学的特…

探讨uniapp的路由与页面栈及参数传递问题

1首先引入页面栈 框架以栈的形式管理当前所有页面&#xff0c; 当发生路由切换的时候&#xff0c;页面栈的表现如下&#xff1a; 页面的路由操作无非&#xff1a;初始化、打开新页面、页面重定向、页面返回、tab切换、重加载。 2页面路由 uni-app 有两种页面路由跳转方式&am…

【实训项目】精点考研

1.设计摘要 如果说高考是一次能够改变命运的考试&#xff0c;那么考研应该是另外一次。为什么那么多人都要考研呢&#xff1f;从中国教育在线官方公布是考研动机调查来看&#xff0c;大家扎堆考研的原因大概集中在这6个方面&#xff1a;本科就业压力大&#xff0c;提升竞争力、…

视频汇聚/视频云存储/视频监控管理平台EasyCVR视频平台添加萤火云设备的具体操作步骤

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

解析肖特基二极管NRVBS360BNT3G整流器的优缺点及应用

何为肖特基二极管整流器&#xff1f; 是一种常用的电子器件&#xff0c;用于将交流信号转换为直流信号。它由一个PN结和一个金属接触组成&#xff0c;具有较低的正向压降和快速的开关特性。 在正向偏置下&#xff0c;肖特基二极管具有较低的正向压降&#xff0c;通常为0.3-0.…

笔记本电脑功率怎么看?记好这2个方法!

在使用笔记本电脑时&#xff0c;其功率是一个很重要的指标。笔记本电脑功率是影响其性能、续航和热管理的重要因素。不同的功率水平可以带来不同的使用体验。 本文将解释不同的笔记本电脑功率对设备的影响&#xff0c;并详细介绍几种查看笔记本电脑功率的方法。继续往下看吧&a…

安全生产作业现场违规行为识别 opencv

安全生产作业现场违规行为识别算法通过pythonopencv网络模型算法框架设定了各种合规行为和违规行为的模型&#xff0c;安全生产作业现场违规行为识别算法检测到违规行为&#xff0c;将立即进行抓拍并发送告警信息给相关人员&#xff0c;以便及时采取相应的处置措施。OpenCV是一…

基于OV2640/ OV5640 的图像采集显示系统

基于OV2640/ OV5640 的图像采集显示系统系列文章目录&#xff1a; &#xff08;1&#xff09;基于 OV5640 摄像头理论知识讲解-成像和采样原理 &#xff08;2&#xff09;基于 OV5640 摄像头理论知识讲解-数字接口和控制接口 &#xff08;3&#xff09;基于 OV5640 摄像头理论知…

vscode+ros开发环境搭建

目录 介绍 前提 vscode安装 vscode插件安装 工作空间准备 打开vscode 创建catkin包 编写cpp代码 编译 运行 启动ros服务 监听话题 启动ros测试 介绍 ros开发是机器人开发中必不可少的工作&#xff0c;语言选择可以是c,也可以是python。工具的话&#xff0c;不能像wi…

ceph中PGLog处理流程

ceph的PGLog是由PG来维护&#xff0c;记录了该PG的所有操作&#xff0c;其作用类似于数据库里的undo log。PGLog通常只保存近千条的操作记录(默认是3000条&#xff0c; 由osd_min_pg_log_entries指定)&#xff0c;但是当PG处于降级状态时&#xff0c;就会保存更多的日志&#x…

React 生命周期

React的生命周期 一、什么是React的生命周期二、传统生命周期2.1、挂载&#xff08;Mounting&#xff09;2.2、更新&#xff08;Updating&#xff09;2.3、卸载&#xff08;Unmounting&#xff09;2.4、API2.4.1、render2.4.1.1、Updating 阶段&#xff0c;render调用完还有可能…

WPF基础入门-Class6-WPF通知更改

WPF基础入门 Class6-WPF通知 1、显示页面&#xff1a; <Grid><StackPanel><TextBox Text"{Binding Name}"></TextBox><TextBox Text"{Binding Title}"></TextBox><Button Command"{Binding ShowCommand}&qu…

初次跑yolo5遇到的一些问题

1. ImportError: cannot import name COMMON_SAFE_ASCII_CHARACTERS‘ from charset-normalizerconstant‘ 这个报错可能是由于charset_normalizer模块的版本问题引起的。尝试更新charset_normalizer模块到最新版本&#xff0c;或者使用较旧的版本&#xff0c;看看是否可以解…

用AI + Milvus Cloud搭建着装搭配推荐系统

在上一篇文章中,我们学习了如何利用人工智能技术(例如开源 AI 向量数据库 Milvus Cloud 和 Hugging Face 模型)寻找与自己穿搭风格相似的明星。在这篇文章中,我们将进一步介绍如何通过对上篇文章中的项目代码稍作修改,获得更详细和准确的结果,文末附赠彩蛋。 注:试用此…

Ansys Zemax | 手机镜头设计 - 第 2 部分:使用 OpticsBuilder 实现光机械封装

本文是3篇系列文章的一部分&#xff0c;该系列文章将讨论智能手机镜头模块设计的挑战&#xff0c;从概念、设计到制造和结构变形的分析。本文是三部分系列的第二部分。概括介绍了如何在 CAD 中编辑光学系统的光学元件以及如何在添加机械元件后使用 Zemax OpticsBuilder 分析系统…

Python切换输入法的实战代码

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

大模型开发05:PDF 翻译工具开发实战

大模型开发实战05:PDF 翻译工具开发实战 PDF-Translator 机器翻译是最广泛和基础的 NLP 任务 PDF-Translator PDF 翻译器是一个使用 AI 大模型技术将英文 PDF 书籍翻译成中文的工具。这个工具使用了大型语言模型 (LLMs),如 ChatGLM 和 OpenAI 的 GPT-3 以及 GPT-3.5 Turbo 来…

NewStarCTF 2022 web方向题解 wp

----------WEEK1---------- BUU NewStarCTF 公开赛赛道 WEEK1 [NotPHP] 先看题目&#xff0c;要传参加绕过。 分析一下代码&#xff1a;首先get一个datadata://test/plain,Wel…。然后key1和2用数组可以绕过。num2077a可以绕过弱类型。eval()中的php语句被#注释了&#xff0c…

成都智慧企业发展研究院总经理郑小华:践行双轮驱动,为能源电力数智化注入新活力丨数据猿专访...

大数据产业创新服务媒体 ——聚焦数据 改变商业 随着全球经济走向数字化&#xff0c;中国正处于这一浪潮的前沿&#xff0c;进行前所未有的技术与产业深度融合。政府在2023年2月印发的《数字中国建设整体布局规划》等政策下&#xff0c;明确展示了对数字经济的支持与鼓励&…