Логарифмічна проти подвійна логарифмічна часова складність


9

У реальному застосуванні є конкретна користь при використанні O(log(log(n)) замість O(log(n)) алгоритми?

Це той випадок, коли застосовують, наприклад, дерева van Emde Boas замість звичайних двійкових дерев пошуку. Але, наприклад, якщо взятиn<106 то в кращому випадку подвійний логарифмічний алгоритм перевершує логарифмічний на (приблизно) коефіцієнт 5. А також загалом реалізація більш складна і складна.

Зважаючи на те, що я особисто віддаю перевагу BST над VEB-деревами, як ти думаєш?

Можна легко продемонструвати, що:

n<106. lognlog(log(n))<5.26146


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

3
Зауважте, що з дерев VEB було багато вдосконалень, що складаються в структурах даних на оперативній пам’яті зі складністю пошуку / вставки / видалення O(log log n) без рандомізації (детермінованих) і O(log log n)з рандомізацією. Див. Детерміноване сортування вO(n log log n)Час та лінійний простір. від Хань, іO(log log n)Очікуваний час та лінійний простір. Хан і Торпуп.
AT

У реальному світі коефіцієнт 5 досить значний, а кількість предметів часто може становити 10 ^ 9 або навіть 10 ^ 12.
RBarryYoung

Відповіді:


10

Не забувайте цього logn все ще росте експоненціально (в log(n)) швидше за log(logn)!

Дійсно, якщо подивитися на коефіцієнт log(n) і log(log(n)), тут не так вже й багато вражаючих:

log (n) / log (log (n))
[ джерело ]

Але все-таки ви отримуєте коефіцієнт від п'яти до шести для розмірів до 100000. Зауважте, що більші розміри на практиці не рідкість, а прискорення за цим фактором є приголомшливим ! Це може змінити результат після обіду або лише завтра. Майте на увазі, що частина прискорення може бути з'їдена вищими константами реалізації дерева; вам доведеться побудувати (або проаналізувати)clog(n) і dlog(log(n)) з c,d фактичні константи виконання, щоб отримати реальну картину.

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

n * log (n) / (n * log (log (n)))
[ джерело ]

Тепер, якщо це не варто проблем, я не знаю, що.


6

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

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


6

Я фактично сам орієнтувався на дерево Ван Емде-Боас один раз. Я порівнював його з AA Tree, хешмапом і трохи масивом.

Тести виконують sizeвставки з випадковими числами в інтервалі [0, bound], потім здійснюють sizeпошук, потім sizeвидалення та повторний sizeпошук. Видалення також робиться на випадкових числах, тому спочатку потрібно з’ясувати, чи вони взагалі є в структурі.

Ось результати ( size= 2000000, bound= 10000000) за секунди:

AATreeLookup - O(n log n)
Inserting... 3.3652452
Searching... 5.2280724
Deleting...  7.3457427
Searching... 9.1462039
HashLookup - O(n) expected
Inserting... 0.3369505
Searching... 0.6223035
Deleting...  0.9062163
Searching... 1.1718223
VanEmdeBoasTree - O(n log log n)
Inserting... 0.7007531
Searching... 1.1775800
Deleting...  1.7257065
Searching... 2.2147703
ArrayLookup - O(n)
Inserting... 0.0681897
Searching... 0.1720300
Deleting...  0.2387776
Searching... 0.3413800

Як бачите, дерева ван Емде-Боаса приблизно вдвічі повільніші за хеш-карти, в десять разів повільніші за бітові масиви і в 5 разів швидші, ніж двійкові дерева пошуку.

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

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

Тепер у випадку з logn проти loglogn: у наведеному вище прикладі моє дерево мій ван Емде-Боас вміщене 232 елементів. log232=32, і log32=5, що є поліпшенням фактору 6, що на практиці зовсім небагато. Крім того, у дерев ван Емде-Боаса є хороші постійні чинники (все це стосується постійних факторів на практиці для відмінностей цього невеликого рівня), оскільки їм не потрібно врівноважувати себе.


Можливо, стрибнути в R (або еквівалент) і створити кілька гарних графіків (як @Raphael зробив).
Дейв Кларк

1
Це покращить вашу відповідь, якщо ви пов’язали ці алгоритми з поняттями logn і loglogn
Дейв Кларк

@DaveClarke: дякую за пропозиції. На жаль, я дуже погано створюю гарні фотографії - я думаю, що моя редакція покращила читабельність моїх результатів.
Олексій десять Бринк

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