前言
本文内容源于对《数据结构(C语言版)》(第2版)、王道讲解、博主一只小山猪的专栏内容的学习所得心得、笔记整理和总结。
可结合以下链接搭配学习:
一文学懂经典算法系列之:顺序查找(附讲解视频)_一头小山猪的博客-CSDN博客_算法学习顺序
(上面的链接的所用算法是 java,本文是用 C++ 以顺序表作为存储结构实现的顺序查找算法)
【考研复习:数据结构】查找(不含代码篇)_住在阳光的心里的博客-CSDN博客
本文已参加活动,其地址:CSDN21天学习挑战赛
一、基本概念
1、顺序查找:适用于线性表的顺序存储结构和链式存储结构。通常分为对一般的无序线性表的顺序查找和对按关键字有序的线性表的顺序查找。(注意:对线性的链表只能进行顺序查找)
2、顺序查找的过程:从表的一端开始,依次将记录的关键字和给定值进行比较,若某个记录的关键字和给定值相等,则查找成功;反之,若扫描整个表后,仍未找到关键字和给定值相等的记录,则查找失败。
3、优点:算法简单,对表结构无任何要求,既适用于顺序结构,也适用于链式结构,无论记录是否按关键字有序均可应用。
4、缺点:平均查找长度较大,查找效率较低,所以当 n 很大时, 不宜采用顺序查找。
5、有序表和无序表的顺序查找:
查找成功的平均查找长度,为
查找不成功的平均查找长度,为
每个元素的查找概率相同 | ||
无序表 | ||
有序表 |
二、数据元素类型定义
typedef struct{
KeyType key; //关键字域
InfoType otherinfo; //其他域
}ElemType;
typedef struct{
ElemType *R; //存储空间基地址,建表时按实际长度分配,0号单元留空
int length; //当前长度
}SSTable;
三、算法描述
//在顺序表ST中顺序查找其关键字等于key的数据元素。
//若找到,则函数值为该元素在表中的位置,否则为0
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;
}
在查找过程中每步都要检测整个表是否查找完毕,即每步都要有循环变量是否满足条件 i >= 1的检测。改进这个程序,可以免去这个检测过程。改进方法是查找之前先对 ST.R[0] 的关键字赋值 key,在此, ST.R[0] 起到了监视哨的作用,如下面的算法所示。
// 改进版(通过设置监视哨,免去查找过程中每一步都要检测整个表是否查找完毕。)
//在顺序表ST中顺序查找其关键字等于key的数据元素。
//若找到,则函数值为该元素在表中的位置,否则为0
int Search_Seq (SSTable ST, KeyType key)
{
ST.R[0].key = key; //“哨兵”
for(int i = ST.length; ST.R[i].key != key; --i); //从后往前找
return i;
}
两个算法的时间复杂度相同,都为 。
四、练习
1、对 n 个元素的表做顺序查找时,若查找每个元素的概率相同,则总查找次数 ,可得平均查找长度为
。
2、对长度为3的顺序表进行查找,若查找的第一个元素的概率为1/2,第二个元素的概率为1/3,第三个元素的概率为1/6,则查找任一元素的平均查找长度为_____5/3_____。
解: