Являются ли 2 ^ n и n * 2 ^ n одинаковой временной сложностью?

Ресурсы, которые я обнаружил по временной сложности, неясно, когда можно игнорировать термины в уравнении сложности времени, в частности, с не-полиномиальными примерами.

Мне ясно, что, учитывая что-то вида n 2 + n + 1, последние два члена несущественны.

В частности, учитывая две категории, 2 n и n * (2 n), является вторым в том же порядке, что и первый? Существует ли дополнительное умножение n? Обычно ресурсы просто говорят, что x n находится в экспоненте и растет намного быстрее... затем двигайтесь дальше.

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

Ответ 1

Вам нужно перейти к формальному определению большого O (O), чтобы ответить на этот вопрос.

Определение состоит в том, что f(x) принадлежит O(g(x)) тогда и только тогда, когда существует предел limsupx → ∞ (f(x)/g(x)), т.е. не бесконечен. Короче говоря, это означает, что существует константа M, такая, что значение f(x)/g(x) никогда не превышает M.

В случае вашего вопроса let f(n) = n ⋅ 2n и g(n) = 2n. Тогда f(n)/g(n) есть n, который будет расти бесконечно. Поэтому f(n) не принадлежит O(g(n)).

Ответ 2

Быстрый способ увидеть, что n⋅2ⁿ больше, - это изменить переменную. Пусть m = 2ⁿ. Тогда n⋅2ⁿ = ( log₂m )⋅m (взяв логарифм base-2 по обе стороны от m = 2ⁿ дает n = log₂m), и вы можете легко показать, что m log₂m растет быстрее, чем m.

Ответ 3

Я согласен, что n⋅2ⁿ не находится в O(2ⁿ), но я думал, что он должен быть более явным, поскольку предел превосходного использования не всегда выполняется.

По формальному определению Big-O: f(n) находится в O(g(n)), если существуют константы c > 0 и n₀ ≥ 0 такие, что для всех n ≥ n₀ имеем f(n) ≤ c⋅g(n). Нетрудно показать, что для f(n) = n⋅2ⁿ и g(n) = 2ⁿ таких констант не существует. Однако можно показать, что g(n) находится в O(f(n)).

Другими словами, n⋅2ⁿ ниже ограничено на 2ⁿ. Это интуитивно понятно. Хотя они оба экспоненциальны и, следовательно, вряд ли будут использоваться в большинстве практических условий, мы не можем сказать, что они одного порядка, потому что 2ⁿ обязательно растет медленнее, чем n⋅2ⁿ.

Ответ 4

Я не спорю с другими ответами, которые говорят, что n⋅2ⁿ растет быстрее, чем 2ⁿ. Но n⋅2ⁿ растет все еще только экспоненциально.

Когда мы говорим об алгоритмах, мы часто говорим, что временная сложность растет экспоненциально. Итак, мы считаем, что 2ⁿ, 3ⁿ, eⁿ, 2.000001ⁿ, или наша n⋅2ⁿ будет одной и той же группой сложности с экспоненциальным ростом.

Чтобы дать ему немного математический смысл, рассмотрим функцию f(x) для экспоненциального роста (не быстрее), если существует такая константа c > 1, что f(x) = O(cx).

Для n⋅2ⁿ константа c может быть любым числом, большим, чем 2, возьмем 3. Тогда:

n⋅2ⁿ / 3ⁿ = n ⋅ (2/3)ⁿ, и это меньше, чем 1 для любого n.

Итак, 2ⁿ растет медленнее, чем n⋅2ⁿ, последнее в свою очередь растет медленнее, чем 2.000001ⁿ. Но все три из них растут экспоненциально.

Ответ 5

Вы спросили: "Второй в том же порядке, что и первый?". Имеет ли значение дополнительное умножение n? Это два разных вопроса с двумя разными ответами.

n 2 ^ n растет асимптотически быстрее, чем 2 ^ n. На этот вопрос ответил.

Но вы могли бы спросить: "Если алгоритм A берет 2 ^ n наносекунды, а алгоритм B берет n 2 ^ n наносекунды, что является самым большим п, где я могу найти решение в секунду/минуту/час/день/месяц/год? И ответы: n = 29/35/41/46/51/54 против 25/30/36/40/45/49. Не так много различий на практике.

Размер самой большой проблемы, которая может быть решена за время T, равна O (ln T) в обоих случаях.