关于二分的心得

来源:互联网 发布:js 语音波形图 编辑:程序博客网 时间:2024/04/29 17:41

    以前就做过一些有关二分的题目,但最近这段时间再次做二分时,发现自己有时候还是会犯一些同样的错误,因此觉得是时候该总结一下了。

 

1.实数

   对于实数问题,我们的循环结束条件是up-low>eps,其中eps是我们定义的控制精度的一个常量,具体取多少根据情况而定(一般取1e-6就够了);PI要取acos(-1.0)然后就是在计算时要注意精度丢失问题,尽量避免除法和三角函数运算;另外我们最好直接二分要求的结果,而不要设置中间变量,因为从 中间变量->结果 这一步计算很有可能就会产生较大误差。

while(up-low>eps){     mid=(low+up)/2;    if(condition==true)        low=mid;    else        up=mid;}


 

(ps:对于g++编译器和c++编译器,前者输出函数printf中用%f,而后者用%lf,切记!!!)

 

2.整数

    整数唯一的好处就是不用考虑精度问题了,说实话本人也较喜欢这类问题。但整数还需要注意一个细节,

就是等号的处理,这点必须要考虑清楚,如果相等,到底是处理low还是处理up,这个要结合题意来看。另外为了使循环能终止,我更倾向于下面这种写法,最后结果取up,当然仅供参考。

while(up>low)        {            mid=(low+up)>>1;            int step=jump(mid);//因为此处只是截取的部分代码,所以不必深究jump函数            if(step>m)                low=mid+1;            else                up=mid;        }


 

 

 

 

 

原创粉丝点击