第七章 查找
7.1 查找的基本概念
问题:在哪查找?——查找表
查找表是由同一类型的数据元素(或记录)构成的集合。由于"集合"中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构。
问题:什么查找?
——根据给定的值,在查找表中确定一个其关键字等于给定值的数据元素。
关键字 用来表示一个数据元素的某个数据项的值
主关键字 可唯一标识一个记录的关键字是主关键字
次关键字 用于识别若干记录的关键字是次关键字
问题:查找是否成功?
若查找表中存在这样一个记录,则查找成功,查找结果给出整个记录的信息或标识查找表中的位置
否则,查找不成功,查找结果给出空指针或空记录
问题:查找的目的?
对查找表进行操作
- 查询某个元素是否在查找表中
- 检索某个元素的属性
- 插入一个元素
- 删除一个元素
查找表分成两类:
- 静态查找表
- 仅作查询(检索)操作
- 动态查找表
- 作插入和删除操作
评价查找算法指标:
关键字平均比较次数,也称平均查找长度:ASL
7.2 线性表的查找
7.2.1 顺序查找(线性查找)
应用范围:顺序表或线性链表的静态查找表、表示元素之间无序
数据元素类型定义
typefdef struct{
KeyType key; //关键字域
..... //其他域
}ElemType
typefdef struct{
ElemType *R;//表基址
int length;//表长
}SSTable;
SSTable ST //定义顺序表ST
在顺序表ST中查找key的数据元素
例如:从头开始—查找13:找到,返回5。 从末尾开始—查找60:未找到,返回0
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存入表头(“哨兵”、“监视哨”),从后往前逐个比较,课免去查找过程中每一步都要检测是否查找完毕,加快速度
设置监视哨的顺序查找