关于查询 (顺序查询与二分查询)
1. 问题
写出两种检索算法:在一个排好序的数组T[1..n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0
2. 解析
这个问题很好想到暴力,就是一个一个查找过去,这个可以用于顺序表存储得到数组,也可以用于链表存储的链表。
同时观察一下这是一个排好序的数组,那么我们也能很容易的想到二分查找,对于每一次的查找,都对半,去找中间的值,如果所要查找的x比我所得的中间值,要小,我就将右边界缩小,如果相等,就退出,如果大,就将左边界扩大,持续下去,直到找到,或者左边界的值要比右边界的值大时(说明没找到)就退出。
3. 设计
顺序查找的伪代码:
for(i=1;i<len;i++){
if(a[i]==x){
print(i)
break;
}
}
二分查找的伪代码:
l=1,r=n;
while(l<=n){
mid= (l+r)/2
if(a[mid]==x){
printf(mid);
break;
}
if(a[mid]<x){
l=mid+1
}
else r=mid-1
}
4. 分析
顺序查找的时间复杂度为O(n),二分查找的时间复杂度为O(logn).
5. 源码
kitalekita/binary_search.cpp at main · kitalekita/kitalekita (github.com)
kitalekita/brute_search.cpp at main · kitalekita/kitalekita (github.com)