Я фактично сам орієнтувався на дерево Ван Емде-Боас один раз. Я порівнював його з 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, що на практиці зовсім небагато. Крім того, у дерев ван Емде-Боаса є хороші постійні чинники (все це стосується постійних факторів на практиці для відмінностей цього невеликого рівня), оскільки їм не потрібно врівноважувати себе.