算法3:查找算法

查找算法

常用查找算法

1,顺序(线性)查找

2,二分查找/折半查找

3,插值查找

4,斐波那契查找

线性查找

线性查找,通过遍历和逐一比对,在发现相同值时返回下标

代码如下
public int Seqsearch(int t, int[] arr) {for (int i = 0; i < arr.length; i++) {if (t == arr[i]) {return i;}}return -1;
}

二分查找

只能对有序数组查找

使用递归进行二分查找

1,确定数组中间的下标

2,让需要查找的数字与mid进行比较,递归向左或者右进行查找

3,得到结果

代码如下
public int binarysearch(int t,int left,int right,int[] arr){int mid = (left+right)/2;if(left>right){return -1;}if(arr[mid]==t){return mid;}else if(arr[mid]>t){return binarysearch(t,left,mid-1,arr);//递归最终返回mid}else{return binarysearch(t,mid+1,right,arr);//递归最终返回mid}
}
升级二分查找

找到数组所有的符合条件元素(相同元素全部返回)

在找到元素后向其左右扫描,直到扫完全部相同元素,放入一个集合中

最后返回一个集合

插值查找

类似于二分查找,但插值查找每次从自适应mid处开始查找

插值索引公式:mid = low+(high-low)*(key-arr[low])/(arr[high]-arr[low])

即每次重新查找会根据上一次的mid值与所求值的差值大小占整个查找范围差值大小的比值进行查找

在分布均匀的数组中较为优势

eg:在一个0-100的数组中查找值,可以直接一次找到

代码如下
public int insertsearch(int t,int left,int right,int[] arr){if(t>right || t<left){return -1;}int mid = left+(right-left)*(t-arr[left])/(arr[right]-arr[left]);if(left>=right){return -1;}if(arr[mid]==t){return mid;}else if(arr[mid]>t){return insertsearch(t,left,mid-1,arr);}else{return insertsearch(t,mid+1,right,arr);}}

在不均匀的数据结构中,这个查找方法不一定有优势

斐波那契查找算法

斐波那契数列元素之间的比例无限接近于黄金分割值0.618

查找思路

原理来自于斐波那契数列中后项等于前两项的和

所以只要当数列长度等于斐波那契数列中的某一项,就可以按照斐波那契数列的比例无限分割,直到1为止

mid = low + F(k-1)-1

F代表斐波那契数列

将分割点放在黄金分割点附近

当数据结构长度不足斐波那契数列中某个元素的值时,需要进行补长

代码如下
// 辅助函数:生成斐波那契数列
private static int[] generateFibonacci(int n) {int[] fibonacci = new int[n];fibonacci[0] = 0;fibonacci[1] = 1;for (int i = 2; i < n; i++) {fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];}return fibonacci;
}// 斐波那契查找算法
public static int fibonacciSearch(int[] arr, int key) {int n = arr.length;// 生成斐波那契数列,找到最接近且大于等于 n 的值int[] fibonacci = generateFibonacci(n);int k = 0;while (fibonacci[k] < n) {k++;}// 将数组扩展到斐波那契数列的长度int[] temp = new int[fibonacci[k]];System.arraycopy(arr, 0, temp, 0, n);int low = 0;int high = n - 1;// 主要查找过程while (low <= high) {int mid = low + fibonacci[k - 1] - 1;if (key < temp[mid]) {high = mid - 1;k -= 1;} else if (key > temp[mid]) {low = mid + 1;k -= 2;} else {// 找到了目标元素,需要判断返回的是原数组中的索引还是扩展数组中的索引return Math.min(mid, high);}}// 未找到目标元素return -1;
}public static void main(String[] args) {int[] arr = {1, 3, 5, 7, 9, 11, 13, 15};int key = 7;int result = fibonacciSearch(arr, key);if (result != -1) {System.out.println("元素 " + key + " 在数组中的索引为:" + result);} else {System.out.println("元素 " + key + " 不在数组中");}
}

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

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

