算法中的七大查找方法白露~

贵有恒何必三更眠五更起最无益只怕一日曝十日寒

算法中有多种查找方法,常见的有:

以上是我对算法中常见的查找方法的简单介绍,如果你想了解更多细节,请参考以下链接:

查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。本文将介绍算法中常见的七种查找方法,分别是顺序查找、二分查找、插值查找、斐波那契查找、树表查找、分块查找和哈希查找,并给出它们的Java实现示例。

顺序查找是最简单的一种查找方法,也称为线性查找。它的基本思想是从一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。顺序查找适合于存储结构为顺序存储或链接存储的线性表。

Java实现示例:

//顺序查找publicstaticintsequentialSearch(int[]arr,intvalue){for(inti=0;iarr[mid],说明要查找的数在mid的右边,递归向右查找;若findValright时,表示数组中不存在要查找的数。

//二分查找(非递归)publicstaticintbinarySearch(int[]arr,intvalue){intleft=0;//左指针intright=arr.length-1;//右指针while(left<=right){//循环条件intmid=(left+right)/2;//中间下标if(arr[mid]==value){returnmid;//返回下标}elseif(arr[mid]>value){right=mid-1;//向左缩小范围}else{left=mid+1;//向右缩小范围}}return-1;//未找到}//二分查找(递归)publicstaticintbinarySearch(int[]arr,intvalue,intleft,intright){if(left>right){return-1;//递归结束条件}intmid=(left+right)/2;//中间下标if(arr[mid]==value){returnmid;//返回下标}elseif(arr[mid]>value){returnbinarySearch(arr,value,left,mid-1);//递归向左查找}else{returnbinarySearch(arr,value,mid+1,right);//递归向右查找}}复制3.插值查找插值查找是在二分查找的基础上进行改进的一种查找算法,它的基本思想是根据要查找的数和数组中最大最小值的关系,自适应地选择查找点的位置,从而减少比较次数。插值查找的查找点计算公式为:

mid=left+(right-left)*(value-arr[left])/(arr[right]-arr[left])

可以看出,当value接近arr[left]时,mid靠近left;当value接近arr[right]时,mid靠近right。这样就可以根据value在数组中的大致位置,快速定位到它所在的区间。然后再根据value和arr[mid]的大小关系,递归或循环地进行查找。

斐波那契查找的基本思想是先将数组扩展到长度为某个斐波那契数的长度,然后确定中间的下标mid=left+F[k-1]-1,其中k为满足n<=F[k]-1的最小值,n为数组原始长度。然后让需要查找的数findVal和arr[mid]比较,若findVal>arr[mid],说明要查找的数在mid的右边,递归向右查找,并将k减一;若findValright时,表示数组中不存在要查找的数。

树表查找的常见方法有:二叉排序树查找、平衡二叉树查找、红黑树查找、B树和B+树查找等。这里以二叉排序树查找为例进行介绍。

二叉排序树(BinarySortTree)又称为二叉查找树(BinarySearchTree),它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。

二叉排序树查找的基本思想是:首先将给定值k与二叉排序树的根结点的关键字进行比较,若相等则表示查找成功;若k小于该关键字,则在左子树中继续查找;若k大于该关键字,则在右子树中继续查找。重复这一过程,直到找到一个关键字等于k的结点,或者二叉排序树为空,表示查找失败。

--待补充

分块查找又称为索引顺序查找,是一种结合了顺序查找和二分查找的方法。它的基本思想是将一个无序的数组分成若干个大小相等的子块,每个子块内部可以无序,但子块之间必须有序(即第一个子块中任意元素的值都要小于第二个子块中任意元素的值,以此类推)。然后建立一个索引表,存放每个子块中最大(或最小)元素的值和所在位置。当进行查找时,先用二分查找或顺序查找在索引表中确定待查元素属于哪个子块,然后再用顺序查找在相应的子块中进行查找。

