以下代码的复杂性是什么:
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) - 这是正确的吗?
答案 0 :(得分:2)
由于您的外循环执行n
次,因此第一个乘数为n
。
内循环执行n-1
,n-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 = 0
次n-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)