如何计算以下程序的时间复杂度?
int[] vars = { 2, 4, 5, 6 };
int len = vars.length;
int[] result = new int[len];
for (int i = 0; i < len; i++) {
int value = 1;
for (int k = 0; k < i; k++) {
value = value * vars[k];
}
for (int j = i + 1; j < len; j++) {
value = value * vars[j];
}
result[i] = value;
}
以上如何与以下相同?
for (int i = 0; i < len; i++) {
int value = 1;
for (int j = 0; j < len; j++) {
if(j != i) {
value = value * vars[j];
}
}
result[i] = value;
}
答案 0 :(得分:2)
i
for
循环具有时间复杂度O(n),因为它对数组的每个元素执行一次迭代。对于数组中的每个元素,您再次循环遍历{ - {1}} k
循环中的平均值的一半,以及for
j
循环中的平均值的一半。其中每个都是for
。如果数组中有4个元素,则操作数与n *(n - 1)成比例,但在时间复杂度上,忽略O(n)
等常量。
您的方法将执行的操作数量与其中的元素数量成正比,因此,总体而言,该方法为O(n 2 )。
答案 1 :(得分:1)
对于第一个片段:
对于第二个片段:
答案 2 :(得分:0)
确定复杂性的一般方法是计算迭代次数。 在您的示例中,您有一个外部for循环,其中嵌套了两个循环。注意:我不会写len而是写n。 外循环
for (int i = 0; i < n; i++)
迭代n
- 次。
两个下一个循环的迭代次数实际上比它看起来更容易计算:
第二个循环迭代i
- 次和第三个n-i
次。如果将它们一起添加,则得到n
- 在外循环中进行多次迭代。
最后,如果外部循环执行n
次迭代,并且在每次迭代中,代码循环另外n
次,您将获得n^2
次迭代的结果。在您编写的复杂性理论的传统表示法中,算法的上限为n^2
或位于O(n)
。