算法简单理解(二)

Binary search,也可以说是 二元搜索法。它的Complexity:O(lgN)

它的先决条件是,一个 Array a[N] 不管他多大,必须是排序好的,无论是从小到大,还是从大到小。

假设我们要在这个Array中找n,

开始min = 0,max = N-1,
取mid = (min+max) / 2 找到中中间点

如果找到了,n == a[mid] 那就说明找到了.

1.如果要找的n < a[mid] , 那就可以舍弃右半边,继续用同样的方法在左半边中找.(min = min , max = mid-1, mid = (min +max )/2)

2.如果要找的n > a[mid] , 那就可以舍弃右半边,继续用同样的方法在左半边中找.(min = mid + 1 , max = max, mid = (min +max )/2)

3.如果 min > max ,那就说明找不到,n在Array中不存在。

从此可以看到,它有一个特性,每一次, 就可以丢掉一半。每次都是 /2。

为何是:O(lgN)

想象一下,每次可以丢掉一半的数据 :

N = 1 最多找1次
N = 2 最多找2次(第一次丢掉一般,剩下1)
N = 4 最多找3次(第一次丢掉一般,剩下2,同上)
N = 8 最多找4次(第一次丢掉一般,剩下4,同上)
N = 16 最多找5次(第一次丢掉一般,剩下8,同上)
.....
看到这里可能会感觉不是很明显,那数据加到一定大的时候。

N = 1024 (2^10)最多找11次
N = 65536 (2^16) 最多找17次
N = 40亿 (约 2^32) 最多找33次

需要花费的时间跟 lgN(log∨2N)的结果成正相关,所以是O(lgN)

然后是代码:

int a[N];

void binarySearch(int min, int max int n){

    int mid = 0;
    
    if(min > max){
        printf("%d 找不到 \n",n);
        return; 
     }
    
    mid = min + (max - min) /2;
    
    if(n == a[mid]){
        printf("%d 找到了 \n",n);
        return;
    }
    
    if (n < a[mid])
       binarySearch(min,mid-1,n);
    else
       binarySearch(mid+1,max,n);
}

你可能感兴趣的:(算法简单理解(二))