In realtà, ho analizzato personalmente l'albero di Van Emde-Boas una volta. L'ho confrontato con un albero AA, una hashmap e un bit array.
I test eseguono size
inserimenti con numeri casuali nell'intervallo [0, bound]
, quindi size
effettuano ricerche, quindi size
eliminano e quindi eseguono nuovamente size
ricerche. Le eliminazioni vengono eseguite anche su numeri casuali, quindi devi prima capire se sono nella struttura.
Ecco i risultati ( size
= 2000000, bound
= 10000000) in secondi:
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
Come puoi vedere, gli alberi di Van Emde-Boas sono circa due volte più lenti delle mappe hash, dieci volte più lenti degli array di bit e 5 volte più veloci degli alberi di ricerca binari.
Naturalmente quanto sopra ha bisogno di una dichiarazione di non responsabilità: i test sono artificiali, puoi eventualmente migliorare il codice o usare una lingua diversa con un compilatore il cui output è più veloce, e così via e così via.
Questa dichiarazione di non responsabilità è al centro del motivo per cui utilizziamo l'analisi asintotica nella progettazione di algoritmi: poiché non hai idea di cosa siano le costanti e poiché le costanti possono cambiare in base a fattori ambientali, il meglio che possiamo fare è un'analisi asintotica.
lognloglogn232log232= 32log32 = 5