順序查找
順序查找又称为线性查找,类似于遍历操作,对于数组就是依靠数组下标,对于链表依靠next指针。<br />一般线性表的顺序查找<br />引入哨兵( 不必判断数组是否越界),并非该算法独有,避免很多不必要的判断,提高效率。
typedef struct {
ElemType *elem; // 数组的动态分配,0号单元留空,申请长度时len+1(1留空)
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;
}
// 返回0说明查找失败
下标说明:由于0号单元留空,所以申请n+1个元素,n为上述代码中的TableLen
SSTable T;
int TableLen = 8;
T.elem = (ELemType *)malloc(sizeof(Elemtype)*(TableLen+1))
时间复杂度与分析 :
逆序查找时,第n位,比较1次。即第i各元素,(n+1-i)次比较,等概率进行累加
查找成功:ASL(平均查找长度)= (n+1)/2
查找失败:查找次数等于申请的空间数,为(n+1),ASL(不成功的平均查找长度) = n+1
通常,查找表中的概率并不相等(很多数据重复),应该先按概率大小重新排序。
优点:数据的存储方式没有要求,表的有序性没有要求,无论关键字有序。
缺点:n大时,ASL大,低效。