Які характеристики алгоритму складності часової складності


19

Іноді легко визначити часову складність алгоритму, щоб я його ретельно вивчив. Алгоритми з двома вкладеними петлями очевидно . Алгоритми , які досліджують всі можливі комбінації груп з двох значень, очевидно .N 2 N 2 NNN2N2N

Однак я не знаю, як «помітити» алгоритм зі складністю Θ(NжурналN) . Наприклад, рекурсивна реалізація злиття. Які загальні характеристики або інша злиття Θ(NжурналN) алгоритми , які дали б мені ключ , якщо я аналізував один?

Я впевнений, що існує декілька способів складності алгоритму Θ(NжурналN) , тому будь-які і всі відповіді оцінюються. До речі, я шукаю загальні характеристики та поради, а не суворі докази.


6
означає дерево. О(журналн)
Pratik Deoghare


2
@PratikDeoghare: Не обов’язково.
Рафаель

3
@Raphael я мав на увазі переважно! :)
Pratik Deoghare

Відповіді:


17

Ваш архетипний - алгоритм розділення і перемоги , який ділить (і рекомбінує) роботу на лінійний час і повторюється за частинами. Сортування злиттям працює таким чином: проводять Про ( п ) час розщеплення вхід приблизно на дві рівні частини, рекурсивно роду кожен шматок, і провести Θ ( п ) час , комбінуючи дві половинки сортується.Θ(нжурналн)О(н)Θ(н)

Інтуїтивно, продовжуючи ідею поділу і перемоги, кожен етап поділу займає загальний лінійний час, оскільки збільшення кількості шматочків, які потрібно розділити, точно відповідає зменшенню розміру шматочків, оскільки час, відведений діленням, лінійний. Загальний час роботи - це добуток загальної вартості етапу поділу, помножений на кількість етапів поділу. Оскільки розмір шматочків зменшується вдвічі, є етапи поділу , тож загальний час виконання - n log ( n ) . (До мультиплікативної константи основа логарифму не має значення.)журнал2(н)нжурнал(н)

Якщо скласти це в рівняннях (), один із способів оцінити час роботи такого алгоритму - це виразити його рекурсивно: T ( n ) = 2 T ( n / 2 ) + Θ ( n ) . Зрозуміло, що цей алгоритм займає більше, ніж лінійний час, і ми можемо бачити, наскільки більше, поділяючи на n : T ( n )Т(н)Т(н)=2Т(н/2)+Θ(н)н Колиnподвоюється,T(n)/nзбільшується на постійну величину:T(n)/nзбільшується логарифмічно, або іншими словами,T(n)=Θ(nlogn).

Т(н)н=Т(н/2)н/2+Θ(1)
нТ(н)/нТ(н)/нТ(н)=Θ(нжурналн)

Це примірник більш загальної закономірності: головна теорема . Для будь-якого рекурсивного алгоритму , який ділить його введення розміру в протягом шматків розміру п / б і займає час п ( п ) для виконання поділу і рекомбінації, час роботи задовольняє умова Т ( п ) = а Т ( п / б ) + f ( n ) . Це призводить до закритої форми, яка залежить від значень a і b та форминан/бf(н)Т(н)=аТ(н/б)+f(н)аб . Якщо a = b і f ( n ) = Θ ( n ) , головна теорема стверджує, що T ( n ) = Θ ( n log n ) .fа=бf(н)=Θ(н)Т(н)=Θ(нжурналн)


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

1
приклад: середній випадок О(нжурналн)
швидкості

11

Дві інші категорії алгоритмів, які займають час:Θ(нжурналн)

Алгоритми, де кожен елемент обробляється по черзі, і для обробки кожного елемента потрібен логарифмічний час (наприклад, HeapSort або багато алгоритмів обчислювальної геометрії площини).

Алгоритми, де час роботи переважає на етапі попередньої обробки сортування. (Наприклад, в алгоритмі Крускала щодо дерева, що має мінімальний розмір, ми можемо сортувати краї за вагою як перший крок).


Запропоновано за перший абзац. Друга видається зайвою, оскільки алгоритми лінійного сортування, які ми знаємо, є або ділити & перемогти, або важко. Прикладом для першої категорії є пошук об’єктів у двійковому дереві пошуку (або відсортованому масиві) розміром n ; на більш абстрактному рівні, але це також можна розглядати як поділ і перемогу. нн
Рафаель

@Raphael Я знаю, що сортування є зайвим із уже заданими категоріями часу роботи. Справа в тому, що сортування іноді є «вузьким місцем», і алгоритми, де спочатку червоніє питання не в сортуванні, все ще може бути час роботи, оскільки сортування потрібно.
Джо

9

Ще одна категорія: Алгоритми, у яких вихід має розмір , і тому running ( n log n ) час роботи є лінійним у розмірі виводу .Θ(нжурналн)Θ(нжурналн)

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

Це з'являється в структурах даних, які базуються на розширеному двійковому дереві пошуку, де кожен вузол зберігає структуру даних лінійного розміру для пошуку по листах у піддереві цього вузла. Такі структури даних часто зустрічаються в пошуку геометричного діапазону і часто базуються на схемі декомпозиції . Дивіться опитування Agarwal .

Для конкретного прикладу розглянемо дерево діапазону , створене для відповіді на двомірні ортогональні запити діапазону. Хоча пізніше було зменшено простір за допомогою деяких методів стиснення для упаковки декількох об’єктів в одне слово, підручникова (і найбільш інтуїтивно зрозуміла) версія структури даних вимагає простору (кожен аркуш зберігається у допоміжній структурі на кожному вузол на шляху від листа до кореня, або в O ( журнал п ) місця), а також алгоритм побудови займає багато часу лінійно на вимогу простору .О(нжурналн)О(журналн)


Прикладом може бути пошук n-го простого за допомогою сита, оскільки вам знадобиться сито розміром . θ(нлогн)
gnasher729

6

Складність виникає внаслідок алгоритмів ділення та підкорення, які ділять свій вхід на k шматки приблизно однакового розміру за час O ( n ) , діють на ці шматки рекурсивно, а потім об'єднують їх у часі O ( n ) . Якщо ви працюєте лише над деякими елементами, час роботи падає на O ( n ) .О(нжурналн)кО(н)О(н)О(н)


5

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



-1

О(нжурналн)

for (i = 0; i < constant; i++){
    for(j = 0; j < n; j++){
        // Do some O(1) stuff on the input
    }
}

// Alternative Variant:
for (i = 0; i < constant; i++){
    for(j = n; j < constant; j++){
        // Do some O(1) stuff on the input
    }
}

О(н2)

Я не можу навести конкретний приклад алгоритму, який використовує цю петлю, але це часто виникає при кодуванні спеціальних алгоритмів.


Так, це обидва О(нжурналн)Θ(н)Θ(1)Θ(|н|)н

О(нжурналн)

крім того, в оригінальному запитанні не було запитано big-theta.
Nicolas Miari

1
Звичайно, але будь-який алгоритм, який працює в лінійний або постійний час, є О(нжурналн)О(22н)О(майже нічого іншого)Θ(нжурналн)О(нжурналн)
Девід Річербі

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