贵有恒何必三更眠五更起最无益只怕一日曝十日寒
算法中有多种查找方法,常见的有:
以上是我对算法中常见的查找方法的简单介绍,如果你想了解更多细节,请参考以下链接:
查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。本文将介绍算法中常见的七种查找方法,分别是顺序查找、二分查找、插值查找、斐波那契查找、树表查找、分块查找和哈希查找,并给出它们的Java实现示例。
顺序查找是最简单的一种查找方法,也称为线性查找。它的基本思想是从一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。顺序查找适合于存储结构为顺序存储或链接存储的线性表。
Java实现示例:
//顺序查找publicstaticintsequentialSearch(int[]arr,intvalue){for(inti=0;i
//二分查找(非递归)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减一;若findVal
树表查找的常见方法有:二叉排序树查找、平衡二叉树查找、红黑树查找、B树和B+树查找等。这里以二叉排序树查找为例进行介绍。
二叉排序树(BinarySortTree)又称为二叉查找树(BinarySearchTree),它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。
二叉排序树查找的基本思想是:首先将给定值k与二叉排序树的根结点的关键字进行比较,若相等则表示查找成功;若k小于该关键字,则在左子树中继续查找;若k大于该关键字,则在右子树中继续查找。重复这一过程,直到找到一个关键字等于k的结点,或者二叉排序树为空,表示查找失败。
--待补充
分块查找又称为索引顺序查找,是一种结合了顺序查找和二分查找的方法。它的基本思想是将一个无序的数组分成若干个大小相等的子块,每个子块内部可以无序,但子块之间必须有序(即第一个子块中任意元素的值都要小于第二个子块中任意元素的值,以此类推)。然后建立一个索引表,存放每个子块中最大(或最小)元素的值和所在位置。当进行查找时,先用二分查找或顺序查找在索引表中确定待查元素属于哪个子块,然后再用顺序查找在相应的子块中进行查找。