减而治之 - 二分查找 - lower_bound实现原理

       本文介绍利用二分实现 lower_bound 的原理。

       lower_bound(T * a, T & t, int lo, int hi) 的功能是:在某个有序数组 a[lo, hi) 的范围内,查找不小于 t 的最小元素或最小元素位置。这可以用二分来实现。

       算法可以这样理解。我们维护两个界限,分别为:

            L:保证 ≤ L 位置的元素都小于 t;
            R:保证 ≥ R 位置的元素都大于等于 t。

       我们不断改变 L 和 R 的位置,使 L 和 R 不断靠近,直至 L + 1 = R 时,R 即为我们要查找的目标位置。

       假想 lo-1 位置存放着一个 -∞ 的哨兵,hi 位置存放着一个 +∞ 的哨兵。初始时 L = lo - 1, R = hi。

       如何调整 L 和 R 的位置呢?每次观察区间 [L, R] 中间位置的元素,即 A[mid = (L+R)/2] 的元素与 t 的大小,因为 A 的有序性:  

            若 A[mid] ≥ t, 我们可以把 R 替换为 mid。
            若 A[mid] < t,我们可以把 L 替换为 mid。
       这样,L 和 R 不断靠近,直至 L + 1 == R,则结束,R 则为我们要找的目标位置。

       C++代码示例(设要查找的类型是整数):

/* 返回按升序排列的 a[lo, hi) 中不小于 t 的最小值的下标。若不存在,则返回hi */
int lowerBound(int * a, int t, int lo, int hi)
{    
    int L = lo - 1, R = hi;
    while ( L + 1 < R )
    {
        int mid = (L + R) >> 1;
        if ( a[mid] < t )
            L = mid;
        else 
            R = mid;
    }
    
    return R;
} 

 

转载于:https://www.cnblogs.com/fyqq0403/p/10577827.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值