Bu konuyla ilgili kapsamlı bir tez yazılabilir; Sadece bazı belirgin noktaları ele alacağım ve diğer veri yapılarının tartışmasını da asgari düzeyde tutacağım (aslında birçok değişken var). Bu cevap boyunca , sözlükteki anahtarların sayısıdır.n
Kısa cevap, karma tabloların çoğu durumda daha hızlı olduğu , ancak en kötüsünde çok kötü olabileceğidir. Arama ağaçları , evcil hayvanların en kötü davranışları da dahil olmak üzere birçok avantaja sahiptir , ancak tipik durumlarda biraz daha yavaştır.
Dengeli ikili arama ağaçları oldukça düzgün bir karmaşıklığa sahiptir: her bir eleman ağaçta bir düğüm alır (tipik olarak 4 bellek hafızası) ve temel işlemler (arama, ekleme, silme) zaman alır (asimptotik garantilidir ) üst sınır). Daha doğrusu, ağaçtaki bir erişim sürer l o gO ( l g ( n ) ) karşılaştırılması.l O g2( n )
Karma tablolar biraz daha değişkendir. Yaklaşık işaretçilerden oluşan bir dizi gerektirir . Bir elemana erişim, hash fonksiyonunun kalitesine bağlıdır. Bir karma fonksiyonunun amacı elemanları dağıtmaktır. Bir depoda depolamak istediğiniz tüm elemanların farklı karmaları varsa “çalışır”. Bu durumda, temel işlemler (arama, ekleme, silme) , oldukça küçük bir sabitle (bir karma hesaplama artı bir işaretçi arama) O ( 1 ) zaman alır. Bu, birçok tipik durumda karma tabloları çok hızlı hale getirir.2 n0 ( 1 )
Karma tablolarla ilgili genel bir sorun, karmaşıklığının garanti edilmemesidir.0 ( 1 )
- Ek olarak, masanın dolduğu bir nokta var; bu olduğunda (veya daha iyisi, bundan biraz önce), maliyeti için tüm öğelerinin taşınmasını gerektiren tablonun büyütülmesi gerekir . Bu, birçok element eklendiğinde “sarsıntılı” davranışa neden olabilir.O ( n )
- Girişin birkaç karma değerin üzerine çarpışması mümkündür. Bu nadiren doğal olarak gerçekleşir, ancak girdiler bir saldırgan tarafından seçildiyse bu bir güvenlik sorunu olabilir: bu, bazı sunucuları oldukça yavaşlatmanın bir yoludur. Bu sorun bazı programlama dili uygulamalarının (Perl ve Python gibi) düz eski bir karma tablodan karma tablo oluştururken, bu karma veriyi iyi yayan bir karma işlevi ile birlikte, karma tablo oluşturulurken seçilen rasgele bir sayı içeren karma işlevine geçmesine neden olmuştur. (Bu, deki çarpım sabitini arttırır ) veya bir ikili arama ağacına. Kriptografik bir karma kullanarak çarpışmaları önleyebilirsiniz, ancak pratikte bu yapılmaz, çünkü şifreleme karma değerleri hesaplamak için nispeten çok yavaşlar.0 ( 1 )
Eğer attığımda veri yerellik karışımı içine, karma tabloları kötü yapmak. Tam olarak çalışırlar çünkü ilgili elemanları birbirinden uzakta saklarlar, yani uygulama bir öneki sırayla paylaşan öğeleri ararsa, önbellek etkilerinden faydalanmayacaktır. Uygulama esas olarak rasgele aramalar yaparsa, bu durum ilgili değildir.
Arama ağaçlarının lehine olan bir başka faktör de değişmez bir veri yapıları olmalarıdır : bir ağacın kopyasını almanız ve içindeki birkaç öğeyi değiştirmeniz gerekirse, veri yapısının çoğunu paylaşabilirsiniz. Bir karma tablosunun kopyasını alırsanız, tüm işaretçiler dizisini kopyalamanız gerekir. Ayrıca, tamamen işlevsel bir dilde çalışıyorsanız, karma tabloları genellikle bir seçenek değildir.
Eğer dizeleri ötesine gittiğinde karma tabloları ve ikili arama ağaçları anahtarının veri türüne farklı gereksinimleri olun: hash tabloları tamsayılar öyle ki anahtarları (a işlevi karma işlevi gerektiren k1≡ k2⟹h ( k1) = h ( k2)
Özellikle, tuşların sırasına ihtiyacınız olacaksa , örneğin tuşları alfabetik sırayla listelemek istiyorsanız, karma tabloların yardımı yoktur (sıralamanız gerekir), oysa Bir arama ağacını kolayca sırayla geçirebilir.
İkili arama ağaçları ve karma tabloları karma ağaçlar şeklinde birleştirebilirsiniz . Bir karma ağacı, anahtarları bir karma arama ağacında karma değerlerine göre saklar. Bu, örneğin, hesaplanması kolay bir düzen ilişkisi olmayan veriler üzerinde çalışmak istediğiniz tamamen işlevsel bir programlama dilinde faydalıdır.
Tuşları dizeleri (veya tamsayılar) olduğunda, bir tray başka seçenek olabilir. Bir ağaç ağacıdır, ancak bir arama ağacından farklı olarak dizine eklenir: anahtarı ikilik olarak yazarsınız ve 0 için sağa ve 1 için sağa gidersiniz. Bir erişimin maliyeti anahtarın uzunluğu ile orantılıdır. Denemeler, ara düğümleri çıkarmak için sıkıştırılabilir; Bu bir patricia trie veya radix ağacı olarak bilinir . Radix ağaçları, özellikle birçok anahtarın ortak bir ön eki paylaşması durumunda, dengeli ağaçlardan daha iyi performans gösterir.