我对Big O符号有点熟悉,但是我遇到了一个我无法得到的大O符号的解释。
int foo(int n) {
int p = 1; -------------->c1 x 1
int i = 1; ------------->c1 x 1
while (i < n) { ------------>c2 x n
int j = 1; ------------------->c1 x (n - 1)
while (j < i) { ----------->c2 x ((1/2)n^2 - (3/2)n + 2)
p = p * j; -------------->(c1 + c3) x ((1/2)n^2 - (3/2)n + 1)
j = j + 1; -------------->(c1 + c4) x ((1/2)n^2 - (3/2)n + 1)
}
i = i + 1; ------------------->(c1 + c4) x (n - 1)
}
return p; ---------------------->c5 x 1
}
(c1 + 1/2 * c2 + 1/2 * c3 + 1/2 * c4)n ^ 2 +( - c1 - 1/2 * c2 - 3/2 * c3 - 1/2 * c4) n +(2 * c1 + 2 * c2 + c3 + c5)
我知道这个算法将会变成n ^ 2,因为嵌套循环以及结果等式中常数和低阶项的减少。然而,我不明白的是如何得出“x”的rhs例如((1/2)n ^ 2 - (3/2)n + 1)。任何对此的见解都将非常受欢迎,我真的需要了解Big O符号的核心概念。感谢。
答案 0 :(得分:1)
外循环执行n-1
次:
sum(1, i=1;n-1) = n-1.
对于每个i-1
,内循环执行i
次,共计:
sum(i-1, i=1;n-1)
= sum(i, i=1;n-1) - sum(1, i=1;n-1)
= (n-1)*((n-1)+1)/2 - (n-1)
= (n-1)*n/2 - n+1
= (1/2)n^2-(3/2)n+1
使用众所周知的Euler公式,得出从1到n
的数字之和:sum(i, i=1;n) = n*(n+1)/2
答案 1 :(得分:1)
循环有n-1次迭代,而(i Innner循环将执行0,1,2,3,... n-2次 - 这是算术级数,其和为(n-2)(n-1)/ 2 =(1/2) n ^ 2 - (3/2)n + 1