Редактировать:
Теперь я заметил порядок петель: i
до j
.
В этом случае для данного i
значение j
отличается от i
до n
и (n/i)
успешных условий if.
Таким образом, программа будет вызывать самый внутренний цикл
n/1 +n/2+n/3+..+n/n
раз.Это сумма гармонического ряда , она сходится к n*ln(n)
Таким образом, внутренний цикл будет выполнен n*log^2(n)
раз.
Как вы писали, два внешних цикла обеспечиваютO(n^2)
сложность, поэтому общая сложность равна O(n^2 + n*log^2(n))
, первый член заменяет второй, цикл, и, наконец, общая сложность является квадратичной.
int tally=0;
for (int i = 1; i < n; i ++)
{
// N TIMES
for (int j = i; j < n; j ++)
{
//N*N/2 TIMES
if (j % i == 0)
{
//NlogN TIMES
for (int k = 1; k < n; k *= 2)
{
//N*logN*logN
tally++;
}
}
}
}
Старый ответ (неправильный)
Эта сложность связана с суммой sigma0 (n) функции (число делителей) и представлена в виде последовательность A006218 ( проблема делителей Дирихле )
Мы видим, что аппроксимация суммы делителей для значений до n равна
n * ( log(n) + 2*gamma - 1 ) + O(sqrt(n))
, поэтому среднеечисло успешных условий if для счетчика цикла j
равно ~log(j)