相关文章

前端开发学习笔记 1 (基础概念、HTML5基础、前端开发工具VSCode基本介绍)

文章目录 基础概念篇网页相关的基础概念浏览器和浏览器内核Web标准 HTML5基础HTML的基本语法规范HTML文件基本结构标签文档类型声明标签、文件语言和字符集类型标题标签、段落标签和换行标签文本格式化标签两种容器标签图像标签超链接相关HTML中的注释和特殊字符表格标签列表标…

manacher算法

回文串的性质 回文串类似于ABA&#xff0c;ABCBA,AABBAA等的对于i具有s[i]s[n!-i]的字符串。 回文半径&#xff1a;对于一个回文中心i&#xff0c;如果它的半径为r&#xff0c;如果它为奇数长度的回文串的中心&#xff0c;则说明[ir1,ir-1]为一个回文串。如果i是偶数长度的回…

算法练习----力扣每日一题------4

原题链接 2810. 故障键盘 - 力扣&#xff08;LeetCode&#xff09; 解析&#xff1a; 新建字符串ret,遍历原始字符串遇到i翻转字符串&#xff0c;否则尾插 class Solution { public:string finalString(string s) {string ret;for(auto e : s){if(e i)reverse(ret.begin(),re…

33.Python从入门到精通—Python3 正则表达式 re.match函数 re.search方法 re.match与re.search的区别

33.从入门到精通&#xff1a;Python3 正则表达式 re.match函数 re.search方法 re.match与re.search的区别 Python3 正则表达式re.match函数re.search方法re.match与re.search的区别 Python3 正则表达式 在 Python3 中&#xff0c;可以使用 re 模块来进行正则表达式的匹配和处理…

xtrabackup2.4

xtrabackup2.4只能备份5.*版本 [rootk8s-131 src]# mysql -V mysql Ver 14.14 Distrib 5.7.35, for linux-glibc2.12 (x86_64) using EditLine wrapper [rootk8s-131 src]# ll total 658516 -rw-r--r--. 1 7161 31415 666328842 Jun 7 2021 mysql-5.7.35-linux-glibc2.12-x…

最新版弹幕播放器源码,带后台

最新版弹幕播放器源码&#xff0c;带后台 测试正常分享&#xff0c;祝你使用愉快 弹幕后台、前置广告、暂停广告&#xff0c;记忆回放&#xff0c;自动下一集 支持&#xff1a;.m3u8、.mp4、.flv、等常见视频格式&#xff0c;兼容&#xff1a;电脑、手机端 源码截图&#xf…

【新手适用】手把手教你从零开始实现一个基于Pytorch的卷积神经网络CNN三: 如何验证和测试模型

【新手适用】手把手教你从零开始实现一个基于Pytorch的卷积神经网络CNN二&#xff1a; 如何训练模型&#xff0c;内附详细损失、准确率、均值计算-CSDN博客 从零开始实现一个基于Pytorch的卷积神经网络 - 知乎 (zhihu.com) 1 初始化、导入模型和数据集 新建一个test.py文件&a…

JS中字符串常用方法(持续更新中)

1.charAt()方法 charAt() 方法可返回字符串中指定位置的字符。 let str "Hello"; let s str.charAt(1); console.log(s);//e 语法&#xff1a;string.charAt(index) index 必需值。表示字符串中某个位置的数字&#xff0c;即字符在字符串中的位置。 2.concat()…

基于springboot+vue+Mysql的火车订票管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

uniapp 开发之原生Android插件

开发须知 在您阅读此文档时&#xff0c;我们假定您已经具备了相应Android应用开发经验&#xff0c;使用Android Studio开发过Android原生。也应该对HTML,JavaScript,CSS等有一定的了解, 并且熟悉在JavaScript和JAVA环境下的JSON格式数据操作等。 为了插件开发者更方便快捷的开…

pyside6/pyqt5/pyside2/pyqt6绘制图形

