binary search

来源:互联网 发布:淘宝线下实体店赚钱吗 编辑:程序博客网 时间:2024/06/05 10:05

这里主要讨论的是binary search的边界情况及处理。

参考 : http://my.oschina.net/fullofbull/blog/199693?fromerr=2T6aDmtE

经典版本:(注意,边界条件迭代、循环终止条件设定,中位数计算)

int binary_search(int *A, int n, int target){    int low = 0, high = n - 1;    assert(A != NULL && n >= 0);    while (low <= high)    {        int mid = low + (high - low) / 2;        if(A[mid] == target)            return mid;        else if (A[mid] < target)            low = mid + 1;        else            high = mid - 1;    }    return -1;}

这里查找的条件是:

        if(A[mid] == target)            return mid;        else if (A[mid] < target)            low = mid + 1;        else            high = mid - 1;

即碰到target就返回,每次进行两次判断。

但是判断

if(A[mid] == target)

在开始时几乎没有意义,因为直接找到的可能性很小,为1/n。只有在后续的小区间判断,比较有意义。具体解释如下《代码之美》:

我们先来考虑循环的执行步骤。假设我们有一个有着 n 个元素的数组(此处n是一个很大的数值),那么从该数组中第一次找到目标的概率为 1/n(一个很小的数值),下一次(经过一次二分)的概率则是 1/(n/2)——仍然不是很大——以此类推下去。事实上,只有当元素的个数减少到了 10 到 20 的时候,一次找到目标的概率才变得有意义,而对于10 到 20 个元素进行查找需要的只是大概 4 次循环。当查找失败时(在大多数的应用中很普遍),那些额外的测试就将变成纯粹的额外开销。

我们也可以来计算一下,在什么时候找到目标值的概率能接近 50%,但请你扪心自问:在一个复杂度为 O(log2N)
的算法中,对于它的每一步都增添一个额外的复杂计算,而目的仅仅是为了减少最后的几次计算,这样做有意义吗?

所以,查找过程中可以将判断改为:

        if (A[mid] < target)            low = mid + 1;        else            high = mid;

或者

        if (A[mid] > target)            high = mid - 1;        else            low = mid;

这种查找还可以完成查找首个,或者最后一个出现的target。

int binary_search_first_position(int *A, int n, int target)  {       int low = -1, high = n;    assert(A != NULL && n >= 0);    while (low + 1 < high)    {        int mid = low + (high - low) / 2;        if (A[mid] < target)            low = mid;        else            high = mid;    }    if (high >= n || A[high] != target)        return -high - 1;    else        return high;  // high == low + 1}int binary_search_last_position(int *A, int n, int target)  {    int low = -1, high = n;    assert(A != NULL && n >= 0);    while (low + 1 < high)    {        int mid = low + (high - low) / 2;        if (A[mid] > target)            high = mid;        else            low = mid;    }    if (low < 0 || A[low] != target)        return -low - 2;    else        return low;  // low == high - 1}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苏宁易购买的东西比专卖店贵怎么办 手机打字键盘上没有语音功能怎么办 网贷催收发语音侮辱人怎么办 康力无机房电梯到楼层不关门怎么办 档案工龄少算了工资领开了怎么办 别人骚扰我打电话报警人走了怎么办 因外借医保卡被香港保险拒保怎么办 医保和社保断了一个月怎么办 苹果8呼叫受限请勿越权使用怎么办 药物储存2~8度没冰箱怎么办 利仁分体电饼铛做饼熟的慢怎么办 闲鱼买的东西自提有问题怎么办 老板油烟机的表层的膜掉了怎么办 给老板打工老板跑路了怎么办 公司要业务员承担客户的欠款怎么办 从自己公司出去抢自己客户怎么办? 在苏宁买东西买贵了怎么办 苏宁购物小票不见了未提货怎么办 结痂的地方扣掉了颜色不一样怎么办 实体店买手机不给发票怎么办 小孩学英语字母怎么都记不住怎么办 聊客老是提示网络连接失败怎么办? 天猫购物漏发客服不理怎么办 京东二维码被骗怎么办联系客服号码 京东客服打电话来让自己退款怎么办 淘宝上买到的衣服是坏的怎么办 淘宝上买到的产品是坏的怎么办? 在淘宝买到东西是坏的怎么办 冰箱冷冻室门生锈变形关不严怎么办 诲信电冰箱电脑板坏了怎么办 冰箱里放了热水后就不制冷了怎么办 双温冰柜冷藏矿泉水不冰怎么办 美的电饭煲e一传感器也没坏怎么办 美的电饭煲不工作显示C3怎么办 美的电饭煲啪一声响不工作了怎么办 误给宝宝吃了坏的饭怎么办 鼠标没反应键盘指示灯不亮怎么办 新买变频冰箱风机声音大怎么办 三星手机玩王者荣耀一直闪退怎么办 刚申请的阿里大宝卡不想要了怎么办 国美刚买不到一个月电视坏了怎么办