首页 > 其他分享 >【查找】线性表的查找

【查找】线性表的查找

时间:2024-12-09 15:03:53浏览次数:6  
标签:折半 顺序 线性表 分块 关键字 查找 key

        目录

1. 顺序查找

利用顺序表的实现顺序查找

设置监视哨的顺序查找 

利用链表实现顺序查找

顺序查找的优缺点

2. 折半查找(二分查找)

折半查找的优缺点

3. 分块查找

分块查找的优缺点


1. 顺序查找

时间复杂度:O(n)

存储结构:

顺序查找可适用于线性表的顺序存储和链式存储。

 顺序查找的过程:

从表的一端开始,依次将记录的关键字和给定值进行比较,若某个记录的关键字和给定值相等,则查找成功;反之,若扫描完整个表后,仍未找到关键字和给定值相等的记录,则查找失败。

数据元素类型定义如下:

typedef struct {
	KeyType key;   //关键字
	InfoType otherinfo;      //其他域 
}ElemType;

  • 利用顺序表的实现顺序查找

数据元素类型定义如下:

typedef struct {
	KeyType key;   //关键字
	InfoType otherinfo;      //其他域 
}ElemType;

查找时从后往前开始比较

typedef struct{
	ElemType *R;   //顺序存储结构的基地址
	int length;        //表长 
}SSTable;
int search_Seq(SSTable ST,KeyType key){
	
	for(int i = ST.length; i >= 1; i--){
		if(ST.R[i].key == key) return i;
	}
	return 0;
} 
  • 设置监视哨的顺序查找 

改进方法:通过设置监视哨,免去查找过程中每一步都要检测整个表是否查找完毕。

int Search_Seqs(SSTable ST,KeyType key){
	ST.R[0] = key;  
	for(int i = ST.legnth; ST.R[i].key != key; --i)  //从后往前找
	return i;  //如果没找到返回值为 0;  
}

  • 利用链表实现顺序查找

typedef struct LNode{
	ElemType data;   //数据域
	struct Node * next;   //指针域 
}LNode, * LinkList;
LNode * Search_Lin(LinkList L,KeyType key){
	LNode * p = L -> next;  //p 指向首元结点 
	while(p != NULL){
		if(p -> data == key){
			return p;
		}
		p = p -> next;   //指向下一个结点 
	}
	return NULL;
}

顺序查找的优缺点

优点:算法简单,对表结构无任何要求,顺序存储或链式存储皆可。同时对表中记录的有序性也没有要求,无论记录是否按关键字有序,均可应用。需注意的是,对线性的链表只能进行顺序查找。

缺点:平均查找长度较大,查找效率较低,当n较大时,不适合采用顺序查找。


2. 折半查找(二分查找)

时间复杂度:O(log2n)

对于线性表必须采用顺序存储结构,而且表中元素按照关键字有序排列。

折半查找过程:

从表的中间记录开始,如果给定值和中间记录的关键字相等,则查找成功;

如果给定值大于或这小于中间记录的关键字,则在表中大于或小于中间记录的那一半中查找,这样重复操作,直到查找成功,或者在某一步中查找区间为空,则代表查找失败。

查找区间为空的条件:low > hight

【算法描述】

int Search_Bin(SSTable ST,keyType key) {
	int low = 1, high = ST.length;
	int mid = (low + high) >> 1;
	while(low <= high) {
		if(ST.R[mid].key == key) return i;
		else if(key < ST.R[mid].key) high = mid - 1;
		else low = mid + 1;
	}
	return 0;   //查找失败 
}

折半查找的优缺点

优点:折半查找效率高于顺序查找,比较次数少,查找效率高。

缺点:只能用于顺序存储的有序表。(折半查找前需要对元素进行排序,如果元素量过大,排序也会消耗大量时力;若插入或删除表中元素,平均比较和移动表中一半的元素也会消耗大量时力。所以折半排序不适用于数据元素经常变动的线性表)


3. 分块查找

 分块查找又称索引顺序查找,它吸取了顺序查找和折半查找的优点,既有动态结构,又适于快速查找。

分块查找过程:

分块查找与前两种方法相比,需额外建立一个“索引表”。

将查找表分为若干子表(或称块),对每个子表建立一个索引项。

其中包含两项内容:关键字项(其值为该子表内的最大)和指针项(指示该子表的第一个记录在表中的位置)。

每个索引项构成一个索引表,索引表按关键字有序排列

块内的元素可以无序,但块间的元素是有序的,又称分块有序。即第一块中最大关键字小于第二块中的所有记录的关键字,第二块中最大关键字小于第三块中的所有记录的关键字,以此类推。

