【问题标题】:Performance of binary search algorithm when there are many duplicates有很多重复项时的二分查找算法的性能
【发布时间】:2015-01-15 04:49:29
【问题描述】:

http://katemats.com/interview-questions/ 说:

  • 给定一个排序数组,您想找到数字 N。如何尽快进行搜索(而不仅仅是遍历每个元素)?

    • 如果数组中有很多重复项,您的算法性能会如何变化?

我对第一个问题的回答是二分查找,也就是 O(log(n)),其中 n 是数组中的元素个数。

根据this answer,在“元素 K 不存在于 A 中且小于 A 中的所有元素”的最坏情况下,“我们有最多 log_2(n-1) 步”。

我认为第二个问题的答案是它不会影响性能。这是正确的吗?

【问题讨论】:

    标签: algorithm language-agnostic binary-search


    【解决方案1】:

    如果您说的是最坏情况/大 O,那么您是正确的 - log(n) 是您的界限。但是,如果您的数据分布相当均匀(或者您可以映射到该分布),则插入选择分区的位置可以获得 log(log(n)) 行为。当您也进行插值时,您还可以摆脱寻找最终元素之一的更糟糕的情况(当然还有新的病态情况)。

    对于许多重复项,您可能愿意在下一次探测时大步远离直接中心。重复次数越多,正确猜测的余地就越大。虽然总是选择中途点可以让您及时到达那里,但有根据的猜测可能会让您获得一些非常出色的平均行为。

    当我面试时,我喜欢听到这些答案,包括对书本知识和理论的了解,以及可以做些什么来专门针对给定的情况。通常这些常数因素真的很有帮助(查看快速排序及其分区选择方案)。

    【讨论】:

      【解决方案2】:

      我认为重复并不重要。

      你正在寻找一个特定的数字 N,重要的是当前节点是否与 N 匹配。

      如果我在列表 1-2-3-4-5-6 中查找数字 1,则性能与搜索列表 1-9-9-9-9-9 相同。

      如果数字 N 重复,那么您将有机会早几步找到它。例如,如果对列表 1-1-1-1-1-9 进行了相同的搜索。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-22
        • 1970-01-01
        • 1970-01-01
        • 2020-08-07
        • 2023-03-05
        • 2022-01-21
        相关资源
        最近更新 更多