查找-顺序查找

查找:根据给定的某个值,在查找表中确定一个其关键字等于给定值的记录或数据元素。若表中存在这样的一个记录,则称查找是成功的,此时查找的结果为给出整个记录的信息,或指示该记录在查找表中的位置。若表中不存在关键字等于给定值的记录,则称查找不成功,此时查找的结果可给出一个空记录或者空指针。

本篇文章讨论在静态查找表中的查找操作-顺序查找.

静态查找表:一旦创建,主要是查找,很少或者不做修改(如插入和删除)。

输入:表的长度,表中各个元素。要查询的表元素。

输出:要查询的表元素的位置(1<=pos=length(ST)).

运行结果:

顺序查找的查找过程为:从前向后逐一比较,一旦找到则返回。

辅助宏:

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define UNDERFLOW -2
#define NULL 0
#define TABLE_INIT_SIZE 100
#define TABLEINCREMENT 10
typedef int Status;
typedef int ElemType;
typedef int KeyType;

首先是静态存储表的存储结构定义:

//顺序表存储结构定义
typedef struct{
   ElemType *elem; //表基址
   int length;//表长
}SSTable;

算法实现:

int LocateElem(SSTable ST,ElemType e){
   //顺序查找 找到返回位序,否则返回0
   for(int i=0;i<ST.length;i++)
       if(e==ST.elem[i])
           return i+1;
   return 0;
}

这个算法还是可以改进的。改进方法为:

把待查关键字key存入表头,从后向前逐个比较,可免去查找过程中每一步都要检测是否查找完毕,加快速度 找到返回位序,否则返回0。

int Search_Seq(SSTable ST,ElemType key){
   /*改进的顺序查找
   把待查关键字key存入表头,从后向前逐个比
   较,可免去查找过程中么一步都要检测是否查找
   完毕,加快速度 找到返回位序,否则返回0 */
   int i;
   ST.elem[0]=key;
   for(i=ST.length;ST.elem[i]!=key;i--);
   return i;
}

查找性能分析-平均查找长度ASL(平均比较次数)

记第i个元素被查找的概率为Pi,则可以计算

ASL=n*P1 +(n-1)*P2 +...1*Pn+(n+1)*P0

通常所查找的元素均在sT中,此时P0=0;

若查找保证成功且各元素几率同1/n,则

ASL=(n+1)/2;

若成功与否各50%,且各元素被找到的概率同1/2n 则

ASL = (n+1)/4 + (n+1)/2 = 3*(n+1)/4;

概率越大越靠后则ASL越小,事先不知道概率可动态调整。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值