Являются ли 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) в обоих случаях.