虽然可以在 PySide6 中嵌入 matplotlib 图&#xff0c;但这种体验并不完全是原生的。对于简单且高度交互的绘图&#xff0c;您可能需要考虑改用 PyQtGraph。PyQtGraph 建立在 PySide6 原生 QGraphicsScene 之上&#xff0c;提供更好的绘图性能&#xff0c;特别是对于实时数据&a…

试过了,ChatGPT确实不用注册就可以使用了!

看到官网说不用登录也可以直接使用ChatGPT 我们来试一下 直接打开官网 默认是直接进入了chatgpt3.5的聊天界面 之前是默认进的登录页面 聊一下试试 直接回复了&#xff0c;目前属于未登录状态&#xff0c;挺好&#xff01; 来试下ChatGPT4 跳转到了登录页面 目前来看gpt4还…

JavaScript和SQL Server库的区别总结

目录 背景: JavaScript概述: SQL Server库概述 JavaScript与SQL Server库的主要区别: 总结: 背景: 在Web开发的广阔领域中&#xff0c;JavaScript和SQL Server库各自扮演着不可或缺的角色。虽然它们都是用于构建强大且功能丰富和Web应用程序的工具&#xff0c;但它们在功…

HTML常用文本标签以及注释文本

目录 前言: 1.标题标签&#xff1a; 前言&#xff1a; 实践&#xff1a; 总结&#xff1a; 2.段落标签&#xff1a; 前言&#xff1a; 段落中的空格&#xff1a; 总结: 3.文本格式化标签&#xff1a; 前言: 和标签的区别: 和标记之间的区别: 总结&#xff1a; 4.如…

CCIE过期了要续吗?HCIE难考还是CCIE难考?

瞬息万变的互联网行业里&#xff0c;很多相关的证书都是会过期的&#xff0c;毕竟技术的更新迭代很快&#xff0c;如果不持续学习&#xff0c;势必会被行业所淘汰。 而且这些证书要一直保证自己的含金量&#xff0c;也就一定要随着发展不断革新。 01 CCIE多久过期&#xff1f;…

go入门到精通

初识Go语言 Go语言介绍 Go语言是什么 2009年11月10日&#xff0c;Go语言正式成为开源编程语言家庭的一员。 Go语言&#xff08;或称Golang&#xff09;是云计算时代的C语言。Go语言的诞生是为了让程序员有更高的生产效率&#xff0c;Go语言专门针对多处理器系统应用程序的编…

Spring面试常见问题

目录 1、为什么要用Spring框架&#xff1f;2、有了spring为什么又出现了 springboot&#xff1f;3、springboot出现后为什么又出现了spring cloud&#xff1f;4、SpringBoot自动配置&#xff08;重点&#xff09;5、SpringBoot启动流程&#xff08;重点&#xff09;6、简单谈一…

在Linux中创建新用户的三种方法,总有一种适合你

将用户添加到Linux计算机是一项基本的管理任务,有几种方法可以实现这一点。每种创建用户的方法都有优点和缺点,我们将向你介绍三种不同的用户创建方法。 Linux计算机为什么需要用户 一台没有用户的个人计算机用处并不大。Linux支持多个用户。无论他们是同时登录并共享计算机…

Java基础知识总结(34)

获取成员方法 Method getMethod(String name,Class<?>...parameterTypes)&#xff1a;返回此Class对象对应类的指定public方法。 Method[]getMethods()&#xff1a;返回此Class对象所表示的类的所有public方法。public class Person { public void publicPersonA(){};…

PostgreSQL PGCA/PGCE/PGCM包通过率

PostgreSQL认证课程一共分为三个等级&#xff08;PGCA-PGCE-PGCM&#xff09;&#xff0c;特别注意&#xff1a;参加认证须有同级别合格培训记录&#xff0c;且不可跳级报考 PGCA-PGCE-PGCM都是线上考试&#xff0c;每两个月一次全国统考&#xff0c;详细考试时间可以参考下方表…