分析“二分法
查找算法中的“二分法”是这样定义的:
给定N个从小到大排好序的整数序列List[],以及某待查找整数X,我们的目标是找到X在List中的下标。即若有List[i]=X,则返回i;否则返回-1表示没有找到。
二分法是先找到序列的中点List[M],与X进行比较,若相等则返回中点下标;否则,若List[M]>X,则在左边的子系列中查找X;若List[M]<X,则在右边的子系列中查找X。
试写出算法的伪码描述,并分析最坏、最好情况下的时间、空间复杂度。
代码实现:
int fun(int a[],int k,int n){
int left=n-1,right=0;
int M;
while(right<=left){
M=(left+right)/2;
if(a[M]==k) return M;
else if(a[M]<k){
right=M+1;
}
else{
left=M-1;
}
}
return -1;
}
分析:
最好情况为:
刚好是中间的数,时间复杂度为O(1),空间复杂度为O(1)
最坏情况为:
在头尾或者没有这个数,而二分法是每次从中间位置寻找,每次都是n/2,根据表格为log n
函数
|
1
| 2 | 4 | 8 | 16 | 32 |
1
log n
n
n log n
n^2
n^3
|
1
0
1
0
1
1
| 1 1 2 2 4 8 | 1 2 4 8 16 64 | 1 3 8 24 64 512 | 1 4 16 64 256 4096 | 1 5 32 160 1024 32768 |
2^n n ! | 2 1 | 4 2 | 16 24 | 256 40326 | 65536
209227898800
|
4294967296
26313*10^33
|
但分析可以得到在时间复杂度中2^n为主要影响因素,将问题规模缩小为1,即k/2^n=1,解得k=log n
所以最坏时间复杂度为O(log n) ,空间复杂度为O(1)