THE END
1.二分查找(折半查找)二分查找 https://leetcode.cn/problems/binary-search/ 思路 分别定义两个变量left和right为数组的第一个下标和最后一个下标,用mid=(left+right)/2的下标对应的元素与目标元素做比较,如果大了,left=mid+1;小了,right=mid-1,直到left>right结束,找到了返回下标,找不到返回-1. https://blog.csdn.net/2401_88839156/article/details/144412733
2.数据库的全文搜索技术与实现天翼云开发者社区全文搜索技术的核心在于索引构建和查询处理两个环节。索引构建是指对文本数据进行分词、去停用词、词干提取等预处理操作,然后生成倒排索引,以便快速定位到包含指定关键词的记录。查询处理则是指对用户输入的查询语句进行解析、分词和扩展等处理,然后在索引中查找匹配的记录,并根据相关性算法对结果进行排序和展示。 https://www.ctyun.cn/developer/article/620945392734277
3.算法入门——顺序查找二分查找该公众号发布Python、数据库、Linux、Flask、自动化测试、Git、算法等相关文章! 在上篇文章中,我们学习了算法入门——大O表示法,时间、空间复杂度,这篇文章我们学习算法入门——顺序查找、二分查找。 顺序查找 顺序查找也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到元素或搜索到列表最后一个元素为止。 https://zhuanlan.zhihu.com/p/555220178
4.Java的查找算法有哪些?看这篇就够在前面的两篇文章中,给大家介绍了常见的排序算法,除此之外,其实还有查找算法也需要我们掌握。接下来就来给大家讲讲都有哪些查找算法,以及经典的二分查找法该如何实现。全文大约【3000】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图视频,让你更好地理解和运用文中的技术https://baijiahao.baidu.com/s?id=1768134733893303643&wfr=spider&for=pc
5.关于查找有哪些常见的算法?查找算法有两种:一种只作查找操作,我们称之为静态查找。一种在查找过程种同时插入或删除数据元素,我们称之为动态查找。 静态查找 它的功能如下: 查询某个“特定的”数据元素是否在查找表中; 检索某个“特定的”数据元素和各种属性。 常见的查找方法有:顺序查找、折半查找、插值查找、斐波那契查找等,容我细细讲来https://www.jianshu.com/p/6c1afbeb9b96
6.查找算法51CTO博客(2)二分查找(折半查找): 据说,只有10%的程序员能完全正确地实现二分查找算法! 优点是,比较次数少,查找速度快;缺点是,要求待查表为有序表,导致插入和删除困难。 适用于,不经常变动,但经常查找的有序表。算法复杂度为 log2(n) template<typenameTYPE>intBinarySearch(TYPE arr[],intnum,TYPE key)//假设已为https://blog.51cto.com/u_15127606/3573135
7.Python语言实现六大查找算法python顺序查找的优点就是数据在查找前,不需要对其进行任何处理(包括排序)。缺点是查找速度慢,如果数据列的第一个数据就是想要查找的数据,则该算法查找速度为最快,只需查找一次即可;如果查找的数据是数据列的最后一个(第几个),则该算法查找速度为最慢,需要查找 n 次,甚至还会出现未找到数据的情况。 例如,有这样一组https://www.jb51.net/article/216334.htm
8.高中信息技术课程标准(2)通过实例,掌握使用数据查找算法设计程序解决问题的方法。 例 使用顺序查找算法和对分查找算法查找校运动会上某个班级或者某个运动员的比赛成绩。 (3)通过实例,掌握使用排序算法设计程序解决问题的方法。 例设计一个程序,按照选择交换法,把学校运动会比赛成绩(无序)按降序排序后存储。 https://www.fqkhzx.cn/index/article/view/id/94.html
9.并查集,合并以及优化腾讯云开发者社区在Find_Set(x)中,是查找路径上的每个节点都直接指向根节点,这样下次再找根节点的时间复杂度会变成o(1); 1、Find_Set(x)时 路径压缩 寻找祖先时我们一般采用递归查找,但是当元素很多亦或是整棵树变为一条链时,每次Find_Set(x)都是O(n)的复杂度,有没有办法减小这个复杂度呢? 答案是肯定的,这就是路径压https://cloud.tencent.com/developer/article/2477305
10.实验指导数据结构教学运行与管理3.设计一个折半查找的循环结构的算法,并与递归算法进行对比分析。 提示:将要查找的元素key与查找区间正中元素相比,若key小,则查找区间缩小至前半部份查找,若key大,则查找区间缩小至后半部份查找;再取其中值比较,每次缩小1/2的范围,直到查找成功或失败为止。如递归实现,考虑函数的参数应有哪些。在用循环结构实https://www.gxtcmu.edu.cn/ggxy/jysjs1/xxglyxxxtjysyxxxgcjyshs/jxyhygl2/sjjg/content_29239
11.基于A*的双向预处理改进搜索算法1.4 跳点算法 近年来研究人员推出了一种高效寻路算法Jump Point Search, 也就是所谓的跳点算法. 其本质针对有序序列查找跳点与二分法类似, 主要思想就是大范围跳跃式搜索栅格网络中对称的路径, 只把其中的跳跃点当作待搜索的栅格节点. 其明显优势在于大幅度减少openlist中的待选节点得益于在固定间隔的跳跃搜索过程https://c-s-a.org.cn/html/2019/5/6923.html
12.Java集合面试问题40个「附答案」每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。 随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。 https://www.oh100.com/kaoshi/java/370200.html
13.安徽省2010年考试录用公务员考试大纲六、二叉树的基本性质、存储结构、遍历算法和几种特殊类型的二叉树 七、树与森林的定义、性质,树与森林的存储结构与遍历算法 八、图的定义和术语,图的存储结构及相关算法 九、排序的基本概念,常见的排序算法 十、查找的基本概念,常见的查找算法 第四章 软件工程基础 https://hrss.ah.gov.cn/zxzx/gsgg/8248961.html
14.科学网—[转载]Delaunay三角剖分及算法基本知识Delaunay剖分是一种三角剖分的标准,实现它有多种算法。 2.1.Lawson算法 逐点插入的Lawson算法是Lawson在1977年提出的,该算法思路简单,易于编程实现。基本原理为:首先建立一个大的三角形或多边形,把 所有数据点包围起来,向其中插入一点,该点与包含它的三角形三个顶点相连,形成三个新的三角形,然后逐个对它们进行空外https://blog.sciencenet.cn/blog-116465-216935.html