给出一段代码的大O计算

时间:2016-09-27 05:47:02

标签: algorithm big-o

这些程序进行计算Σ= 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;
}

2 个答案:

答案 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)的时间复杂度是正确的。