这个算法的大哦是n ^ 3而不是n ^ 2

时间:2016-06-28 21:06:40

标签: 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(N ^ 2)

Bout我认为大哦是O(N ^ 3),因为最坏情况的迭代将是

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

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

有人可以解释为什么这个算法的大哦是O(N ^ 2)?

或者我是对的?

2 个答案:

答案 0 :(得分:3)

对于while循环的每次执行,z循环<n将仅累计运行一次for次) y,因为z仅在for y循环的范围内重置。因此,粗略的上限循环计数是&#34;内部范围&#34;在第n*(n+n)行(位于O(n^2))而不是n*n*n。 W.r.t.计算复杂度时,我们不妨将while循环z作为循环 parallell 考虑for循环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 循环中。

即,与例如:

相同的复杂性
{{1}}

答案 1 :(得分:0)

对于x的每个值,z只能增加n次。一旦z等于n,则在x再次增加之前,不可能进行内循环的迭代。因此n的{​​{1}}值与内循环的x次迭代会产生n