Математические отношения между классами Big-Oh

53
4

В моем учебнике описывается соотношение следующим образом:

Существует очень хорошая математическая интуиция, которая также описывает эти классы. Предположим, что у нас есть алгоритм, который имеет время выполнения N0 при задании ввода размера n и время выполнения N1 на входе размера 2n. Мы можем характеризовать темпы роста в терминах взаимосвязи между N0 и N1:

Big-Oh      Relationship

O(log n) N1 ≈ N0 + c
O(n) N1 ≈ 2N0
O(n²) N1 ≈ 4N0
O(2ⁿ) N1 ≈ (N0)²

Почему это?

спросил(а) 2020-03-27T17:31:00+03:00 2 месяца назад
1
Решение
65

Это потому, что если f(n) находится в O(g(n)) то его можно рассматривать как действующее как k * g(n) для некоторого k.

Так, например, если f(n) = O(log(n)) то оно действует как k log(n), и теперь f(2n) ≈ k log(2n) = k (log(2) + log(n)) = k log(2) + k log(n) ≈ k log(2) + f(n) и это ваше искомое уравнение с c = k log(2).


Обратите внимание, что это только грубая интуиция. Примером того, где он ломается, является то, что f(n) = (2 + sin(n)) log(n) = O(log(n)). Колебательный бит 2 + sin(n) означает, что f(2n)-f(n) может быть в основном чем угодно.

Я лично считаю, что такая грубая интуиция вводит в заблуждение и, следовательно, хуже, чем бесполезно. Другие считают это очень полезным. Решите сами, сколько веса вы его дадите.

ответил(а) 2020-03-27T17:45:20.627890+03:00 2 месяца назад
53

Поскольку O(f(n)) ~ k * f(n) (почти по определению), вы хотите посмотреть, что происходит, когда вы ставите 2n в n. В каждом случае:

N1 ≈ k*log 2n = k*(log 2 + log n) = k*log n + k*log 2 ≈ N0 + c where c = k*log 2

N1 ≈ k*(2n) = 2*k*n ≈ 2N0

N1 ≈ k*(2n)^2 = 4*k*n^2 ≈ 4N0

N1 ≈ k*2^(2n) = k*(2^n)^2 ≈ N0*2^n ≈ N0^2/k

Так или иначе, последнее не совсем правильно. Имейте в виду, что эти отношения истинны только асимптотически, поэтому аппроксимации будут более точными по мере увеличения n. Кроме того, f(n) = O(g(n)) означает, что g(n) является верхней оценкой для f(n) при достаточно больших n. Таким образом, f(n) = O(g(n)) не обязательно означает f(n) ~ k*g(n). В идеале, вы хотите, чтобы это было правдой, так как ваша big-O привязка будет жесткой, если это так.

ответил(а) 2020-03-27T17:31:00+03:00 2 месяца назад
38

В основном то, что они пытаются показать, является просто базовой алгеброй после замены 2n на n в функциях.

O(log n)    
log(2n) = log(2) + log(n)
N1 ≈ c + N0

O(n)
2n = 2(n)
N1 ≈ 2N0

O(n²)
(2n)^2 = 4n^2 = 4(n^2)
N1 ≈ 4N0

O(2ⁿ)
2^(2n) = 2^(n*2) = (2^n)^2
N1 ≈ (N0)²

ответил(а) 2020-03-27T17:31:00+03:00 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема