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)?
或者我是对的?
答案 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
。