算法理解——再解二分

Posted ninedream

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法理解——再解二分相关的知识,希望对你有一定的参考价值。

  刷书ing……

  今天仔细研读了一下二分章节,并刷完了该章节的两个问题,对二分答案认识加深。

观察二分答案模板:

while(l<r)
{
    int mid=(l+r)/2;
    if(check(mid))r=mid;
    l=mid+1;
}
return r;

while(l<r)
{
    int mid=(l+r-1)/2;
    if(check(mid))l=mid;
    r=mid-1;
}
return r;

  (最后的return建议用r,l容易造成视觉混淆是一方面,另一方面是实数域二分时精度问题上一般用r更准确(实践得之,血泪教训))

  对于二分的mid进行check,即判定是否满足条件。

  若满足,则l=mid或r=mid

  l=mid,实际上是将区间缩放到右边部分,最终求解的结果必然是满足check条件的最小者。

  r=mid,则也就是将区间缩放到左边部分,最终求解的结果必然是满足check条件的最大者。

 

  而l=mid与r=mid-1配套,r=mid与l=mid+1配套。

  这两套模板内部,二者先后顺序无妨,判定条件取非的区别。

  即if(check)l=mid……与if(!check)r=mid-1等价。

 

  而为何可以l=mid或者r=mid,也就是问为何l和r可以包含到缩放后的区间中去。实际上是因为mid可能是所要求的解。

  说明mid是满足check条件的,其有可能作为最终解。

以上是关于算法理解——再解二分的主要内容,如果未能解决你的问题,请参考以下文章

对二分算法的理解及结对编程情况

对二分法的理解以及结对编程情况

10分钟带你理解算法中二分查找

理解二分查找问题中的范围问题

我理解的二分搜索

九章算法第二天,二分搜索