代码的复杂性= n ^ 2?

时间:2013-05-01 11:16:26

标签: java complexity-theory

以下代码的复杂性是什么:

int data[] = { /* some numbers here */ };
n = data.length;

int lessThanCounter = 0;
for (int i=0; i<n; i++)
    for (int j=n-1; j>i; j--)
        if (data[i]<data[j]) lessThanCounter++;

根据我的计算,它是O(n ^ 2) - 这是正确的吗?

4 个答案:

答案 0 :(得分:2)

由于您的外循环执行n次,因此第一个乘数为n

内循环执行n-1n-2 ... 0,大致相当于(n-1)/2

因此执行n * (n-1)/2次,因此O(n^2)O(n^2/2)取决于您所教的大O的风格。

注意:我将O(n^2/2)添加到许多没有正确理解Big Oh的教育机构中,因此希望他们的学生以这种方式评估泡泡排序的Big-Oh。我为这个明显误导性的错误道歉。

NBB:如果不清楚O(n^2/2) 错误,我发布时就知道错了。但是,如果您的老师希望您将其放在答案中,那么就这样做。你不可能在试图解释它为什么是错误的时候取得进展。

答案 1 :(得分:1)

是的,这是正确的。内循环的主体在外循环的第一次迭代中执行n-1次,在第二次迭代中执行n-2次,依此类推,直到迭代n迭代n-n = 0n-1 + n-2 + ... + 0 = (n-1)*n/2 = (n^2-n)/2次迭代1}}次。所以它总共执行了O(n^2)次,这确实在{{1}}。

答案 2 :(得分:0)

要证明算法的运行时间为O(n ^ 2), 在第一个循环中

for(int i=0:i<n;i++)

我从0到n和第二个循环:

for(int j = n-1;j>i;j--)

j从n-1 downto i开始

data[i]data[j]lessThanCounter++的比较均以恒定时间执行O(1)

因此你有这个总结:

 $\sum_0^{n}(\sum_{n-1}^{i})1$.

通过消除你得到的内部求和:i + n + 2

你现在有(n = i + 2)

的和(i = 0到n-1)

然后将(n = 2)+和(i = 0到n-1)的i =(n + 1)*(n + 2)+ n(n +)求和(i = 0到n-1) 1)/ 2

显然是O(n ^ 2)

希望它有所帮助!

答案 3 :(得分:-3)

你是绝对正确的,循环内循环是O(n ^ 2)