Подтвердить что ты не робот

Небольшое пояснение Big-O

Действительно ли O(log(log(n))) просто O(log(n)), когда дело доходит до временной сложности?
Согласны ли вы с тем, что эта функция g() имеет временную сложность O(log(log(n)))?

int f(int n) {
    if (n <= 1)
        return 0;
    return f(n/2) + 1;
}

int g(int n) {
    int m = f(f(n));
    int i;
    int x = 0;
    for (i = 0; i < m; i++) {
        x += i * i;
    }
    return m;
}
4b9b3361

Ответ 1

Функция f(n) вычисляет логарифм в базе 2 of n путем многократного деления на 2. Он выполняет итерацию log 2 (n) раз.

Вызов его по собственному результату действительно вернет log 2 (log 2 (n)) для дополнительного log 2 (log 2 (n)). До сих пор сложность O (log (N)) + O (log (log (N)). Первый член доминирует во втором, общая сложность O (log (N)).

Конечный цикл выполняет итерацию log 2 (log 2 (n)), временная сложность этой последней фазы O (log (log (N)), пренебрежимо мало перед начальной фазой.

Обратите внимание, что поскольку x не используется до конца функции g, вычисление не требуется, и компилятор может оптимизировать этот цикл до нуля.

Общая временная сложность выглядит как O (log (N)), которая не совпадает с O (log (log (N)).

Ответ 2

Похоже, это log(n) + log(log n) + log(log n).

В порядке: первая рекурсия f() плюс вторая рекурсия f() и цикл for, поэтому конечная сложность O (log n), поскольку члены младшего порядка игнорируются.

Ответ 3

int f(int n) {
    if (n<=1)
        return 0;
    return f(n/2) + 1;
} 

Имеет временную сложность порядка O(log2(n)). Здесь 2 - основание логрифма.

int g(int n) {
    int m = f(f(n)); // O(log2(log2(n))
    int i, x=0;
    for( i = 0; i < m; i++) {
        x += i*i;
    }
    // This for loop will take O(log2(log2(n))
   return m;
}

Следовательно, общая временная сложность заданной функции: T(n) = t1 + t2 + t3

Но здесь O(log2(n)) доминирует над O(log2(log2(n)).

Следовательно, временная сложность заданной функции log2(n).

Прочтите Что такое простое английское объяснение" Big O " нотация? один раз.

Ответ 4

Время, затрачиваемое на алгоритмы O (log n), зависит только линейно от числа цифр n. Поэтому очень легко масштабировать его.

Предположим, вы хотите вычислить F (100000000), 10 ^ 8th F.... ascci number. Для алгоритма O (log n) он будет принимать только 4 раза за время, затрачиваемое на вычисление F (100).

O (log log n) термины могут отображаться в разных местах, но обычно есть два основных маршрута, которые прибудут в эту среду выполнения. Ссылка здесь введите код здесь.