在算法编写过程中,二分是经常用到的一个算法,它往往是用于对于枚举算法时间复杂度的优化(甚至有些时候用枚举算法是行不通的)。
应用二分法的抽象数学条件大致如下:
1、答案是数值。
2、答案在一个可以确定的有限范围内。
3、答案是这个有限范围的一个划分。具体来说:答案本身和数轴上它左(右)边的数满足某种性质A,而数轴上在答案右(左)边的数满足另外一种性质B,其中A,B是相对立的两种性质(即对于一个数x,它在性质A,B中满足且只满足一个)。
4、存在一种可行算法,可以判断x满足性质A or B。
具体说明一下二分法的实现过程(拿整形答案举例):
1、假设:经过分析,ans和数轴上在它左边的数满足性质A,数轴上在ans右边的数满足性质B。确定ans∈[L,R)
2、若L=R-1,跳转到步骤4。令m=(L+R)/2,检验m是否满足性质A
3、若m:满足性质A,可以判断ans∈[m,R),令L=m;满足性质B,可以判断ans∈[L,m),令R=m。回到步骤2。(通过画数轴理解)
4、当L=R-1,可以判断ans=L(区间[L,R)内只有唯一一个数L)
如果答案是小数,那么根据答案要求设定精度上限即可。