Właściwie to kiedyś sam porównałem drzewo van Emde-Boasa. Porównałem to z drzewem AA, mapą skrótów i tablicą bitów.
Testy wykonują size
wstawki z losowymi liczbami w przedziale [0, bound]
, a następnie size
wyszukują, a następnie size
usuwają, a następnie ponownie size
wyszukują. Usuwania są również wykonywane na liczbach losowych, więc najpierw musisz dowiedzieć się, czy w ogóle są w strukturze.
Oto wyniki ( size
= 2000000, bound
= 10000000) w sekundach:
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
Jak widać, drzewa van Emde-Boasa są około dwa razy wolniejsze niż mapy haszujące, dziesięć razy wolniejsze niż tablice bitów i 5 razy szybsze niż drzewa wyszukiwania binarnego.
Oczywiście powyższe wymaga wyłączenia odpowiedzialności: testy są sztuczne, możesz ulepszyć kod lub użyć innego języka w kompilatorze, którego dane wyjściowe są szybsze, i tak dalej.
To wyłączenie odpowiedzialności stanowi sedno powodu, dla którego wykorzystujemy analizę asymptotyczną w projektowaniu algorytmów: ponieważ nie masz pojęcia, jakie są stałe, a ponieważ stałe mogą się zmieniać w zależności od czynników środowiskowych, najlepszą rzeczą, jaką możemy zrobić, jest analiza asymptotyczna.
Teraz w przypadku logn przeciw loglogn: w powyższym przykładzie moje drzewo van Emde-Boasa jest w stanie pomieścić 2)32 elementy. log2)32= 32, i log32 = 5, co stanowi poprawę współczynnika 6, co w praktyce jest dość duże. Dodatkowo drzewa van Emde-Boasa mają dobre stałe czynniki (w praktyce chodzi o stałe czynniki w przypadku tak małych różnic), ponieważ nie muszą się równoważyć.