我试图找到,但我的回答与文中的解决方案不符。
有人能解释我找时间的复杂性吗?
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("*");
}
答案 0 :(得分:0)
低规模实验的最佳开端:
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
。
现在,由于j
从i
到i*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)