我曾经在面试中问过这样一个问题:
我在考虑一个正整数 n,提出一个算法,可以在 O (lgn)查询中猜测它。每个查询都是您选择的数字,我将回答“低”、“高”或“正确”
这个问题可以通过修改二进制搜索来解决,在这种搜索中,您列出两个幂,直到找到一个超过 n 的幂,然后在这个范围内运行标准的二进制搜索。我觉得这个很酷的地方在于你可以在一个无限的空间里寻找一个特定的数字,而不仅仅是靠蛮力。
不过,我的问题是对这个问题稍作修改。假设我在0和1之间选择一个 arbitrary rational number,而不是选择一个正整数。我的问题是: 你能用什么算法最有效地确定我选择了哪个有理数?
现在,我所知道的最好的解决方案可以通过隐式遍历 Stern-Brocot 树(一个遍历所有有理数的二叉查找树)在最多 o (q)的时间内找到 p/q。然而,我希望得到一个更接近于整数情况下的运行时,比如 O (lg (p + q))或 O (lg pq)。有人知道如何获得这种运行时吗?
我最初考虑使用区间[0,1]的标准二进制搜索,但是这只能找到具有非重复二进制表示的有理数,而且几乎没有找到所有的有理数。我也想过用其他方法来列举这些有理数,但是我似乎找不到一种方法来搜索这个空间,只是给出了更大的/相等的/更小的比较。