Час складності 2 ^ sqrt (n)


11

Я вирішую питання щодо алгоритму, і мій аналіз полягає в тому, що він би працював на O (2 ^ sqrt (n)). Наскільки це велике? Чи дорівнює це О (2 ^ n)? Це все-таки неполіномічний час?


3
Будь ласка, прокоментуйте причину відмови від голосування. Дякую!
Гаара

4
Чесно кажучи, я підозрюю, що люди помиляються на це вкрай тривіальне питання, але мені не відразу зрозуміло, як це довести в будь-якому випадку, тому я піду написати відповідь і побачу, чи це змінить думку людей.
Іксрек

3
Час субекспоненціалу
rwong

1
Чудово! Субекспоненціальний час: "час роботи деякого алгоритму може зростати швидше, ніж будь-який многочлен, але все ще значно менший, ніж експонентний". Це безумовно відповідає на моє запитання і розширює мої знання щодо аналізу Big O. Велике спасибі
Гаара

1
Це набагато менше O (2 ^ n), особливо для великих чисел. Візьмемо приклад наявності колекції з 10 000 елементів. 2 ^ 10000 - це число з приблизно 3000 цифрами, саме стільки циклів знадобиться для виконання операції O (2 ^ n). За допомогою O (2 ^ sqrt (n)) ви переходите до числа з 30 цифрами. Різниця надзвичайно величезна для великої кількості на користь рішення sqrt (для 1 мільйона елементів, що (число з 300 000 цифр) * цикл процесора проти (число з 300 цифрами) * цикл процесора).
Енді

Відповіді:


16

Це цікаве питання. На щастя, раз ви знаєте, як це вирішити, це не особливо важко.

Для функцій F : NR + і г : NR + , ми маємо фO ( г ) тоді і тільки тоді , коли Нт вир п → ∞ ф ( п ) / г ( п ) ∈ R .

Функція f : NR + має максимум поліноміального зростання тоді і тільки тоді, коли існує константа kN така, що fO ( nn k ). Давайте працювати це для довільного , але фіксованого доN .

lim sup n → ∞ 2 ( n 1/2 ) / n k =
lim n → ∞ 2 ( n 1/2 ) / n k =
lim n → ∞ e log (2) n 1/2 / e log ( n ) k =
lim n → ∞ e log (2) n 1/2 - log ( n ) k = ∞ ∉ R

Перша рівність справедлива тому, що обидва, іменник, і знаменник, монотонно зростають стійкими функціями. У другій рівності використовується тотожність x y = e log ( x ) y . Межа не є кінцевою, тому що показник у кінцевому виразі не обмежений вище. Не надаючи формального доказу, можна припустити, що відомо, що n 1/2 домінує над log ( n ) асимптотично. Тому функція, про яку йдеться, перевершує зростання поліномів.

Однак його ріст суворо менший, ніж експонентний, де експоненція визначається (для мене для цієї мети) як O ( n ↦ 2 c n ) для c > 0. Показати це ще більше прямо.

lim sup n → ∞ 2 c n / 2 ( n 1/2 ) = lim n → ∞ 2 c n - n 1/2 = ∞ ∉ R

для будь-якого фіксованого c > 0. Отже, складність функції десь справді знаходиться між поліном і експоненціалом.


6

Наскільки це велике? Що ж, O (2 ^ sqrt (n)) - саме те, наскільки він великий :-(

Щоб зрозуміти, що це означає, уявіть, що ваш алгоритм буде не просто O (2 ^ sqrt (n)), а тим, що він фактично займає саме 2 ^ sqrt (n) наносекунди на вашому комп’ютері:

n = 100: 2 ^ 10 = 1024 наносекунд. Немає часу взагалі. n = 1000: 2 ^ 31.xxx = 2 мільярди наносекунд. Дві секунди, це помітно. n = 10000: 2 ^ 100 ≈ 10 ^ 30 наносекунд = 10 ^ 21 секунди = 30 трильйонів років.

Це набагато краще, ніж 2 ^ n наносекунд, де n = 100 займе 30 трильйонів років, але все ж розмір проблем, які ви можете вирішити, досить обмежений. Якщо ви вважаєте проблему "вирішуваною", якщо ваш комп'ютер може її вирішити за один тиждень, це приблизно 6 x 10 ^ 14 наносекунд, це приблизно n = 2400. З іншого боку, до n = 400 можна вирішити в мілісекундах.

(На практиці для n = 10000 і O (2 ^ sqrt (n)), і O (2 ^ n) займають рівно однаковий час: Занадто довго чекати на нього.)

Він перевершує будь-який многочлен. Візьміть інший алгоритм, який займає n ^ 1000 секунд. Що практично нерозв’язно для n = 2. Цей алгоритм займає більше часу, поки n не стане приблизно 885 мільйонів. Але справді, кого це хвилює? У цей момент кількість років, які беруть обидва алгоритми, - це 9000-значний номер.

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