这是算法:我认为它的时间复杂度是O(n ^ 2),因为循环中的循环。我该如何解释?
FindSum(array, n, t)
i := 0
found := 0
array := quick_sort(array, 0, n - 1)
while i < n – 2
j = i + 1
k = n - 1
while k > j
sum = array[i] + array[j] + array[k]
if sum == t
found += 1
k -= 1
j += 1
else if sum > t
k -= 1
else
j += 1
答案 0 :(得分:2)
是的,复杂性确实是O(n^2)
。
内部循环在k-j = n-1-(i+1) = n-i-2
到(k-j)/2 = (n-i-2)/2
次迭代之间运行。
总结i
从0到n-2
的所有可能值,为您提供:
T = n-0-2 + n-1-2 + n-2-2 + ... + n-(n-2)-2
= n-2 + n-3 + ... + 0
这是算术级数的总和,它是(n-1)(n-2)/2
(sum of arithmetic progression)的总和,它是二次曲线。注意除以额外的2(对于&#34;最佳&#34;内环的情况)不会改变大O表示法的时间复杂度。