Algorithm 二元搜索的最优性

Algorithm 二元搜索的最优性,algorithm,language-agnostic,lower-bound,Algorithm,Language Agnostic,Lower Bound,这可能是一个愚蠢的问题,但有人知道二进制搜索是渐近最优的证明吗?也就是说,如果给我们一个元素的排序列表,其中对这些对象唯一允许的操作是比较,您如何证明搜索不能在o(lgn)中完成?(顺便说一句,这是lg n的little-o。)注意,我将其限制在唯一允许操作的元素是比较的元素上,因为如果允许您对数据进行更复杂的操作(例如,请参见插值搜索),有一些众所周知的算法可以超出预期的o(lg n)。逻辑很简单。假设我们有一个由n不同排序元素组成的数组 一个比较有两种可能的结果(第一个元素更小或更大)。因此

这可能是一个愚蠢的问题,但有人知道二进制搜索是渐近最优的证明吗?也就是说,如果给我们一个元素的排序列表,其中对这些对象唯一允许的操作是比较,您如何证明搜索不能在o(lgn)中完成?(顺便说一句,这是lg n的little-o。)注意,我将其限制在唯一允许操作的元素是比较的元素上,因为如果允许您对数据进行更复杂的操作(例如,请参见插值搜索),有一些众所周知的算法可以超出预期的o(lg n)。

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

  • 一个比较有两种可能的结果(第一个元素更小或更大)。因此,如果一次比较就足够了,
    n=log(2,n)

    来自:

    • 可能结果的数量应至少为O(n)
    • 您可以通过“决策树”的节点来表示算法所做的决策:如果项目比较大,则它继续进行,如果不是,则相反。树的节点是算法的状态,叶子是结果。所以树中至少应该有O(n)个节点
    • O(n)节点上的每个树至少有O(logn)个级别

      • 正如尼基塔所描述的,不可能有比O(logn)更好的东西

        即使您允许做一些额外的操作,这仍然是不够的-我相信有可能准备元素序列,其中插值搜索的性能比二进制搜索差

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

        我们考虑平均性能,而不是最坏情况。
      • 每个可能的传入数据集的概率是不均匀的

      • 所以答案是——这完全取决于我们对传入数据集的额外知识。

        您也假设对所有元素的访问都是一致的?否则见@Bernard-不,不是家庭作业。我有我的标准。:-)这正是困扰我一段时间的问题。@Paul-我正在寻找一种算法,它可以最大限度地减少比较次数,因此每个元素的访问时间应该是无关的。另外,据我所知,斐波那契搜索也是O(lg n),它渐近地等价于二进制搜索。数组中是否存在重复项?我认为这无关紧要,但可以肯定,假设允许重复。看起来你在这里证明了上界。如果有重复的元素,这会改变吗?这真的可以作为下界证明吗?您已经正确地表明您可以在O(lg n)时间内查找元素,但是您排除了渐进更快算法的可能性吗?@templatetypedef我添加了最后一步,现在应该清楚了。@Paul“没有重复元素”是原始问题的特例。如果对于特殊情况没有更好的解决方案,那么对于整个问题也没有更好的解决方案。这非常聪明-我没有想到将算法的状态表示为树。这很有道理;非常感谢@模板:heapsort/mergesort的AFAIK最优性也以类似的方式得到了证明。我能否建议更精确一点:假设所有n个元素都是不同的,那么就有n+1个可能的结果(因为目标值可能不存在),所以就有n+1个叶(不是节点)。n+1叶上的树至少有log2(n+1)级。也许你说“O(n)节点上的每棵树至少有O(logn)个级别”是正确的,但我发现很难对O()进行推理,因为它位于等式的两边,就像这样…:)有了更多的知识,几乎什么都有了。如果按概率对元素进行排序,并且概率是几何分布,那么即使是线性搜索也可以在O(1)时间内执行!顺便说一句,有时候这是个好主意。