Aslında bir kez kendim Emde-Boas ağacını karşılaştırdım. Bir AA Ağacı, bir hashmap ve biraz dizi ile karşılaştırdım.
Testler size
aralıkta rastgele sayılarla kesici uçlar gerçekleştirir [0, bound]
, sonra size
arar, size
siler ve sonra tekrar size
arar. Silme işlemleri rasgele sayılar üzerinde de yapılır, bu yüzden öncelikle yapıda olup olmadıklarını anlamanız gerekir.
Saniyeler içinde sonuçlar ( 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
Gördüğünüz gibi van Emde-Boas ağaçları, karma haritaların yaklaşık iki katı, bit dizilerinin on katı ve ikili arama ağaçlarının 5 katıdır.
Elbette yukarıdakilerin bir feragatnameye ihtiyacı vardır: testler yapaydır, kodu daha hızlı bir şekilde geliştirebilir veya çıktısı daha hızlı olan bir derleyici ile farklı bir dil kullanabilirsiniz, vb.
Bu feragat, algoritma tasarımında asimptotik analizi kullanma nedenimizin kalbinde yer almaktadır: sabitlerin ne olduğu hakkında hiçbir fikriniz olmadığı ve sabitlerin çevresel faktörlere bağlı olarak değişebileceği için yapabileceğimiz en iyi şey asimptotik bir analizdir.
Şimdi, logn karşı loglogn: Yukarıdaki örnekte, minibüs Emde-Boas ağacım şunları içerebilir: 232 elementler. log232=32, ve log32=5Bu, pratikte biraz olan bir faktör 6 iyileştirmedir. Buna ek olarak, van Emde-Boas ağaçlarının kendilerini dengelemeleri gerekmediği için iyi sabit faktörleri vardır (hepsi bu küçük farklılıklar için sabit faktörlerle ilgilidir).