查找:根据给定的某个值,在查找表中确定一个其关键字等于给定值的记录或数据元素。若表中存在这样的一个记录,则称查找是成功的,此时查找的结果为给出整个记录的信息,或指示该记录在查找表中的位置。若表中不存在关键字等于给定值的记录,则称查找不成功,此时查找的结果可给出一个空记录或者空指针。
本篇文章讨论在静态查找表中的查找操作-顺序查找.
静态查找表:一旦创建,主要是查找,很少或者不做修改(如插入和删除)。
输入:表的长度,表中各个元素。要查询的表元素。
输出:要查询的表元素的位置(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越小,事先不知道概率可动态调整。