特定算法的复杂性与 3 for?

Complexity of an specific algorithm with 3 for?

本文关键字:for 复杂性 算法      更新时间:2023-10-16

我有一个问题,如果你能告诉我我做得对不对! 我们有这个算法

for(i=0;i<n*n;i++){
for(j=i;j<n;j++)
for(k=0;j<=9;k++)
c+=2;

我想找到这个的复杂性,如果你能告诉我我做得对

sum 0,n*n (sum i,n(20))= sum 0,n*n ((n-i+1)*20) = sum 0,n*n (n) - sum 0,n*n (i) + n*n*20
=nn20 + (nn-0+1)(n) -sum 0,n*n (i)
=n*n*n+nn20 -sum 0,n*n (i)

所以O(n*n*n)

这是对的吗?

复杂度:

for(i=0;i<n*n;i++)
for(j=i;j<n;j++)
for(k=0;k<=9;k++)
c+=2;

从内部循环开始:

for(k=0;k<=9;k++)-> 10,所以常数:O(1).

for(i=0;i<n*n;i++)O(n²),但棘手

for(j=i;j<n;j++)丢弃任何值i >= n

所以它变成了

for(i=0;i<n;i++)
for(j=i;j<n;j++)
for(k=0;k<=9;k++)
c+=2;
for(i=n;i<n*n;i++) {}

最后一个循环for(i=n;i<n*n;i++)O(n²)(但由于编译器可能会丢弃no-op(

  • for(i=0;i<n;i++)O(n)
  • for(j=i;j<n;j++)O(n)(因为O(n/2)O(n)(

所以最终结果O(n²) + O(n²)如此O(n²).

语句

c+=2;

被称为确切的

10 (n + n-1 + n-2 + ... + 1) = 5n² + 5n = 10 * sum i=1,n (i)

次。这是 O(n²(。循环

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

迭代n*n次,但如果迭代i >= n则不执行任何操作。因此,外循环有效地以恒定的复杂性迭代n * (n-1)次(O(1(,它什么都不做(。

循环

for(int j = i; j < n; j++)

迭代n - i次。和循环

for(int k=0; k <= 9;k++)

迭代 10 次。

这是

10 (n + n-1 + n-2 + ... + 1) = 5n² + 5n = 10 * sum i=1,n (i)

使用此代码,您可以确认对c += 2的调用次数:

#include <iostream>
int main() {
for (int n = 1; n < 10; ++n) {
int c = 0;
for(int i = 0; i < n*n; i++)
for(int j = i; j < n; j++)
for(int k=0; k <= 9;k++)
c+=2;
std::cout << c / 2 << " == " << "5*" << n << "*" << n << " + 5*" << n << " : " << std::boolalpha << (c / 2 == 5*n*n + 5*n) << 'n';
}
}

结果:

10 == 5*1*1 + 5*1 : true
30 == 5*2*2 + 5*2 : true
60 == 5*3*3 + 5*3 : true
100 == 5*4*4 + 5*4 : true
150 == 5*5*5 + 5*5 : true
210 == 5*6*6 + 5*6 : true
280 == 5*7*7 + 5*7 : true
360 == 5*8*8 + 5*8 : true
450 == 5*9*9 + 5*9 : true