可能重复:
Find existence of number in a sorted list in constant time? (Interview question)
首先,我不确定这是否是真正的面试问题。我在一个声称这是Google面试问题的网站上发现了这个问题。话虽如此,这似乎很有趣,这就是我觉得把它放在这里的原因。
几乎所有人都在那里。我们给出了N个数量的排序列表,其范围超过M,其中M> N,N足够大以跨越多个磁盘。
我们需要在O(logN)中找到或确定给定数字的不存在。对于较小的数据集(二进制搜索),这是直截了当的。对于多个磁盘上的数据集,这似乎要困难得多。它还说O(1)解决方案有额外的分数。有任何想法吗?
我找到了问题here。
答案 0 :(得分:0)
我相信“比O(logN)更快”的解决方案是并行搜索每个磁盘。由于数据已经排序,您可以通过查看磁盘的2个端点来了解我们感兴趣的数字是否可能在其上。然后我们二进制搜索这个磁盘的数字,给我们一个O(log(N / D))解决方案,其中D是磁盘数。
鉴于问题目前是如何表达的,没有恒定的时间解决方案。我只能想象作者在发布问题时遗漏了一些细节。
答案 1 :(得分:0)
由于我们知道数字(M)的范围,我们可以执行插值二进制搜索。而不是将搜索范围平分1/2,将其平分为N /(HI - LO)。结果仍然是O(log N)但具有较低的常数。如果我们知道数据中没有重复项,这种技术效果会更好,而且问题似乎暗示可能是这种情况,但它并不是确定的。
例如,请参阅此博客:Faster than Binary Search