这些程序进行计算Σ= 0
我想弄清楚大O计算。我做了很多研究,但是我遇到了问题。我知道大O是最坏的情况或上限。从我可以想象的程序,一个有两个for循环,一个运行数组的长度,另一个运行到第一个循环的值,直到数组的长度。我认为如果两个都运行数组的全长,那么它将是二次O(N ^ 2)。因为第二个循环只在我想O(NlogN)时运行数组长度的长度。
第二个程序只有一个for循环,因此它是O(N)。
我关门了吗?如果没有,请向我解释我将如何计算。由于这是在作业中,我必须能够在测试中找到这样的东西。
计划1
// assume input array a is not null
public static double q6_1(double[] a, double x)
{
double result = 0;
for (int i=0; i<a.length; i++)
{
double b = 1;
for (int j=0; j<i; j++)
{
b *= x;
}
result += a[i] * b;
}
return result;
}
计划2
// assume input array a is not null
public static double q6_2(double[] a, double x)
{
double result = 0;
for (int i=a.length-1; i>=0; i--)
{
result = result * x + a[i];
}
return result;
}
答案 0 :(得分:2)
我使用N来引用数组a
的长度。
第一个是O(N ^ 2)。内环运行1,2,3,4,...,N - 1次。该总和约为N(N-1)/ 2,即O(N ^ 2)。
第二个是O(N)。它只是遍历数组的长度。
答案 1 :(得分:1)
程序的复杂性基本上是执行的指令数。
当我们谈论上限时,这意味着我们正在考虑最坏情况下的事情,应该由每个程序员考虑。
让n = a.length;
现在回到你的问题,你说第一个程序的时间复杂度应该是O(nlogn)
,这是错误的。当i = a.length-1
时,内循环也将从j = 0 to j = i
迭代。因此,复杂性将是O(n^2)
。
判断第二个程序O(n)
的时间复杂度是正确的。