嗨,我正在解决这个问题,但我有点坚持选择哪一个是正确的答案。所以,我试图得到你们的帮助。
以下是代码:
for (int i=0; i < n; i++) { // loop1 from 0 to n-1
int total = 0;
for (int j=0; j < n; j++) // loop2 from 0 to n-1
for (int k=0; k <= j; k++) // loop3 from 0 to j
total += first[k];
if (second[i] == total) count++;
} return count;
从上面的代码中,loop1和loop2有n次n,其具有n ^ 2个复杂的处理时间
但问题是loop3,我真的不想说n次也是因为循环的限制是j而不是n。
在最糟糕的时间内,我应该如何总结复杂性?对于loop3,它会是((n + 1)(n + 2))/ 2吗?或((n + 1)(n + 2))/ 2表示loop2和loop3
我的最终答案是这样的
第一种情况:n * n *(((n + 1)(n + 2))/ 2)= O(n ^ 4)
第二种情况:n *(((n + 1)(n + 2))/ 2)= O(n ^ 3)
哪一个是正确的?或者我错了两个?
P.S。请注意,loop3是0到j,而不是0到j-1
答案 0 :(得分:1)
从问题中不清楚你关注的是什么不同的案例。在讨论Big O时,我们只关心复杂性中最重要的部分。根据第二个循环,第三个循环中的 j 可以达到 n 。因此,在计算总复杂度时,用 n 替换它是没有问题的。由于共有3个循环,所有循环都直接或间接依赖于 n ,因此复杂度为O(n^3)
。此外,您可以忽略常量,因此n-1
可以简单地视为n
。
见