O (N^2)
Из-за взаимозависимостью j
и k
(в k<j
) вы не можете рассмотреть loop2 и Loop3 отдельно. Пусть N=2^m
, для простоты расчета. Итак, j
будет 1, 2, 4, ..., 2^(m-1), а loop3 выполняет j
раз каждый раз, когда он будет достигнут. Таким образом, комбинированный loop2 и Loop3 выполняет
1 + 2 + 4 + ... + 2^(m-1)
= 2^0 + 2^1 + 2^2 + ... + 2^(m-1)
Это Geometric Progression, и равно 2^m - 1 = N - 1
, который является O (N). Теперь, бросая в loop1, O (N), и получим O (N^2).
Edit:
Вот Perl код, который я побежал, чтобы проверить эту
print "N\tExpected\tCounted\n";
for my $N (10, 100, 1024, 8192)
{
my $count = 0;
for(my $i=$N; $i>0; $i--)
{
for(my $j=1; $j<$N; $j*=2)
{
for(my $k=0; $k<$j; $k++)
{
$count++;
}
}
}
my $expected_count = $N*$N - $N;
print "$N\t$expected_count\t$count\n";
}
И вывод:
N Expected Counted
10 90 150
100 9900 12700
1024 1047552 1047552
8192 67100672 67100672
Обратите внимание, что мы не попали в ожидаемой точности, если только N=2^m
,
На самом деле ваша сложность - O (N * log^2 N). Вы правы со второй сложностью цикла, а третья - тождественной. –