Чи 2 ^ n і n * 2 ^ n однакові за складністю?


178

Ресурси, які я знайшов за часовою складністю, незрозуміло, коли добре ігнорувати терміни в рівнянні часової складності, зокрема з неполіноміальними прикладами.

Мені зрозуміло, що з урахуванням чогось виду n 2 + n + 1, останні два терміни незначні.

Зокрема, з урахуванням двох категоризацій, 2 n та n * (2 n ), чи є другий у тому ж порядку, що й перший? Чи має значення додаткове п множення? Зазвичай ресурси просто кажуть, що x n знаходиться в експоненції і росте набагато швидше ... потім рухайтеся далі.

Я можу зрозуміти, чому б це не сталося, оскільки 2 n сильно перевершить n, а оскільки їх не додавати разом, це було б дуже важливо при порівнянні двох рівнянь, адже різниця між ними завжди буде фактором n, що, як мінімум, важливо сказати.


8
На мою думку, враховуючи, що NLogN розглядається строго повільніше, ніж N, але більшість людей насправді не хвилює, наскільки можна, можна сказати, що N2 ^ N просто повільніше, ніж 2 ^ N, але не "досить повільно" для людей дбати ..
Джек

@tobias_k, я розумію цей момент, але розглянемо приклад O (n!). Чи дійсно зайвий російський термін був би іншим? O (n!) - це O (n * n!), Як O (n!) - це O ((n + 1)!). Зростання є однаковим, хоча… У цьому випадку ріст різний? Чи не про це хвилює складність часу?
matty-d

3
@JackWu, але більшість людей насправді не хвилює, на скільки потрібно зібрати сотні мільйонів записів із nlogn замість n :)
CB

4
Насправді, n! = o((n+1)!)тобто росте строго повільніше асимптотично.
чепнер

16
Зауважимо, що це не має нічого спільного з теорією складності, мова йде лише про аїмптотики. Крім того, подібні питання, ймовірно, краще стосуються інформатики .
Рафаель

Відповіді:


231

Вам потрібно буде перейти до формального визначення великого O ( O), щоб відповісти на це питання.

Визначення є тим, що f(x)належить O(g(x))тоді і тільки тоді, коли межа існує, тобто не є нескінченністю. Коротше кажучи, це означає, що існує константа , така величина якої ніколи не перевищує .limsupx → ∞ (f(x)/g(x))Mf(x)/g(x)M

У випадку вашого питання хай і нехай . Тоді те , що все ще зростатиме нескінченно. Тому не належить .f(n) = n ⋅ 2ng(n) = 2nf(n)/g(n)nf(n)O(g(n))


5
Дещо простіше читати визначення, дивіться тут
Alden

3
Формально кажучи, ви не можете взяти межу O(f(x)/g(x)); сповіщення big-O - це скорочення для набору функцій, а не для однієї функції, значення якої можна обмежити. Однак я думаю, що це правда, що ти можеш показати це, f(x) = O(g(x))якщо воно lim(x->infinity) f(x)/g(x)існує.
чепнер

44
Межа не повинна існувати; співвідношення повинно бути обмежене вище постійною для досить великих х. Наприклад, 2 + sin (x) знаходиться в O (1), але (2 + sin (x)) / 1 не наближається до межі, оскільки x-> нескінченність.
user2357112 підтримує Моніку

2
Визначення було б правильним, lim supа не lim.
Девід Ейзенстат

11
@IvayloStrandjev, зверніть увагу, що ваш короткий опис невірний. Це має бути справедливо для досить великих x, не для всіх значень x.
К.Штефф

85

Швидкий спосіб зрозуміти, що n⋅2ⁿбільше - це змінити змінну. Нехай m = 2ⁿ. Тоді n⋅2ⁿ = ( log₂m )⋅m(беручи логарифм основи-2 з обох сторін m = 2ⁿдає n = log₂m), і ви зможете легко показати, що m log₂mросте швидше, ніж m.


3
Дякую! Це найкраща відповідь на мій погляд. Докази, засновані на формальних визначеннях, є правильними, але якщо у вас є якийсь камінь спотикання, щоб подолати, дуже зручна і знайома аналогія зробить цю роботу найкращим і швидким.
Джон П

1
Дурне питання, що таке lg? Логарифм в основі 2?
П’єр Арло

3
Це ледача абревіатура. У інформатиці це має на увазі базу 2, оскільки вона в основному є результатом стратегій розділення та перемоги. У нотації big-O це може представляти що завгодно, тому що логарифм бази-x числа відрізняється від його логарифму base-y лише постійним коефіцієнтом, незалежно від x і y.
чепнер

3
Я зауважу ретроспективно, що lgце позначення ISO для логарифму базової 10, а не використання базової агностики, що найчастіше використовується при обговоренні асимптотичних періодів виконання. Дивіться en.wikipedia.org/wiki/Logarithm#Particular_bases
chepner

Добре, звичайно, але я не розумію, чому очевидно, що m log m росте швидше, ніж m, ніж це те, що n 2 ^ n росте швидше, ніж 2 ^ n.
djechlin

10

Я погоджуюсь, що 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ⁿ.


f(n) = 2*2^nЯ думаю, ти мав на увазі n*2^n?
tobias_k

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ⁿ. Але всі троє ростуть експоненціально.


В останньому прикладі n * 2 ^ n перевищує 2,000001 ^ n до n = 34,726,000. У цьому пункті 2 ^ n - це число з більш ніж 10 мільйонами цифр, тому це не має значення ...
gnasher729

1
@ gnasher729 Це просто константа, яку ми можемо опустити, оскільки f (n), а c * f (n) - це однакова складність в плані big-O. наприклад, 40'000'000 * 2.000001 ^ n більше, ніж n * 2 ^ n одразу. Але ви праві, це насправді не має значення, я б сказав, що це не має особливого значення, як тільки ми потрапили в експоненціальний ріст (якщо тільки ми не отримаємо лише малі значення n).
Андрій

2

Ви запитали "чи є другий у тому ж порядку, що і перший? Чи має значення додаткове п множення?" Це два різні питання з двома різними відповідями.

n 2 ^ n росте асимптотично швидше, ніж 2 ^ n. Ось на це питання відповів.

Але ви можете запитати "якщо алгоритм A займає 2 ^ n наносекунд, а алгоритм B займає n 2 ^ n наносекунд, що є найбільшим n, де я можу знайти рішення за секунду / хвилину / годину / день / місяць / рік?" відповіді n = 29/35/41/46/51/54 проти 25/30/36/40/45/49. На практиці немає великої різниці.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.