Skip to content

LV010-顺序查找

一、顺序查找

1. 查找方法

静态查找表用顺序存储结构表示时,顺序查找的查找过程为:设给定值为 k ,在表 L=(R1,R2,,Rn) 中,从 Rn 开始,查找 key=k 的记录。

实现代码如下:

c
int sqsearch(seqlist r, keytype k)  
{   
    int i;
	r.data[0].key = k;  /* k 存入监视哨 */
	i = r.len;          /* 取表长 */
	while(r.data[i].key != k) 
        i--;  
	return (i);
}

在程序中初始化创建查找表时,由于是顺序存储,所以会将所有的数据元素存储在数组中,但是把 第一个位置 留给了用户用于查找的关键字,顺序表的一端添加用户用于搜索的关键字,称作 监视哨

image-20220503144415215

2. ASL

表中有 n 个数据元素,查找第一个元素时需要比较 n 次;查找最后一个元素时需要比较 1 次,所以有 Ci=ni+1,假设这 n 个数的被查找到的概率是相同的,则有:

ASL=i=1n1n(ni+1)=n+12

这个平均查找长度是在假设查找算法每次都成功的前提下得出的。而对于查找算法来说,查找成功和查找失败的概率是相同的,查找算法的平均查找长度应该为 查找成功时的平均查找长度加上查找失败时的平均查找长度。若每次都查找失败,那么比较的次数都是 n + 1 ,所以最终 ASL 为:

ASL=12i=1n1n(ni+1)+12(n+1)=34(n+1)

【缺点】这样算下来,查找的效率是很低的,查找某记录几乎要扫描整个表,当表长 n 很大时,会令人无法忍受。