算法之线性表的查找
一、查找的基本概念
1.概念:
1.查找表:
由同一类型的数据元素(或记录)构成的集合。由于‘集合’中的数据元素之间存在着松散的关系,异常查找表是一种应用灵便的结构。没有严格的前驱后继关系。(类似于多个数据项组成了不同的数据元素,由数据元素组成的数据对象,每一个数据元素之间没有确定的数据关系)
2.查找:
根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)
查找成功:成功操作到该记录或者表中的位置,
查找不成功:为空记录或者空指针。
通常感觉是否修改数据分为:(查询)/(插入和删除)
3.关键字:
用来标识一个数据元素(或记录)的某一个数据项的值
主关键字:可唯一地标识一个记录的关键字是主关键字
次关键字:反之,用以识别若干记录的关键字是此关键字
4. 算法评价指标:
关键字的平均比较次数,也称平均查找长度ASL
2.线性表的查找:
1.顺序查找
应用范围:顺序表或线性链表表示的静态查找表,表内元素之间无序
数据元素类型定义:
typedef struct { // 顺序表在元素的结构定义
KetType key;// 关键字
···· // 其他域
}ElemType
typedef struct { // 顺序表结构类型定义
ElemType *R // 表基址
int lenght; // 表长
}SSTable ; // 定义别名
SStable ST // 创建表类型名为ST
基础查找算法:
int Search_Seq( SSTable ST,KeyType key) {
for(i = ST.length; i>= 1; --i) {
if (ST.R[i].key == key) return i
}
return 0
}
改进:把待查找关键字key存入表头(‘哨兵’、‘监视哨’)从后往前比较,可以免去查找过程中每一步都要检测是否查找完毕(减少了一次if比较),加快速度。
int Search_Seq(SSTable ST,KeyType key) {
ST.R[0].key = key
for( i = ST.length; ST.R[i].key != key; --i);
return i
}
时间效率:
与key的位置有关:查找dii个元素需要比较n-i+1次,查找失败需要比较n+1次
O(n):查找成功时的平均查找长度,处处几率相等。ASL = (n+1)/2.时间效率过长
时间复杂度:
一个辅助空间—O(1)
2.二分法查找
每次可以缩短一半区间,但是只能查找有序表。
//非递归算法
int Search_Bin(SSTable ST,KeyType key) {
low = 1;hing = ST.length; // 置区间初值
while(low <= high) {
mid = (low+high)/ 2
if(ST.R[mid].key == key) return mid // 找到待查元素
else if (key <ST.R[mid].key) // 缩小查找区间
high = mid -1 // 继续在前半区间进行查找
else low = mid + 1 // 在后边区进行查找
}
return 0 // 顺序表中不存在待查元素
}
// 递归算法
int Search_Bin(SSTable ST,keyType key,int low,int high) {
if(low > high) return 0;
mid =(low+high)/2
if(key == ST.elem[mid].key) return mid;
else if(key <ST.elem[mid].key) Search_Bin(ST,key ,low =mid +1,high )
else Search_Bin(ST,key ,low ,high=mid - 1 )
}
3.分块查找
1.将表分成几块,且表或者有序或者分板有序。若i < j ,则第j块中所有记录的关键字均大于第i块中的最大关键字。
2.建立索引表,记录每一块中的最大值,记录每一块的开始位置。
3.查找过程:先确定待查记录所在快(顺序或者折半查找),再在块内查找(顺序查找)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)