我正在执行二分搜索,假设我必须找到x
的最小值,以便black_box(x)
给我true
结果。
black_box(x)
black_box(x)
给我真实,那么x+1,x+2,x+3,x+4....upto infinty
所有人都会给我true
对于整数值,这是简单的二进制搜索
start=0;
end = Max;
ans=-1;
while(start<=end){
mid =(start+end)/2;
if(black_box(mid)):
end =mid-1
ans=mid;
else: start=mid+1;
}
如果我想要一个小数为2的floating point
整数怎么办?我该怎么做二分搜索?
答案 0 :(得分:1)
您只需迭代,直到start
和end
的差异不超过0.01
。所以停止条件现在是:
while(end-start > 0.01){
此外,正如您在评论中指定的那样,您不能在算法中递增/递减start
和end
,因为索引不是离散的。完整的算法现在是:
start=0;
end = Max;
ans=-1;
while(end-start > 0.01){
mid =(start+end)/2.0;
if(black_box(mid)):
end =mid
ans=mid;
else: start=mid;
}
这是有效的,因为在每次迭代时,start
在精确值上是下限,而end
在精确值上是上限 。如果两者的差异不超过0.01
,我们知道它在start
和end
之间,并且由于差异小于0.01,因此精确到两位小数。
然而,你的算法错误,因为通过设置end = Inf
,你无法使用它。您也许可以使用最大可表示值,或者首先使用指数增量搜索作为预处理步骤。