静态查找表只查找,不进行插入或删除。
静态查找表的操作有:
Create(&ST, n)构造一个含有 n 个数据元素的静态查找表
Destory(&ST) 销毁表 ST,前提是表存在
Search(ST, kval) 若 ST 中存在其关键字等于 kval 的数据元素,则函数值为该元素的值,或在查找表中的位置,否则为空。
Traverse(ST) 按照某种次序输出 ST 中的每个数据元素
静态查找表的顺序存储表示:
typedef struct
{
ElemType *elem;//数据元素存储空间基址,建表时按实际长度分配,0号单元留空
int length;//表中元素个数
}SSTable;
1、静态查找的方法
(1)顺序查找
int Search_Seq(SSTable ST,KeyType kval)
{//在顺序表 ST中顺序查找其关键字等于 kval 的数据元素,若找到,则函数值为该元素在表中的位置
ST.elem[0].key=kval;//设置哨兵
for(i=ST;length; ST.elem[i].key != kval; --i);//从后往前找
return i;//找不到时,i为0
}
平均查找长度:查找过程中先后和给定值进行比较的关键字个数的期望值称做查找算法的平均查找长度。
顺序查找的平均查找长度是 (n+1)/2
(2)折半查找
折半查找又称二分查找。
int Search_Bin(SSTable ST, KeyType kval)
{//在有序表ST中折半查找其关键字等于 kval 的数据元素,若找到,则函数值为该元素在表中的位置,否则为0
low=1; high=ST.length;//置区间初值
while(low<=high)
{
mid=(low+high)/2;
if(kval == ST.elem[mid].key) return mid;//找到查找元素
else
if(kval < ST.elem[mid].key) high=mid-1;
else low=mid+1;
}
return 0;//顺序表中不存在待查元素
}
折半查找的平均查找长度为
ASL = (n+1)/n * log2 (n+1) - 1;
(3)分块查找
分块查找又称索引顺序查找,其性能介于顺序查找和折半查找之间,它适合对关键字“分块有序”的查找表进行查找操作。
块间有序,块内无序。查找表中的记录按其关键字的大小分成若干块,前一块的最大关键字小于后一块的最大关键字,而各块内部的关键字不一定有序。
查找的过程分为两步进行:先在索引表中进行折半或顺序查找,以确定待查记录“所在块”;然后在已限定的那一块中进行顺序查找。