【问题标题】:How the time complexity O(n) is calculated?如何计算时间复杂度 O(n)?
【发布时间】:2020-03-03 14:54:27
【问题描述】:

让我们假设以下代码 (Python)- 数组中的领导者

def goldenLeader(A):
    n = len(A)
    size=0
    for k in xrange(n):
       if (size == 0): size += 1
          value = A[k] else:
       if (value != A[k]): size -= 1
       else:
         size += 1
    candidate = -1 if (size > 0):
    candidate = value leader = -1
    count = 0
    for k in xrange(n):
        if (A[k] == candidate): count += 1
    if(count>n//2): leader = candidate
    return leader

所以既然我们要遍历数组A两次,时间复杂度应该是O(n + n)

但是提到时间复杂度是O(n)

怎么会?

【问题讨论】:

  • O(n+n) == O(2n) == O(n)。 Big-O 符号“隐藏”乘法常数;我推荐reading up 了解它的工作原理。
  • 应该注意 O(n) 和所有其他 O 都是集合,而不是数字。更好的表达方式是 O(n+n) ∈ O(n)。
  • @chepner 如果 Big-O 表示法“隐藏”乘法常数;如果 m>n,那么 O(m+n) 应该是 O(m)。
  • @manishkumar m+n 是任意的。 O(m)==O(n) 在你的例子中,即使 m>n,就大 O 而言。
  • 图算法的运行时间往往有这样一个“分裂”的输入大小,以强调图的密度如何影响运行时间。比较 Dijkstra 的单源最短路径算法 (O(m + n lg n)),它对图中的边数敏感,而 Floyd-Warshall 算法 (O(n^3)) 则不敏感。

标签: python arrays python-3.x performance time-complexity


【解决方案1】:

O 符号只关心n 的顺序(换句话说,n 的幂)。因此,任何n 的 1 次方都被视为O(n),例如O(n)O(2n)O(n+1) 等。

同样,O(n^2)O(n^2+2n) 等都被视为O(n^2)

【讨论】:

  • 感谢您的简短回答。嗨,窥视!!!阅读更多here
  • "换句话说,n的幂":它关心的更多,每个非常数因素都是相关的,例如思考O(n log n) 不等于 O(n)
  • @walnut 当然,但请注意我没有提到那个案例。 O(n*logn)O(n+logn) 不同。 O(n+logn) O(n)
猜你喜欢
  • 1970-01-01
  • 2015-05-25
  • 2015-06-12
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
相关资源
最近更新 更多