【问题标题】:time complexity of non-inplace binary search非就地二分查找的时间复杂度
【发布时间】:2015-05-13 16:21:34
【问题描述】:

假设在大约长度为 n/2 的子数组上调用二进制搜索,并且在一个级别上最多有三个比较,我想出T(n) = T(n/2) + 3 作为递归关系。

但是:当我递归调用 binarySearch 时,切片的成本不是与 n 成正比吗?因此,解决方案不是T(n) = nlogn 而不是logn

这让我很困惑。我检查了 Python 的成本模型,并且(正如预期的那样)切片的成本与 n 成正比。

【问题讨论】:

  • 您可以在问题中包含代码吗?我认为您是说它执行 O(n) 操作(对数组的一半进行切片),因此您的递归关系是错误的(因此您的二进制搜索是一个糟糕的实现)。
  • 如果你物理地“切片”并复制子数组,那么是的..但通常当我们进行二进制搜索时,没有元素被物理移动......请参阅@AbcAeffchen 的答案以获得更好的解释

标签: big-o time-complexity complexity-theory binary-search


【解决方案1】:

与往常一样,算法的复杂性及其实现可能存在差异。

如果您在递归函数中实现二进制搜索,该函数获取输入数组的一部分的副本,则该数组必须在O(n) 中生成,所以您是对的,这将导致整体复杂性O(n log n)(可能更糟,具体取决于您复制的内容)。

所以你不应该以这种方式实现它。仅交出对数组的引用以及最小和最大索引值,以将搜索限制在您需要的数组部分。 (或类似的东西)

【讨论】:

    【解决方案2】:

    看看Master Theorem

    T(n) = T(n/2) + 3
    log a / log b = 1
    d = 1
    

    这样

    O(n) = O(log n)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      相关资源
      最近更新 更多