此算法的大O运行时间?

时间:2014-04-16 01:42:28

标签: algorithm big-o time-complexity

这是伪代码:

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行......

所有的帮助都表示赞赏,提前谢谢。

3 个答案:

答案 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的步骤进行操作:

enter image description here

答案 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)