二元搜索的最优性

时间:2010-12-31 17:42:55

标签: algorithm language-agnostic lower-bound

这可能是一个愚蠢的问题,但是有没有人知道二进制搜索是渐近最优的证据?也就是说,如果给出一个排序的元素列表,其中对这些对象的唯一允许操作是比较,那么如何证明搜索不能在o(lg n)中完成? (顺便说一下,这只是lg n的一小部分。)请注意,我将此限制为只允许操作的唯一操作的元素,因为有一些众所周知的算法可以在期望值上击败O(lg n)如果你被允许对数据进行更复杂的操作(例如,参见插值搜索)。

3 个答案:

答案 0 :(得分:4)

来自here

  • 可能的结果数量应至少为O(n)。
  • 您可以通过“决策树”的节点来表示算法所做的决策:如果项目比较大,那么它就会继续进行,如果不是,那么它就是另一种方式。树的节点是算法的状态,叶子是结果。所以树中至少应该有O(n)个节点。
  • O(n)节点上的每棵树至少具有O(log N)级别。

答案 1 :(得分:1)

逻辑很简单。假设我们有n个不同的排序元素数组。

  1. 1个比较有2种可能的结果(第一个元素更小或更大)。因此,如果一个比较足够,n <= 2。否则,如果我们有3个元素(a, b, c)并且我们的算法有2个可能的结果,则永远不会选择3个元素中的一个。
  2. 2次比较有4种可能的结果。因此,如果2次比较就足够了,n <= 4
  3. 同样,k比较足够n应为n <= 2^k
  4. 反转最后一个不等式,你将得到对数:k >= log(2, n)

答案 2 :(得分:1)

正如Nikita所描述的那样总是比O(log n)更好。

即使您允许进行一些额外的操作,它仍然不够 - 我确信可以准备元素序列,其中插值搜索将比二分搜索更糟糕。

我们可以说插值搜索更好只是因为:

  1. 我们考虑平均表现,而不是最坏情况。
  2. 每个可能的传入数据集的概率是不均匀的。
  3. 所以答案是 - 这完全取决于我们对传入数据集的额外了解。