最近在看查找算法,所以就总结一下:
1、顺序查找(sequential search)是一种最简单的查找方法,一般用于数组。他从顺序表的一端开始依次将每个元素值同给定的值进行比较,若找到则返回该元素所在的下标;否则返回特定值,表示查找失败。时间复杂度O(n)。
对顺序查找算法的一个改进,可在表的尾端设置一个“岗哨”,即在查找之前把给定值x赋给数组a[]中下标为n的元素,这样在循环中就不必进行下标是否越界的检查,当比到下标为n的元素位置时,由于a[n]=x必然成立,则退出循环。即
a[n]=x;
for(int i=0;;i++)
if(a[n].equals(x)) break;
2、二分查找(binary search)又称折半查找。作为二分查找对象的数据必须是顺序存储的有序表,通常假设若关键字是字符或者字符串数据,则按照国际双字节编码(Unicode)有序。
二分查找的过程是:首先取整个有序表的中点元素,同x比较,若小于给定值则在坐子表中,否则在有子表中;这样经过依次查找就将缩短一半的查找空间,直到找到x元素或者当前查找元素为空。
算法描述:
public class testSearch {
public static int binarySearch(Object []a,Object x,int n){
//从数组a的前n个元素中二分查找给定值x
int low=0,high=n-1;
while(low<=high){
int mid=(low+high)/2;
if(((Comparable)a[mid]).compareTo(x)>0)
{
high=mid-1;
System.out.print(a[mid]);
}
else if(((Comparable)a[mid]).compareTo(x)<0){
low=mid+1;
System.out.print(a[mid]);
}
else{
System.out.print(a[mid]);
return mid;
}
}
return -1;//未返回mid则表明查找失败,返回-1
}
public static void main(String[] args) {
Object[]a={1,2,3,4,5,6,7,8,9};
testSearch.binarySearch(a, 1, a.length);
}
}
二分查找过程可用一颗二叉树来描述:树中的每个根节点对应当前查找区间的中点元素a[mid],它的左子树和右子树分别对应该区间的坐子表和右子表,通常把此二叉树称为二分查找的判定树。进行二分查找的二叉树是一颗二叉搜索树,而且是一颗理想平衡树。
二分查找的时间复杂度是O(log2 n)。
3、索引查找(index search)又称分级查找。索引查找是在索引表和主表上进行的查找,过程为:首先根据给定的索引值K1,在索引表上查找索引值等于K1的索引项,以确定对应子表在主表中的开始位置和长度,然后再根据给定值K2,在对应的子表中查找等于K2的元素。对索引表或者子表进行查找时,若表是顺序存储的有序表,则既可以进行顺序查找也可以进行二分查找。
4、分块查找(blocking search)属于索引查找。他要求每个主表中每个子表之间递增有序,即前块中的最大关键字必须小于后块中的最小关键字,但是每个块中的元素排列次序可以是任意的。进行分块查找时,应根据所给的关键字首先查找索引表,从中查找刚好大于等于所给关键字的那个索引项,从而找到待查块,然后再查找这个块,从中顺序查找到相应的记录。
5.散列查找
散列(hash)存储的方法是:以数据集合中的每个元素的关键字k为自变量,通过一种函数h(k)计算出函数值,把这个值用作一块连续存储空间中的元素存储位置(下标)。
构造散列函数的目标是使得散列地址尽可能均匀地分布在散列地址的空间上,同时使得计算尽可能简单,以节省计算时间。常用的散列函数有:
直接定址法 h(k)=k+C;
除留余数法 h(k)=k%m,m是散列长度
数字分析法 取关键字中某些取值较分散的数字作为散列地址的方法。
平方取中法 取关键字平方的中间几位作为散列地址的方法。
折叠法 首先将关键字分割成位数相同的几段(最后一段的位数不足应补0),段的位数取决于散列地址的位数,然后将他们的叠加和作(舍去最高位进位)为散列地址的方法。
从散列表中查找关键字为key的过程就是一个按照查找路径进行顺序查找的过程,若找到则返回相应的元素值,否则返回空值表示查找失败。
6.B树查找
B树是一种具有特殊结构的树,他同二叉树和一般树在结点结构上有所不同。B树分为B-树和B+树。
B_树是一种特殊的多叉树,被称为多路查找树。B_树是一中在数据库和文件系统中最常用的动态索引结构。对于树根节点他最少有两颗子树,最多有m棵子树,对于非树根节点,他最少有m/2向上取整棵子树,最多m棵子树,叶子结点中的子树均为空树;每个节点的关键字个数最少为m/2向上取整-1,最多为m-1个;在B_树的结点结构中,每个关键字域的后面还应包含一个元素引用域,用以存储该关键字所对应元素的引用。
B_树的查找一个关键字K的过程:若B_树非空,首先取出树根结点,使给定值K依次同该结点中的每一个关键字进行比较,直到K<=Ki(假定用Ki作为终止标志,保存比所有关键字都大的一个特定值,该值不妨用MaxKey常量表示)为止,此时若K=Ki,则表明查找成功,返回具有该关键字Ki的记录的存储位置,否则其值为K的关键字只能落在该结点的有Pi-1所指的子树上,接着只要在该子树上继续进行查找即可;这样,每取出一个节点比较后就下移一层,直到查找成功,或被查找的子树为空为止。
public int search(Object k){
int i;
BayerTreeNode p=bt;//将树根指针bt赋给p
while(p!=null){
i=1;
while(((Comparable)k).compareTo(p.key[i])>0)
i++;//用k顺序同节点关键字比较
if(((Comparable)k).compareTo(p.key[i])==0)
return p.rec[i];//查找成功返回记录的存储位置
else
p=p.ptr[i-1];//否则继续向下层节点找
}
return -1;
}
分享到:
相关推荐
本文将对几种常用的查找算法进行比较,包括顺序查找、二分查找、二叉树查找和哈希表查找。 顺序查找是一个最简单的查找算法,它的时间复杂度为O(n),其中n是数组的长度。该算法的实现非常简单,只需要遍历数组,并...
C 语言几种常见的查找算法 本篇文章总结了几种常用的查找算法,包括静态查找、顺序查找、索引顺序表查找、折半查找和次优查找树等。这些算法都是在C语言中实现的,旨在帮助读者更好地理解和应用这些查找算法。 一...
本主题将深入探讨几种常见的查找算法,包括二分查找(Binsearch)、二叉搜索树(BSTree)、哈希查找(Hash)以及顺序查找(Seqsearch)。这些算法在不同的场景下有着各自的优点和适用性,理解并掌握它们对于优化程序...
以下将介绍几种常见的查找文件方式。 一、通过文件名查找法 使用 find 命令可以根据文件名查找文件的位置。例如,查找 httpd.conf 文件,可以使用以下命令: find / -name httpd.conf 这个命令将在整个系统中...
以下是对几种常见模式识别方法的详细说明: 1. **K-Nearest Neighbor (K-NN)** K-NN是一种基于实例的学习,用于分类和回归。其核心思想是:未知样本将被分类为其最近的K个已知类别样本中出现最多类别的那一类。在...
Spring Boot 中的几种注入方法 在 Spring Boot 中,注入是一种非常重要的机制,用于将 bean 对象注入到其他 bean 对象中,以便实现松耦合和高内聚的设计目标。下面我们将对 Spring Boot 中的几种注入方法进行详细的...
本章主要探讨了顺序查找、折半查找、二叉排序树以及散列查找等几种常见查找方法。 1. **顺序查找**:适用于顺序存储或链接存储的线性表。这种查找方式从列表的一端开始逐个比较,直到找到目标元素或遍历完整个列表...
在Word中,通配符主要有以下几种: 1. ASCII字符:用`^nnn`表示,其中`nnn`是ASCII码。例如,查找`^32`可以匹配到一个半角空格。 2. ANSI字符:用`^0nnn`表示,`0`前缀表示零,`nnn`是字符代码。查找`^0183`可以...
在这个项目中,我们采用六种不同的查找方法来优化系统的性能和适应性。以下是对这些查找方法的详细介绍: 1. **线性查找**(Linear Search):这是最基础的查找方法,遍历整个数组或集合,逐个比较元素直到找到目标...
本资料包详细介绍了几种常见的查找算法,包括顺序查找、二分查找、分块查找、二叉排序树查找以及哈希查找。 **顺序查找**是最基础的查找方法,适用于任何无序或有序的数据序列。它按照元素的顺序逐个比较,直到找到...
本项目"dotnet-CWindowsForms应用演示了通过2D迷宫的几种常见路径查找算法"就是这样一个示例,它涵盖了多种算法的实际应用。 首先,我们要了解什么是路径查找算法。在2D迷宫问题中,目标是找到起点到终点的最短路径...
本文将详细介绍四种常见的算法——折半插入、二叉搜索树、直接插入以及折半查找,并提供它们的C语言实现。理解并熟练掌握这些算法对于提升编程技能和优化代码效率至关重要。 1. **折半插入**(Binary Insertion ...
本篇文章将详细介绍在Java中连接Oracle数据库的几种常见方法,以及相关的源码示例。 1. JDBC-ODBC桥连接: JDBC-ODBC桥是Java早期连接数据库的一种方式,它依赖于操作系统上的ODBC数据源。首先,你需要在系统中...
本文将详细介绍几种常见的隐藏文件的方法,帮助用户更好地管理和保护自己的文件。 #### 一、通过系统属性隐藏文件 **概述:** 在Windows操作系统中,可以通过更改文件或文件夹的属性来实现隐藏的效果。这是一种...
本文将对比分析四种常见的查找算法:顺序查找、二分查找、二叉排序树查找以及哈希查找,探讨它们的原理、效率及适用场景。 1. **顺序查找**: 顺序查找是最基础的查找算法,它按照数据元素的排列顺序逐个比较,...
本文介绍了基于FPGA的ROM数据定制的几种常见方法及其应用场景。通过使用Quartus II内置的编辑工具、MIF/Hex文件格式编辑以及第三方软件如MATLAB/Simulink、DSPBuilder、C/C++编译器等,设计者可以根据实际需求灵活...
常见的几种排序方式,包括选择排序,冒泡排序,快速排序,希尔排序,堆排序,插入排序。vs2008实现,对话框方式,主要实现字符串的由小到大排序。点击“几种排序方法.vcproj“运行。字符集使用多字节集,不能用...
快速排序法是解决查找数组的前K个最小值问题的一种常见方法。该方法首先对数组进行快速排序,然后选择前K个元素作为最小值。快速排序的时间复杂度为O(n log n),但是当数组已经是有序的时,快速排序的时间复杂度会...
在这个特定的案例中,"一种敏感词查找方法及装置"涉及到的是信息安全和数据过滤领域的技术。该技术可能被应用于网络监控、内容审查、社交媒体管理等多个场景,以确保合规性、保护用户隐私或维护网络安全。 敏感词...