线性表的查找
下面图片来自教材《大话数据结构》
查找就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)
查找表的例子
静态查找表(Static Search Table):只作查找操作的查找表。
主要操作有:
- 查询某个“特定的”数据元素是否在查找表中
- 检索某个“特定的”数据元素和各种属性
动态查找表(Dynamic Search Table):在查找过程中同时插入查找表中不存在的数据元素或从查找表中删除已经存在的某个数据元素
主要操作:
- 查找时插入数据元素
- 查找时删除数据元素
1.顺序表查找算法(静态查找)
查找基于集合(逻辑结构),集合中的记录之间没有本质关系。如同散落的图书,现将图书排列整齐,就如同将集合构成一个线性表
顺序查找方法既适用于线性表的顺序存储结构,又适用于线性表的链式存储结构
以下介绍基于顺序存储结构的顺序查找方法
数据元素类型定义
typedef struct{
KeyType key; //关键字域
InfoType otherinfo; //其他域
}ElemType;
顺序表的定义
typedef struct{
Elemtype *R; //存储空间基地址
int length; //当前线性表的长度
}SSTable;
顺序算法描述
int Search_Seq(SSTable ST, KeyType key){
for(i=ST.length; i>=1; --i) //从线性表的尾部开始搜索查找
if(ST.R[i].key==key) //要搜索的关键词为key
return i;
return 0;
}
为减少每次进行循环变量的判断,改进程序,从而免去此判断
int Search_Seq(SSTable ST, KeyType key){
ST.R[0].key=key; //哨兵,设置R[0]的关键词和要查找的关键词一致,如果查找失败就会使得循环退出并返回0,如果成功则返回具体某个i值
for(i=ST.length; ST.R[i].key!=key; --i);
return i;
}
2.折半查找(静态查找)
表中元素已经按从小到大排列好了
如果目标值小于中间值,则将mid移动至前半部分
如果目标值大于中间值,则将mid移动至后半部分
int Search_Bin(SSTable ST,KeyType key){ //关键字key
low=1;
high=ST.length;
while(low<=high){ //low在high的左侧
mid=(low+high)/2; //折半
if(key==ST.R[mid].key) //查找到了关键字key
return mid; //返回关键词所在数组的下标
else if(key<ST.R[mid].key) //当前关键字小于目标关键字
high=mid-1; //将high移动至mid的前一个
else
low=mid+1; //将low移动至mid的后一个
}
return 0;
}
3.分块查找
稠密索引
将数据集中的每个记录对应一个索引项
分块索引
把数据集的记录分成若干块
块内无序:每块中的关键码大小无序
块间有序:第一块中所有关键码都小于第二块,后面的块类似