n * log n та n / log n проти часу виконання полінома


14

Я розумію, що швидше, ніж і повільніше, ніж . Мені важко зрозуміти, як насправді порівняти та з де .Θ ( n log n ) Θ ( n / log n ) Θ ( n log n ) Θ ( n / log n ) Θ ( n f ) 0 < f < 1Θ(н)Θ(нжурналн)Θ(н/журналн)Θ(нжурналн)Θ(н/журналн)Θ(нf)0<f<1

Наприклад, як ми вирішуємо vs. абоΘ ( п 2 / 3 ) Θ ( п 1 / 3 )Θ(н/журналн)Θ(н2/3)Θ(н1/3)

Я хотів би мати певні вказівки щодо провадження у таких випадках. Дякую.

Відповіді:


3

Якщо ви просто намалюєте пару графіків, ви будете в хорошій формі. Вольфрам Альфа - чудовий ресурс для таких досліджень:

рівняння

Графік

Створено за цим посиланням . Зауважте, що на графіку log (x) - це природний логарифм, через що рівняння одного графа виглядає дещо смішним.



Окрім згоди з Рафаелем, ця картина дала б набагато краще уявлення , якщо вибрати ще більший діапазон, то друга функція може зникнути, що може заплутати.
phant0m

9

- зворотний 2 n . Так само, як 2 n зростає швидше, ніж будь-який многочлен n k, незалежно від того, наскільки великою є кінцева k , log n зростатиме повільніше, ніж будь-яка поліноміальна функція n k, незалежно від того, наскільки малий ненульовий, позитивний k .журналн2н2ннккжурналннкк

vs n k , для k < 1 ідентично: n / log n vs n / n 1 - kн/журналннкк<1н/журналнн/н1-к

як для великих n , n / log n > n k для k < 1 і великих n .н1-к>журналннн/журналн>нкк<1н


3

Для багатьох алгоритмів іноді трапляється, що константи різні, що призводить до того, що ті чи інші є швидшими або повільнішими для менших розмірів даних, і вони не так упорядковані за алгоритмічною складністю.

Сказавши це, якщо ми розглянемо лише надвеликі розміри даних, тобто. який зрештою виграє, то O(n^f)швидше, ніж O(n/log n)для 0 < f < 1.

Значна частина алгоритмічної складності полягає у визначенні того, який алгоритм зрештою швидший, таким чином, знаючи, що O(n^f)швидше, ніж O(n/log n)для 0 < f < 1, досить часто.

Загальне правило полягає в тому, що множення (або ділення) на log nврешті-решт буде незначним порівняно з множенням (або діленням) n^fна будь-яке f > 0.

Щоб показати це більш чітко, давайте розглянемо, що відбувається з ростом n.

   n       n / log n         n^(1/2)
   2        n/ 1              ?
   4        n/ 2             n/ 2
   8        n/ 3              ?
  16        n/ 4             n/ 4
  64        n/ 6             n/ 8
 256        n/ 8             n/16
1024        n/10             n/32

Помітьте, що швидше зменшується? Це n^fколона.

Навіть якщо це fбуло ближче до 1, n^fстовпець просто почне повільніше, але, оскільки n подвоїться, швидкість зміни знаменника прискорюється, тоді як знаменник n/log nстовпця змінюється постійною швидкістю.

Побудуємо на графіку конкретний випадок

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

Джерело: Вольфрам Альфа

Я вибрав O(n^k)таке, що kдосить близько до 1 (at 0.9). Я також вибрав константи, щоб спочатку O(n^k)було повільніше. Однак зауважте, що вона врешті-решт «виграє» і займає менше часу, ніж O(n/log n).


як щодо n / log n

Це було трохи помилково, саме це я мав на увазі на початку. У будь-якому разі я додав більш відповідний графік, який показує, що з n^kчасом він швидший, навіть якщо константи вибираються такими, що спочатку повільніше.

3

Просто подумайте про як про nнf . Так для прикладу,п2/3=п/п1/3. Тоді легко порівняти рістнн1-fн2/3=н/н1/3

нжурналнvs.нн1-f.

журналннεε>0


1

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

У вашому випадку подумайте про n = 10 ^ 10 і a = .5

O(n/logn) = O(10^10/10) = O(10^9)
O(n^1/2) = O(10^10^.5) = O(10^5)

Отже, O (n ^ a) швидше, ніж O (n / logn), коли 0 <a <1 я використав лише одне значення, однак ви можете використовувати декілька значень для побудови інтуїції щодо функції


1
Не пишіть O(10^9), але головний пункт щодо спроб деяких чисел побудувати інтуїцію - це правильно.

Збій. Це неправильно. Ви замінили одну n константу, яка може бути упередженою. Якби я вибрав різні константи, я міг би зробити будь-який алгоритм виглядати краще. Нотація великого O використовується для встановлення тенденцій того, що буде швидше в довгостроковій перспективі. Для цього потрібно вміти показати, що він швидший для великих n, навіть якщо він повільніше, коли n менший.

Дякую. Додано частину кількох значень і враховувати більшу кількість

Слід зазначити, що тільки тому, що f (a)> g (a) для деякої постійної a, не обов'язково означає, що O (f (x))> O (g (x)). Це корисно для побудови інтуїції, але недостатньо для складання суворих доказів. Для того, щоб показати, що це відношення має місце, ви повинні показати, що це вірно для ВСЕ великого n, а не лише одного великого n. Так само ви повинні показати, що це стосується всіх поліномів позитивного ступеня <1.

1

fг

нα1(журналн)α2(журналжурналн)α3нβ1(журналн)β2(журналжурналн)β3(α1,α2,α3)<(β1,β2,β3)

(2,10)<(3,5)(2,10)>(2,5)

Застосовано до вашого прикладу:

О(н/журналн)(1,-1,0)

О(н2/3)(2/3,0,0)

О(н1/3)(1/3,0,0)

(1/3,0,0)<(2/3,0,0)<(1,-1,0)О(н1/3)О(н2/3)О(н/журналн)

Можна сказати: повноваження n домінують над силами журналу, які домінують над силами журналу журналу.

Джерело: Конкретна математика, с. 441

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