Большая путаница O: log2 (N) vs log3 (N)

Почему O (log 2 N) = O (log 3 N)?

Я не понимаю этого. Значит, большой O не означает верхнюю границу чего-то?

Не лог 2 N больше, чем log 3 N? Когда я их рисую, log 2 N находится выше log 3 N.

Ответ 1

Big O не имеет отношения к постоянным факторам, а разница между Log x (n) и Log y (n) является постоянным фактором.

Чтобы сказать немного, база логарифма в основном просто изменяет наклон линии/кривой на графике. Big-O не связан с наклоном кривой на графике, только с формой кривой. Если вы можете получить одну кривую в соответствии с другой, сдвинув ее наклон вверх или вниз, то, насколько это касается ноты Big-O, они являются той же функцией и той же кривой.

Чтобы попытаться представить это в перспективе, возможно, было бы полезно рисовать некоторые из наиболее распространенных форм кривой:

enter image description here

Как отмечалось выше, имеет значение только форма линии, а не ее наклон. На следующем рисунке:

введите описание изображения здесь

... все линии прямые, поэтому, несмотря на то, что их наклоны сильно отличаются друг от друга, они все еще одинаковы, насколько это важно, - все они просто O (N), независимо от наклона. С логарифмами мы получаем примерно такой же эффект: каждая строка будет изогнута, как линия O (log N) на предыдущем рисунке, но изменение базы логарифма будет вращать эту кривую вокруг начала координат, чтобы вы (снова) имеют ту же форму линии, но на разных склонах (так, опять же, насколько это важно, все они одинаковы). Итак, перейдем к исходному вопросу, если мы изменим основы логарифмов, получим кривые, которые выглядят примерно так:

введите описание изображения здесь

Здесь может быть немного менее очевидно, что все, что происходит, является постоянным изменением наклона, но именно здесь разница здесь, как и с прямыми линиями выше.

Ответ 2

Это связано с тем, что изменение базы логарифмов равно умножению на константу. И большой O не заботится о константах.

log_a(b) = log_c(b) / log_c(a)

Итак, чтобы перейти от log2(n) в log3(n), вам нужно умножить его на 1 / log(3) 2.

Другими словами log2(n) = log3(n) / log3(2).

log3(2) является константой и O(cn) = O(n), поэтому O (log2(n)) = O (log3(n))

Ответ 3

Здесь уже есть хороший ответ, поэтому, пожалуйста, прочитайте их тоже. Чтобы понять, почему Log2 (n) - O (log3 (n)), вам нужно понять две вещи.

1) Что такое обозначение BigO. Я предлагаю прочитать это: http://en.wikipedia.org/wiki/Big_O_notation Если вы понимаете это, вы будете знать 2n и 16n+5 оба O(N)

2) как работают логарифмы. разница между log 2 (N) и log 10 (N) будет простым отношением, которое легко вычисляется, если вы хотите его в соответствии с ответом luk32.

Поскольку логарифмы в разных базах отличаются только а постоянным отношением, а Big O равнодушен к второстепенным вещам, таким как постоянные множители, вы часто обнаруживаете, что O (logN) фактически опускает базу, потому что выбор любой постоянной базы ( например, 2,3,10, e) не имеет никакого значения в этом контексте.

Ответ 4

Это зависит от контекста, в котором используется нотация O. Когда вы используете его в алгоритмической сложности, вас интересует асимптотическое поведение функции, то есть, как она растет/уменьшается, когда она стремится ( плюс или минус) бесконечность (или другая точка накопления).

Поэтому, если f(n) = 3n всегда меньше, чем g(n) = 1000n, они оба появляются в O(n), так как они растут linearly (по их выражениям) асимптотически.

Тот же шаблон рассуждений может быть применен для случая логарифма, который вы опубликовали, поскольку логарифмы разных баз отличаются для постоянного фактора, но имеют одинаковое асимптотическое поведение.

Изменение контекста, если вы заинтересованы в вычислении точной производительности алгоритма, учитывая, что ваши оценки точны и не приблизительны, вы предпочли бы более низкую из них. В общем, все сравнения вычислительной сложности являются приближением, таким образом, посредством асимптотических рассуждений.