你能找到这段代码的时间复杂度吗?

时间:2018-03-07 15:57:28

标签: time-complexity

我试图找到,但我的回答与文中的解决方案不符。

有人能解释我找时间的复杂性吗?

for (int i=0; i<n; i++)
        for (int j=i; j< i*i; j++)
            if (j%i == 0)
            {
                for (int k=0; k<j; k++)
                    printf("*");
            }

2 个答案:

答案 0 :(得分:0)

有人能解释我如何找到时间复杂度吗?

实验数据不支持已引用的 O( N^5 ) 声明。 enter image description here a live-GUI for observed data

低规模实验的最佳开端:

for (         int aScaleOfBigO_N  =          1;
                  aScaleOfBigO_N <  2147483646;
                  aScaleOfBigO_N *=          2
                  ){        
    printf( "START: running experiment for a scale of N( %d ) produces this:\n",
                  aScaleOfBigO_N
                  );
    int letsAlsoExplicitlyCountTheVisits = 0;
    for (     int i = 0; i <  aScaleOfBigO_N; i++ )
        for ( int j = i; j <  i*i;            j++ )
            if (  j % i == 0 )
            {
                for ( int k = 0; k < j; k++ )
                {
                 // printf( "*" );                       // avoid devastating UI
                    letsAlsoExplicitlyCountTheVisits++;
                }
            }
    printf( "  END: running experiment visits this many( %d ) times the code\n",
                   letsAlsoExplicitlyCountTheVisits
                   );
}

收集了一些相当大量的数据点( N, countedVisits )后,您的下一步可能是拟合观察到的数据点,并制定 {的最佳匹配 O( f(N) ) 函数{1}}

这可以这么简单。

N

Experimental data show about this algorithm time-complexity behaviour in-vivo:

答案 1 :(得分:0)

  • f(n)为从外部循环汇总的操作数
  • g(n)为在第一个内循环级别聚合的操作数。
  • h(n)为在第三(最内层)循环级别执行的操作数。

看最内圈

for (int k=0; k<j; k++)
   printf("*");

我们可以说h(j) = j

现在,由于jii*i不等,以下i值满足i%j = 0,即i是一个倍数j

j = 1.i
j = 2.i
j = 3.i
...
j = (i-1).i

所以

g(i) = sum(j=i, j<i^2, h(j) if j%i=0, else 0)
     = h(i) + h(2.i) + ... + h((i-1).i)
     = i + 2.i + ... + (i-1).i
     = i.(1 + 2 + ... + i-1) = i.i.(i-1)/2
     = 0.5i^3   // dropped the term -0.5i^2 dominated by i^3 as i -> +Inf

=> f(n) = sum(i=0, i<n, g(i))
        = sum(i=0, i<n, 0.5i^3)
       <= sum(i=0, i<n, 0.5n^3)
       <= 0.5n^4

=> f(n) = O(n^4)