algorithm - 这个算法的 Big oh 是 n^3 而不是 n^2

标签 algorithm big-o

def triangles(A):
  n = len(A)
  result = 0
  for x in xrange(n):
    z=x+2
    for y in xrange(x + 1, n):
      while (z < n and A[x] + A[y] > A[z]):
        z += 1
      result += z - y - 1
  return result

这是 codility ( https://codility.com/media/train/13-CaterpillarMethod.pdf ) 中的解决方案示例

在手册中,他们声称这个算法的大O是O(N^2)

我认为 big-Oh 是 O(N^3),因为最坏情况的迭代将是

(n-1)(n-2) + (n-2)(n-3) + ..... + 1*0

所以我认为它的大 O 将是 O(N^3)。

谁能解释为什么这个算法的大 O 是 O(N^2)?

我说的对吗?

最佳答案

while循环 z对于 <n 的每次执行,累积起来只会运行一次(for 次)循环 y , 自 z仅在 for外部范围内重置循环 y .因此,“内部范围”的粗略上限循环计数是沿着 n*(n+n) 行的。 (在 O(n^2) 中)而不是 n*n*n . W.r.t.计算复杂度,我们不妨考虑while循环 z作为 for 的循环 parallell循环 y ,而不是一个 嵌套for 中循环 y .

即,与例如相同的复杂性:

def triangles(A):
  n = len(A)
  result = 0
  for x in xrange(n):
    z=x+2
    while (z < n)
      z += 1
    for y in xrange(x + 1, n):
      ...
  return result

关于algorithm - 这个算法的 Big oh 是 n^3 而不是 n^2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38086293/

相关文章:

algorithm - 对矩形矩阵的分而治之

java - 在 mapreduce 中随机播放大数据文件

algorithm - 寻找在不同商店购买商品的最便宜方式,但商店收取一次性费用

java - (c^k) 的大 O 表示法

c++ - 递归算法的复杂性

algorithm - 最大非段总和

java - 如何衡量该算法的时间复杂度(Big-O)?

algorithm - 哪个更好 : O(n log n) or O(n^2)

algorithm - 大O运行时效率疑惑

algorithm - 以下代码 : 的总运行时间是多少