以下功能的时间复杂度是多少?
for(int i = 0; i < a.size; i++) {
for(int j = i; j < a.size; i++) {
//
}
}
我认为它不是大O n ^ 2因为我们没有迭代第二个for循环中的所有元素。我相信时间的复杂性是这样的:
n[ (n) + (n-1) + (n-2) + ... + (n-n) ]
但是当我解决这个公式时,它就出现了
n^2 - n + n^2 - 2n + n^2 - 3n + ... + n^2 - n^2
这根本不正确。有人可以告诉我如何解决这个问题,以及我错在哪里。
答案 0 :(得分:5)
那是O(n^2)
。如果您认为迭代位于i = a.size() - 1
,并且您向后工作(i = a.size() - 2
,i = a.size - 3
等),那么您正在查看以下迭代次数的总和,其中{{1 }}
n = a.size
此系列的总和为1 + 2 + 3 + 4 + ... + n
,即n(n+1)/2
。请注意,big-O表示法忽略常量,并在应用于多项式函数时获取最高的多项式幂。
答案 1 :(得分:2)
它将运行:
1 + 2 + 3 + .. + n
哪个1/2 n(n+1)
给我们O(n^2)
Big-O符号只会保留主导词,也会忽略常量
当且仅当主导词不同时,Big-O仅用于比较使用相同复杂性分析标准的相同问题变体的算法。
如果主导词是相同的,则需要比较Big-Theta或时间复杂度,这将显示出微小的差异。
示例强>
A 的
for i = 1 .. n
for j = i .. n
..
乙
for i = 1 .. n
for j = 1 .. n
..
我们有
Time(A) = 1/2 n(n+1) ~ O(n^2)
Time(B) = n^2 ~ O(n^2)
O(A) = O(B)
T(A) < T(B)
<强>分析强>
想象我们如何得到1 + 2 + 3 + .. n
:
for i = 1 .. n:
print "(1 + "
sum = 0
for j = i .. n:
sum++
print sum") + "
将打印以下内容:
(1+n) + (1+(n-1)) + .. + (1+3) + (1+2) + (1+1) + (1+0)
n+1 + n + n-1 + .. + 3 + 2 + 1
1 + 2 + 3 + .. + n + n+1
1/2 n(n+1) + (n+1)
1/2 n^2 + 1/2 n + n + 1
1/2 n^2 + 3/2 n + 1
答案 2 :(得分:1)
是的,迭代次数严格小于n^2
,但它仍然是Θ(n^2)
。对于任何n^k
,它最终都会大于k<2
,对于任何n^k
,它最终都会小于k>2
。
(作为旁注,计算机科学家经常说big-O,当他们真正意味着大-theta(Θ)。从技术上讲,几乎所有你看过的算法都有O(n!)
运行时间在技术上是正确的;所有合理的算法运行时间不会比 n!
快得多。但如果它的也是那么复杂度为O(n!)
并不是真的有用。 O(n log n)
,所以通过某种Gricean格言,我们假设有人说算法的复杂性是O(f(x))
f(x)
尽可能小。)