#c #time-complexity
#c #временная сложность
Вопрос:
Я получаю O(n^2 logn)
в качестве выходных данных следующий код. И все же я не могу понять, почему?
int unknown(int n) {
int i, j, k = 0;
for (i = n / 2; i <= n; i )
for (j = 2; j <= n; j = j * 2)
k = k n / 2;
return k;
}
Комментарии:
1. Что вы имеете в виду, когда «получаете O (n ^ 2 logn) в качестве выходных данных следующего кода?» Кто дает вам этот «результат»?
Ответ №1:
Фиксированная постоянная начальная точка не будет иметь никакого значения для внутреннего цикла с точки зрения сложности.
Начинать с двух вместо одного будет означать на одну итерацию меньше, но соотношение по-прежнему логарифмическое.
Подумайте в терминах того, что происходит при удвоении n
. Это добавляет еще одну итерацию к этому циклу, независимо от того, начинаете ли вы с одного или двух. Следовательно, это O(log N)
сложность.
Однако вы должны иметь в виду, что внешний цикл является O(N)
единым, поскольку количество итераций пропорционально N
. Это делает функцию в целом O(N log N)
, а не O(N2 log N)
то, что вы предполагаете.