算法简单理解(二)

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);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,790评论 0 33
  • 超高速音视频编码器用法: ffmpeg [options] [[infile options] -i infile...
    吉凶以情迁阅读 4,715评论 0 4
  • 给自己的资金“判个无期徒刑”的人,实际上是已经拥有了足够的智慧,所以他们有资格站在资本背后——而他是否最终可以成为...
    小小滴多多阅读 485评论 0 0
  • 日落留下一丝残辉,染红了碧空,留下最美的夕阳;微风吹动花海,清气散布整个世界,留下沁人心鼻的花香;流光带走了曾经,...
    镜花水月233阅读 362评论 0 1
  • 没有什么东西是必须拥有的,也没有什么东西是不能失去的。 傍晚的光会偷偷变成橘黄,印在窗上,门上,地上,身上,放弃,...
    说悦阅读 162评论 0 0