【问题标题】:What is the time-complexity in a binary search?二分查找的时间复杂度是多少?
【发布时间】:2020-10-27 03:35:15
【问题描述】:
def binsearch(a):
    if len(a) == 1:
        return a[0]
    else:
        mid = len(a)//2
        min1 = binsearch(a[0:mid])
        min2 = binsearch(a[mid:len(a)])
        if min1 < min2:
            return min1
        else:
            return min2

我试图提出 min1

【问题讨论】:

  • 你是指if min1 &lt; m2这一行,那一行的时间复杂度是多少?还是你问的是整个函数的时间复杂度?
  • @JohnKugelman 特别是一行 :(
  • 什么是a,一个数字列表?
  • @JaeYing 我没有注意到您的函数实际上不是二进制搜索。你的函数是O(n)。而min1 &lt; min2 作为单个表达式是O(1)
  • @JaeYing 它被称为二分搜索,但实际上在每个函数调用中它会进行一次比较并处理大小为n/2 的两部分,两者的总大小均为n。所以基本上它不会像二分搜索那样将处理后的数组的大小减半。

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


【解决方案1】:

如果 min1min2 是数字,并且它们中总是有 2 个(常数),则该特定行(单个比较)上的工作量永远不会改变。因此它的时间复杂度是O(1)

然而,可能会改变的是该行的执行次数!当你有nO(1) 操作时,整体时间复杂度仍然是O(n)

【讨论】:

  • 拼接操作的时间复杂度是多少?是 O(1) 还是 O(n)?根据这一点,这个算法要么是 O(n) 要么是 O(n log N)。
  • @FrankYellin 这个算法构建了一个二叉搜索树。它有N片叶子。和 N-1 个内部节点。只计算内部节点操作,比较min1 &lt; min2,叶子不做比较。所以总复杂度是O(N)。当然,递归函数调用操作在某种程度上摊销了它。切片也在内部节点内部完成。因此,精确的复杂性可能在O(4N) 左右,即O(N)
  • 我想我不确定问题是什么。这个算法的时间复杂度是多少,或者 min1 )。
  • @sabik 是的,如果它是 python 列表,那么切片可能是昂贵的,如果它是一个 numpy 数组,可能不是(因为整个函数不是面向 numpy),那么它的原因是轻量级的。
  • @JaeYing BTW,你的整个函数可以只替换为result = min(a)内置函数调用,实际上它会更有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 2011-02-16
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多