二分新姿势--倍增法

Q:二分不是用分治法的吗?
A:其实二分不只可以用分治法,倍增法也行哦。

【分治法】
先简略讲下分治法,分治法实现二分其实就是用决策区间折半,再判断是否可行,以修正区间的范围。

Ps:博主写的二分是求最小值的(求最大值自己yy一下就行了)

代码如下:

while (L<=R)
{
    int mid=(R-L>>1)+L;
    if (Check(mid)) R=mid-1; else L=mid+1; 
}

答案: L

【倍增法】
倍增法用了二进制的思想巧妙实现了二分。
对于区间[L,R],定义 logR=log2(R) (Ps:log2(R)是求以2为底R的对数的函数)。
定义一个数 ans ,初值为0。
每次二分检验 ans+1<<logR (Ps:先判断 ans+1<<logR 是否在区间[L,R]范围内)是否可行,不可行则 ans+=1<<logR
每次二分检验让 logR 逐渐减小(每次减1),这样相当于枚举了二进制的每一位。
正确性显而易见。

代码如下:

int logR=log2(R);
while (logR>=0&&ans+(1<=L&&ans+(1<{ if (!Check(ans+(1<1<

答案: ans+1

你可能感兴趣的:(二分,倍增,算法&数论总结,By,Greninja)