这是伪代码:
Baz(A) {
big = −∞
for i = 1 to length(A)
for j = 1 to length(A) - i + 1
sum = 0
for k = j to j + i - 1
sum = sum + A(k)
if sum > big
big = sum
return big
因此第3行将是O(n)(n是数组的长度,A) 我不确定第4行是什么......我知道它每次运行时减少1,因为我会增加。 如果没有获得第4行,我就无法获得第6行......
所有的帮助都表示赞赏,提前谢谢。
答案 0 :(得分:4)
让我们先了解前两个循环如何工作
for i = 1 to length(A)
for j = 1 to length(A) - i + 1
第一个for循环将从1运行到n(数组A的长度),第二个for循环将取决于i的值。因此,当i = 1秒for循环将运行n次..当我增加到2时,你的第二个for循环将运行(n-1)时间..所以它将持续到1。
所以你的第二个for循环将运行如下:
n + (n - 1) + (n - 2) + (n - 3) + .... + 1 times...
你可以使用以下公式:sum(1到n)= N * (N + 1) / 2
,它给出(N^2 + N)/2
所以我们对这两个循环有大哦
O(n ^ 2)(n平方的大哦)
现在让我们考虑第三个循环...
你的第三个for循环看起来像这样
for k = j to j + i - 1
但实际上这意味着,
for k = 0 to i - 1
(您只是通过添加/减去j
来改变值的范围,但循环运行的次数不会改变,因为差异保持不变)
因此,对于第二个循环的前n次迭代,您的第三个循环将从0到1(i的值)运行,然后对于第二个循环的第一次(n-1)次迭代,它将从0到2(i的值)运行等...... ..
所以你得到:
n + 2(n-1) + 3(n-2) + 4(n-3).....
= n + 2n - 2 + 3n - 6 + 4n - 12 + ....
= n(1 + 2 + 3 + 4....) - (addition of some numbers but this can not be greater than n^2)
= `N(N(N+1)/2)`
= O(N^3)
所以你的时间复杂度将是N ^ 3(n立方体的大哦)
希望这有帮助!
答案 1 :(得分:1)
有条不紊地,您可以按照使用Sigma Notation的步骤进行操作:
答案 2 :(得分:0)
Baz(A):
big = −∞
for i = 1 to length(A)
for j = 1 to length(A) - i + 1
sum = 0
for k = j to j + i - 1
sum = sum + A(k)
if sum > big
big = sum
return big
对于Big-O,您需要寻找最糟糕的情况
找到Big-O的最简单方法是查看算法中最重要的部分,它可以是循环或递归
所以我们这个算法的一部分由循环
组成for i = 1 to length(A)
for j = 1 to length(A) - i + 1
for k = j to j + i - 1
sum = sum + A(k)
我们有,
SUM { SUM { i } for j = 1 to n-i+1 } for i = 1 to n
= 1/6 n (n+1) (n+2)
= (1/6 n^2 + 1/6 n) (n + 2)
= 1/6 n^3 + 2/6 2 n^2 + 1/6 n^2 + 2/6 n
= 1/6 n^3 + 3/6 2 n^2 + 2/6 n
= 1/6 n^3 + 1/2 2 n^2 + 1/3 n
T(n) ~ O(n^3)