编辑:最佳解决方案包括两个简单的二分搜索。
对于我在下面发表的又长又复杂的帖子,我感到非常抱歉。问题的本质是在包含 100*100 个元素的空间中找到一个点。你能做的最好的事情就是在每一步将这个空间一分为二。你可以用一种复杂的方式来做(我在这篇文章的其余部分中所做的)但是如果你意识到 X 轴上的二分搜索仍然在每一步将研究空间一分为二(Y 轴也是如此)轴)然后你就会明白它是最佳的。
我还是让我做的事,很抱歉我在里面做出了一些强制性的肯定。
如果您正在寻找一个简单的算法(尽管不是最佳的),只需按照建议运行二分搜索两次即可。
但是,如果您想要最佳算法,您可以同时在 X 和 Y 上寻找边界。 (需要注意的是,两种算法具有相同的渐近复杂度,但最优算法仍然会更快)
在下面的所有图形中,点 (0, 0) 都位于左下角。
基本上,当您选择一个点并获得结果时,您将空间分成两部分。当你仔细想想,这实际上是你可以从中提取的最大信息量。
如果您选择该点(黑色十字)并且结果为 1(红线),这意味着您要查找的点可以not位于灰色空间中(因此必须位于剩余的白色区域中)
另一方面,如果值为 0(蓝线),则意味着您要查找的点可以not位于灰色区域(因此必须位于剩余的白色区域)
因此,如果您得到一个 0 结果和一个 1 结果,您将得到以下结果:
您要查找的点位于矩形 1、2 或 3 中。您只需检查矩形 3 的两个角即可知道这 3 个矩形中哪一个是好的矩形。
所以算法如下:
请注意您正在使用的矩形的左下角和右上角在哪里。
进行二分查找沿着矩形的对角线直到您至少偶然发现一次 1 结果和一次 0 结果。
检查矩形 3 的另外 2 个角(您必须已经知道对角线上两个角的值) 可以仅检查一个角来知道正确的矩形(但您必须检查两个角)如果右边的矩形是矩形3)
确定您要查找的点是否在矩形 1、2 或 3 中
重复将问题减少到好的矩形,直到最终的矩形减少到一个点:这就是您要寻找的值
编辑:如果你想要最高最优性,那么当你选择点 (50, 50) 时,你不会将空间等分。一个比另一个大三倍。理想情况下,您将选择一个将空间切割成两个相等区域(按面积)的点
您应该在开始时计算一次值factor = (1.0 - 1.0/sqrt(2.0))
。然后当你想在值之间切换时a
and b
,选择切割点为a + factor*(b-a)
。当您在点 (100*factor, 100*factor) 处切割初始 100x100 矩形时,两个区域的面积将为 (100*100)/2,因此收敛速度会更快。