顺序查找
- 顺序查找(Sequential Search)的查找过程为:从表的一端开始,依次将记录的关键字和给定值进行比较,若某个记录的关键字和给定值相等,则查找成功;反之,若扫描整个表后,仍未找到关键字和给定值相等的记录,则查找失败。
- 顺序查找方法既适用于线性表的顺序存储结构,又适用于线性表的链式存储结构。下面只介绍以顺序表作为存储结构时实现的顺序查找算法。
- 数据元素类型定义如下:
typedef struct
{
KeyType key; //关键字域
InfoType otherinfo; //其他域
} ElemType;
顺序表的定义同第2章:
typedef struct
{
ElemType *R; //存储空间基地址
int length; //当前长度
} SSTable;
在此定义下,顺序查找算法便与第 2 章的算法 2.2 一样。在此假设元素从 ST.R[1] 开始顺序向后存放,ST.R[0]闲置不用,查找时从表的最后开始比较,如算法 7.1 所示。
- 算法 7.1 顺序查找
【算法描述】
// 算法 7.1
int Search_Seq(SSTable ST, KeyType key)
{ //在顺序表 ST中顺序查找其关键字等千key的数据元素。若找到 , 则函数值为该元素在表中的位置,否则为0
for (i = ST.length; i >= l; --i)
if (ST.R[i].key == key) //从后往前找
return i;
return 0;
}
算法 7.1 在查找过程中每步都要检测整个表是否查找完毕,即每步都要有循环变量是否满足条件 i >= 1 的检测。改进这个程序,可以免去这个检测过程。改进方法是查找之前先对 ST.R[O] 的关键字赋值 key,在此,ST.R[O]起到了监视哨的作用,如算法 7.2 所示。
- 算法 7.2 设置监视哨的顺序查找
【算法描述】
// 算法 7.2
int Search_Seq(SSTable ST, KeyType key)
{ //在顺序表 ST 中顺序查找其关键字等于 key 的数据元素。若找到,则函数值为该元素在表中的位置,否则为 0
ST.R[O].key = key; //"哨兵"
for (i = ST.length; ST.R[i].key != key; --i)
; //从后往前找
return i;
}
【算法分析】
- 因此,算法 7.2 仅是一个程序设计技巧上的改进 ,即通过设置监视哨, 免去查找过程中每一步都要检测整个表是否查找完毕。然而实践证明,这个改进能使顺序查找在ST.length >= 1000 时,进行一次查找所需的平均时间几乎减少一 半。当然,监视哨也可设在高下处。
- 算法 7.2 和算法 7.1 的时间复杂度一样, 在第 2 章已经做过分析,即
- 算法 7.2 的时间复杂度为 O(n)。
- 顺序查找的优点是:算法简单,对表结构无任何要求,既适用于 顺序结构,也适用千链式结构,无论记录是否按关键字有序均可应用。其缺点是:平均查找长度较大,查找效率较低,所以当 n 很大时,不宜采用顺序查找。
加油各位!本人自学笔记,如有侵权及时删除(希望能帮到大家,谢谢)