顺序查找,又称为线性查找,主要用于在线性表中进行查找。顺序查找通常分为对一般无序线性表的查找和对按关键字有序的顺序表的查找。
顺序查找的缺点是当n很大时,平均查找长度较大,效率低;优点是对数据元素的存储没有要求,顺序存储和链式存储皆可。
一般线性表的顺序查找
基本思想:从线性表的一段开始,逐个检查关键字是否满足给定的条件。若查到某个元素的关键字满足给定条件,则查找成功 ,返回该元素在线性表中的位置;若已经查找到表的另一端,还没有查找到符合给定条件的元素,则返回查找失败的信息。
算法:
typedef struct{ //查找表的数据结构
ElemType *elem; //元素存储空间基址,建表时按实际长度分配,0号单元留空
int TableLen; //表的长度
}SSTable
int Search_Seq(SSTable ST,ElemType key){
ST.elem[0] = key; //哨兵
for(i = ST.TableLen; ST.elem[i] != key; --i); //从后往前找
return i;
}
上面的算法中,将 ST.elem[0]称为哨兵。引入的目的是使得Search_Seq内的循环不必判断数组是否会越界,因为当满足
i == 0 时,循环一定会跳出。
对于有n个元素的表,给定值key与表中第i个元素的关键字相等,即定位第i个元素时,需进行n+1次关键字的比较,即
。查找成功时,顺序查找的平均长度为
当每个元素的查找概率相等时,即:
则有
查找不成功时,与表中个关键字的比较次数显然是n+1次,从而顺序查找不成功的平均查找长度为:
有序表的顺序查找
对于有序表的查找,在查找失败时可以不用在比较到表的另一端就能返回查找失败的信息,这样能降低顺序查找失败的平均查找长度。
假设表L是按关键字从小到大排列的,查找的顺序是从前往后查找,待查找元素的关键字为key,当查找到第i个元素时,发现第i个元素对应的关键字小于key,但第i+1个元素对应的关键字大于key,这时就可以返回查找失败的信息了。
有序顺序表上的顺序查找判定树:
在有序表中的顺序查找中,查找成功的平均查找长度和一般线性表的顺序查找一样。
查找不成功的平均查找长度在相等查找概率的情形下有
其中,qj是到达第j个失败节点的概率,在相等查找概率的情形下,为1/(n+1);lj是第j个失败节点所在的层数。