开发工具与关键技术:算法
作者:听民谣的老猫
撰写时间:2020.5.18
什么是查找???
在一些(有序的/无序的)数据元素中,我们通常会通过查找来找出与给定关键字相同的数据元素。也就是根据给定的某个值,在查找表中确定一个关键字等于给定值的记录或数据元素。
静态查找又分为哪几种???
- 顺序查找
从文字理解就可以知道,是给定的值依次对数据元素的关键字值进行比较。
算法代码:
int seqsearch (RecordType r,int n,Ketype 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到100,你给定一个数。如果这个数>50,那你就可以排除1到50.
示意图: (查找23)
也就是说每进行一次折半查找,都将查找范围缩小一半,如此重复直到查找成功或失败.
算法代码:
int Binsearch (RecordType r,int n,Ketype k){
/*在有序列表r中折半查找关键字值等于k的数据元素*/
int low,high,mid;
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) //查找失败
}
- 分块检索
分块检索介于上面的静态,折半的查找方法。它类似于我们在字典按拼音或偏旁查找自己需要的字。
分块检索最主要的就是它怎么分块并且有序。
示意图:
这个就已经分好块了,它分块的依据是前一块中的最大关键字值必须小于后一块的最小关键字值。 比如上面的22到20和33到48这两块就满足前一块中的最大关键字值必须小于后一块的最小关键字值。它上面的1到18就是有序的索引表,索引表的建立就意味着可以采用折半或者顺序查找。