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


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.