时间复杂度:

 分块查找的时间复杂度主要取决于块的数量以及每个块中元素的数量

在最坏的情况下,即目标元素位于最后一个块中,并且最后一个块中的元素数量最多,分块查找需要遍历所有块,并且对于最后一个块,需要遍历其中的所有元素。

因此,时间复杂度为 O(m + n),其中 m 是块的数量,n 是所有块中元素的总数。


分块查找的优缺点

优点:在表中插入和删除数据元素,只需找到对应的块,就可在该块中进行插入和删除运算。由于块中是无序的,故插入和删除无需进行大量移动。

缺点:要增加一个索引表的存储空间并对初始索引表进行排序运算。

标签:折半,顺序,线性表,分块,关键字,查找,key
From: https://blog.csdn.net/2301_81182847/article/details/144346183

相关文章

  • 二分查找(带图详解)
    优选算法系列文章目录优选算法系列前言一、二分查找的思想二、算法使用小总结三、代码实现四、二分查找拓展4.1、查找第一次出现的target小总结4.2、target最后出现的位置小总结五、代码总结前言在这篇博客中,我会给大家分享二分查找及其扩展。这是链接->Leet......
  • 邻值查找
    给定一个长度为 nn 的序列 AA,AA 中的数各不相同。对于 AA 中的每一个数 AiAi,求:min1≤j<i|Ai−Aj|min1≤j<i|Ai−Aj|以及令上式取到最小值的 jj(记为 PiPi)。若最小值点不唯一,则选择使 AjAj 较小的那个。输入格式第一行输入整数 nn,代表序列长度。第二行输入 nn ......
  • LINQ 和集合:如何使用LINQ查找两个列表之间的差集(C#)
    此示例演示如何使用LINQ对两个字符串列表进行比较,并输出那些位于第一个集合(而不是第二个集合)中的行。名称的第一个集合存储在文件 names1.txt 中:Bankov,PeterHolm,MichaelGarcia,HugoPotra,CristinaNoriega,FabricioAw,KamFooBeebe,AnnToyoshima,TimGuy......
  • 邻值查找
     给定一个长度为 nn 的序列 AA,AA 中的数各不相同。对于 AA 中的每一个数 AiAi,求:min1≤j<i|Ai−Aj|min1≤j<i|Ai−Aj|以及令上式取到最小值的 jj(记为 PiPi)。若最小值点不唯一,则选择使 AjAj 较小的那个。输入格式第一行输入整数 nn,代表序列长度。第二行输入 nn......
  • JavaScript查找数组中某个元素的位置
    indexOf:在JavaScript中,你可以使用indexOf()方法来查找数组中元素的位置。如果元素不存在于数组中,indexOf()会返回-1。letindex=array.indexOf('x')if(index!=-1){//...}findIndex:如果你需要查找的是复杂对象数组,你可能需要自定义一个查找函数,使用findIndex()letobj......
  • 二分查找及java代码实现
    二分查找(BinarySearch)是一种在有序数组中查找特定元素的搜索算法。它通过比较数组中间元素与目标值来确定目标值所在的范围,然后在这个范围内继续进行二分查找,直到找到目标值或确定目标值不存在。二分查找的基本步骤:1. 初始化:设置两个指针,一个指向数组的开始(low),另一个指向......
  • 【hot100】二分查找
    文章目录二分写法获取等于target的最左侧的索引获取等于target的最右侧的索引35.搜索插入位置二分实现74.搜索二维矩阵O(logmn)解法O(n+logm)解法34.在排序数组中查找元素的第一个和最后一个位置二分查找33.搜索旋转排序数组两次二分一次二分153.寻找旋转排序......
  • 根据元素ID遍历树形结构,查找到所有父元素ID [代码]
    functionfindParentIds(elementId,treeData){constparentIds=[];functiontraverse(node){if(node.id===elementId){returntrue;}if(node.children){for(constchildofnode.children){if(traverse(child))......
  • 牛客---HJ48 从单向链表中删除指定值的节点(用ArrayList模拟链表,因为方便查找操作)
    示例代码importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;//注意类名必须为Main,不要有任何packagexxx信息publicclassMain{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);......
  • 数据结构实训——查找
    声明: 以下是我们学校在学习数据结构时进行的实训,如涉及侵权马上删除文章声明:本文主要用作技术分享,所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险,并遵循相关法律法规。一、实训类型  验证性实训二、实训目的与任务1.掌......