讨论1.5 分析“二分法”
来自 MOOC 浙江大学 数据结构
查找算法中的“二分法”是这样定义的:
给定N个从小到大排好序的整数序列List[],以及某待查找整数X,我们的目标是找到X在List中的下标。即若有List[i]=X,则返回i;否则返回-1表示没有找到。
二分法是先找到序列的中点List[M],与X进行比较,若相等则返回中点下标;否则,若List[M]>X,则在左边的子系列中查找X;若List[M]<X,则在右边的子系列中查找X。
试写出算法的伪码描述,并分析最坏、最好情况下的时间、空间复杂度。
伪代码:
int twofen(int List[],int l,int r,int x){
int mid;
while(l<=r){
mid=(l+r)/2;
if(List[mid] == x) return mid;
else if(List[mid] > x) r=mid-1;
else l=mid+1;
}
return -1;
}
分析:
最好情况下:T(n) = O(1),S(n) = O(1).
二分法每执行一次问题规模n = n / 2;最终将问题规模缩小到1,即最后才找到x或到最后都没有找到x;
/故有 n/(2^k)=1;解得执行次数k=log n(以2为底)
最坏T(n) = O(log n) (我们关注的是增长率,底数不重要故可忽略)
最坏T(n) = O(log n ); S(n) = O(1)