静态查找的知识学习小结

静态查找是指在静态查找表上进行的查找操作,查找满足条件的数据元素的存储位置或各种属性。它具有以下三种查找方式:

一、顺序查找

1、顺序查找,顾名思义就是在查找过程中按顺序依次用查找条件中给定的值与查找表中数据元素的关键字值进行比较,若某个记录的值与给定值相等,则查找成功,返回该记录值的存储位置;反之,若直到最后一个记录值的关键字值与给定值均不相等,则查找失败,返回查找失败标志。

2、查找表的存储结构是线性表(顺序表或链表)。

3、顺序表的类型定义:

#define MAX_NUM 100   //用于定义表的长度

typedef struct elemtype{

  keytype key;

……

}RecordType[MaxSize];

数据元素个数为n(n

4、假设我们有多个关键字,我们只选取一个我们需要比较的关键字的值,把它们放入数组r中,这时数组有n个元素,假设要查找的关键字的记录是k,下面我们给出顺序查找的完整算法:

int SeqSearch(RecordType r,int n, Keytype k){

/*返回关键字值等于k的数据元素在表r中的位置,n为表中元素的个数*/

i=n;

r[0].key=k;/*监视哨*/

while (r[i].key!=k){

i--;

}

if(i>0){

return (i); /*查找成功*/

}else{

return (-1); /*查找失败*/

}

}

二、折半查找

1、折半查找只适用对有序顺序表进行查找。

2、每进行一次折半查找,要么查找成功,结束查找;要么将查找范围缩小一半,如此重复,直到查找成功或查找范围缩小为空即查找失败为止。因此折半查找需要的时间相对较少,效率高。

3、折半查找又称二分查找。是对有序的顺序表进行的高效查找方法。有序表的对应向量R中最多可录入12个结点的关键字。每个关键字为1000以内的正整数,且用半角逗号分隔。

4、折半查找算法的描述如下所示:

int BinSearch(RecordType r,int n, Keytype k){

/*在有序表r中折半查找关键字值等于k的数据元素*/

int low,high,mid;/* low是指起始点;high是指最高点;mid是指low加high的和除以2的值;*/

low=1; high=n;/*设置初始查找范围的低、高端指针*/

while (low <= high){

mid=(low+high)/2; /*取表的中间位置*/

if(k==r[mid].key){

return (mid); /*查找成功*/

}else{

if(k< r[mid].key){

high=mid-1; /*在左子表中查找*/

}else{

low=mid+1; /*在右子表中查找*/

}

}

}

return (-1); /*查找失败*/

}

5、二分查找算法平均查找长度为log2n,比较次数少,查找速度快。它适用于那种一经建立就很少改动,而又经常需要查找的顺序表。

三、分块检索

1、分块查找(Blocking Search)又称索引顺序查找。它是一种性能介于顺序查找和二分查找之间的查找方法。

2、查找表存储结构:查找表由“分块有序”的线性表和“有序的”索引表组成。

(1)“分块有序”的线性表:线性表R被均分为若干块,每一块中的关键字不一定有序,但前一块中的最大关键字必须小于后一块中的最小关键字,即表示“分块有序”的。

(2)“有序的”索引表:抽取各块中的最大关键字及其起始位置和长度构成一个索引表ID中,

3、分块查找时首先查找索引表。索引表是有序表,可采用二分查找或顺序查找,以确定待查的结点在哪一块。然后在已确定的块中进行顺序查找。

4、索引表中的数据元素由两个域构成,key域为被索引的若干个数据元素中关键字的最大值,link域为被索引的若干个数据元素中第一个数据元素的位置编号。

四、静态查找方法比较

1、ASL(Average Search Length),即平均查找长度: 顺序查找最大,折半查找最小,分块查找在两者(顺序查找和折半查找)之间。

2、适用的表结构:顺序查找是有序表、无序表都可以(即对表无要求),折半查找是有序表,分块查找是分块有序表。

3、存储结构:顺序查找是顺序存储结构和线性链表,折半查找是顺序存储结构,分块查找是顺序存储结构和线性链表。

你可能感兴趣的:(静态查找的知识学习小结)