karma tablolar üzerinde ikili arama ağaçları avantajları nelerdir?
Hash tabloları Teta (1) zaman içinde herhangi bir elemanını bakabilirsiniz ve bir öğe eklemek gibi kolaydır .... ama tersi oluyor avantajlardan emin değilim.
karma tablolar üzerinde ikili arama ağaçları avantajları nelerdir?
Hash tabloları Teta (1) zaman içinde herhangi bir elemanını bakabilirsiniz ve bir öğe eklemek gibi kolaydır .... ama tersi oluyor avantajlardan emin değilim.
İkili ağacın biri "avantajı" sırayla tüm unsurları kapalı listelemek için gidilebileceğini olmasıdır. Bu Hash tabloyla imkansız değil ama bir karmayı yapısına normal bir operasyon tek tasarım değildir.
(Onlar hiç takılı olsun ya da olmasın), bir ikili arama ağacı sadece ihtiyacı kadar büyük olacak henüz eklenecek olan elemanların hazır yuvası olacak - bu ilk oluşturulduğunda hashtable'a daha fazla yer alacağını olmak. Bir karma-tablo fazla oda ihtiyaç duyduğunda Ayrıca, başka yapıya genişleyen olabilir zaman alıcı olabilir, ama bu uygulamaya bağlı olabilir.
İkili Arama Ağaçları (referans bazlı) bellek verimli olduğunu unutmayın. onlar için gerekenden daha Onlar daha fazla bellek ayırmak gerekmez.
Bir hızlı arama fonksiyonu bir dizi vardır Örneğin, R(h) = 0...100o zaman sadece 20 elemanları karma bile, 100 (işaretçiler yapılır) elemanlarından oluşan bir dizi tahsis etmek gerekir. Aynı bilgileri depolamak için bir ikili arama ağacı kullanacak olursak, yalnızca kadar gerektiği şekilde boşluk yanı sıra bağlantıları hakkında bazı meta tahsis edecek.
Bir ikili ağaç arama ve eklemek için yavaştır, ama aslında sen sıralı bir şekilde ağacın düğümlerini yinelemek anlamına gelir infix Çapraz geçiş çok güzel bir özelliği vardır.
hepsi bellekte dağınık çünkü bir karma tablosu girdileri yineleme sadece anlamda çok yapmaz.
Bir ikili arama ağacı bir ile uygulanabilecek kalıcı yeni bir ağaç döndürülür ancak eski ağaç var olmaya devam arayüzü. Dikkatle Uygulanan onların düğümlerinin en eski ve yeni ağaçlar paylaşır. Bir standart karma tablo ile bunu yapamaz.
karma tablo üzerinde bir ikili ağacın ana avantajları ikili ağaç karma tabloyla size iki ek operasyonlar sen (hızlı, kolay) yapamaz sağlamasıdır
En yakın (en yakın yukarı / aşağı veya) (zorunlu olarak eşit değildir) bir rasgele anahtar değeri elemanı bulmak
sıralanmış sırada ağacın boyunca yineleme
İki bağlanır - yani sıralı düzen gerektiren şeyler yapmak kolaydır böylece ikili ağaç, sıralı bir şekilde içeriğini tutar.
karma tablolar için "sabit" kat itfa edilmiş kez ise A (dengeli) ikili arama ağacı da asimptotik karmaşıklık aslında bir üst sınırdır avantajına sahiptir: Bir uygunsuz karma işlevi varsa, lineer zamana aşağılayıcı bitebileceğini , oldukça sabit bir daha.
Sıralanmış bir şekilde verilere erişmek istiyorsanız, o zaman sıralanmış bir liste karma tabloya paralel olarak muhafaza edilmelidir. Buna iyi bir örnek Net Sözlük olduğunu. (bakınız http://msdn.microsoft.com/en-us/library/3fcwy8h6.aspx ).
Bu sadece yavaşlatan ekler yan etkisi yoktur, ancak b-ağacının daha belleğin daha büyük miktarda tüketir.
b-ağaç sıralanır Bundan başka, sonuçların aralıkları bulmak için, ya sendikaları veya birleştirmeleri gerçekleştirmek için basittir.
Diğer tüm iyi yorumlar yanı sıra:
Genel olarak Hash tabloları daha iyi önbellek davranışlarını bir ikili ağacın kıyasla daha az bellek okur gerektiren var. Verilerinizi tutan bir referans erişebilir önce karma tablo için normalde yalnızca tek bir okuma tabi. O dengeli bir varyantı ise ikili ağaç, sırasına göre bir şey gerektirir k * lg (n) bellek bazı sabiti için okur.
bir düşman senin karma fonksiyonlu biliyorsa Öte yandan, düşman performansını ciddi biçimde engellemekle, çarpışma yapmak için karma tablosunu zorunlu kılabilir. Geçici çözüm bir aileden rastgele karma-fonksiyonunu seçmek için, ancak BST bu dezavantajı yok. karma tablo basıncı çok fazla büyür, ayrıca, sık sık enlargen ve pahalı bir işlem olabilir karma tablosunu yeniden tahsis eğilimindedir. BST burada daha basit davranış vardır ve aniden çok fazla veri tahsis ve rehashing operasyonu yapmak eğilimindedir etmez.
Ağaçlar nihai ortalama veri yapısı olma eğilimindedir. Bunlar sırasına hızlı çıkarma, ekleme ve arama bilgisi, kolayca paralel işlem için ayrılabilir, listeler olarak hareket edebilir O (lg n) . Onlar hiçbir şey özellikle de, ama onlar da herhangi aşırı kötü davranış yok.
Son olarak, BSTS uygulamak çok daha kolaydır (saf) fonksiyonel diller karma tablolar ile karşılaştırıldığında ve bunların uygulanmasını (edilecek yıkıcı güncellemelerini gerektirmeyen kalıcılık yukarıda Pascal tarafından argüman).
Karma tablo başlıca avantajı, hemen hemen tüm ops yapmasıdır ~ = O (1). Ve onun çok kolay anlamak ve uygulamak. Bu verimli birçok "mülakat sorunları" çözmek yapar. u kodlama röportaj kırmak istiyorsanız, karma tablo ile iyi arkadaş olmak ;-)
BSTS da ayrıca çok kullanışlı operasyonlar olabilir O (logn) zamanında "findPredecessor" ve "findSuccessor" operasyonları (sonraki en küçük ve sonraki büyük elemanları bulmak için), sağlarlar. Hash Tablosu o zaman verimliliğinde sağlayamaz.
Aynı zamanda kullanıma bağlıdır, Hash tam eşleşme bulmak için sağlar. Eğer bir aralık için sorgulamak istiyorsanız o zaman BST seçimdir. Eğer veri e1, e 2, e3 ..... tr bir sürü olduğunu varsayalım.
karma tablo ile sabit zamanda herhangi bir öğeyi bulabilirsiniz.
Eğer E41 daha büyük ve e8 daha az aralık değerlerini bulmak istiyorsanız, BST çabuk bulabilirsiniz.
Anahtar nokta, bir çarpışmayı engellemek için kullanılan karma işlevidir. Tabii ki, biz tamamen biz zincirleme veya başka yöntemlere başvurabilir ve bu durumda bir çarpışma, kaçınamaz. Bu en kötü durumda artık alım sabit zaman yapar.
Tam kez karma tablo yine tüm unsurları üzerindeki kova boyutunu artırmak ve kopyalamak için vardır. Bu BST üzerinde mevcut olmayan ek bir maliyettir.
kimsenin işaret ettiği bir avantajı ikili arama ağacı verimli aralığı aramaları yapmak için izin vermesidir.
Benim fikir göstermek için, ben aşırı bir durumda yapmak istiyorum. kimin tuşları 0 5000 Ve aslında arasındadır sadece tek bir eleman olan ve anahtarları aralıkta olmayan 10000 diğer unsurları vardır tüm unsurları almak istediğini farz edelim. o cevap imkansız bir alt ağacı aramaz çünkü BST oldukça verimli aralık aramaları yapabilirsiniz.
Iken, nasıl bir karma tablo aralığı aramaları yapabilirsiniz? Ya O (n) her kova alanı yinelemek gerekiyor, yoksa yukarı ... 1,2,3,4 her olmadığını 5000'e var aramak zorunda. (Örnek tuşları ondalık sayılar olabilir ne için 0 ile 5000 arasındaki tuşları hakkında? Sonsuz kümesidir)
Bir cep telefonu tasarlarken bir karma tablo bir sırasız veri yapısıdır, veri depolama için mümkün olduğu kadar çok veriyi tutmak istiyorum. Bir karma tablosu sırasız veri yapısıdır - herhangi bir belirli bir sırayla unsurlarını tutmaz anlamına gelmektedir. Bir cep telefonu adres defteri bir karma tablo kullanırsanız kesinlikle alfabetik sırada değerleri görüntülemek gerekir, çünkü Yani, o zaman değerlerini sıralamak için ek bellek gerekir - bu sonuçta bir adres defteridir. Yani, bir karma tablo kullanarak aksi depolama alanı olarak kullanılacak olurdu unsurları sıralamak için bellek ayırmak zorunda. Ama ikili arama ağacı cep telefonunda hafıza veya işlem süresi sıralama kayıtları atık gerek olacaktır, sıralanmış bir veri bir ikili arama ağacı zaten sıralanır structure.Because olduğunu. Daha önce de belirttiğimiz gibi, bir ikili ağaç üzerinde bir arama veya bir ekleme yapan bir karma tablo ile yapıyor daha yavaştır ama bir cep telefonu adres defteri neredeyse 5000'den fazla girdilerine sahip asla. Girişlerin böyle küçük bir numara ile bir ikili arama ağacı O (log (n)) kesinlikle yeterince hızlı olacaktır. Yani, bütün bu bilgiler göz önüne alındığında, bir ikili arama ağacı, bir karma tablo daha iyi bir seçimdir çünkü sen, bu senaryoda kullanmalıdır veri yapısıdır.
Hash Tabloları indeksleme için iyi değildir. Eğer bir aralık için arama yaparken BSTS iyidir. Çoğu veritabanı indeksleri B + ağaç yerine Hash Tabloları kullanılmasının nedeni budur sebebidir
Gönderen Kodlama Röportajı Cracking, 6th Edition
Biz dengeli bir ikili arama ağacı (BST) ile karma tablosunu uygulayabilirsiniz. Bu bize bir O (log n) verir süresini arama. artık büyük bir dizi tahsis çünkü Bunun avantajı, potansiyel olarak, daha az yer kullanıyor. Biz de bazen yararlı olabilir sırayla anahtarlar, yineleyebilirsiniz.
Sınıflar HashSet ve Tablo sırasız koleksiyonları bulunmaktadır. Bu arayüzden açık değildir (ve başka türlü olabilir) ama hash tabloları AVL ağaçları kullanarak uygulanmıştır. Bu karma kod bir dizi (daha az çarpışma) arasında modülo azaltılabilir anlamına gelir ve aynı zamanda yapılması gereken bir dizinin bir rehashing (pürüzsüz performans) olduğu anlamına gelir. Ağaçların gelince değil tam karşılaştırıcısı - onlar sırasız koleksiyonları olması yalnızca bir işlev ve hashCode işlevi eşittir tedarik anlamına gelir. Tamamen karşılaştırılabilir veya sadece eşitlik karşılaştırılabilir olup olmadığını - Bir karma tablo Tablo <K, T> ya bir ikili ağaç Ağacı <K, T> sınıfı K bağlıdır kullanıp Yani.
Dize gibi - veri türü karşılaştırılabilir karşılaştırılabilir ve eşitlik hem durumlar vardır. Bu HashSet <String> ve Set <String> hem mümkün olduğu anlamına gelir. dizeleri karma sette aramalar dizeleri sıralı bir sette aramalarına göre yaklaşık 10 kat daha hızlı olma eğilimindedir. karşılaştırıcı pahalı ise o zaman ağaçların Hashtables oranla yavaşlatmak. karşılaştırıcı (tamsayılar ve yüzen için benzeri), hızlı ise, ağaçlar karma tabloları daha hızlı çalışacaktır.
Bir HashMap bir dizi birleştirici dizidir. Yani, giriş değerleri sizin dizisi kovalar içine toplanmış olur. Açık bir adresleme şeması, bir kovaya bir işaretçi var ve kova serbest boşluklar olduğu yerde bir kovaya yeni bir değer katmak her seferinde, öğrenmek. Eğer kova başında başlayacak bu- yapmak ve gösterici her seferinde artırır ve işgal olmadığını test etmek birkaç yolu vardır. Bu sondalama doğrusal olarak adlandırılır. Ardından, aşağı geri bir boş alan arıyor her seferinde ikiye katlamak veya kepçenin başında ve arasındaki farkı ikiye eklenti gibi bir ikili arama yapabilirsiniz. Bu sondalama kuadratik denir. TAMAM. Şimdi hem bu yöntemlerin sorunların ele kova sonraki kovalar taşar, o zaman to- gerektiğidir
TAMAM. Eğer bir LinkedList kullanırsanız ama orada böyle bir sorun doğru olması gerekmez mi? Evet, bağlantılı listelerde, bu sorun yok. Her kova düşünüldüğünde bağlantılı liste ile başlar ve bir kova içinde 100 elemanlarını varsa zaman to- alacak LinkedList dolayısıyla List.add (Eleman E) sonuna ulaşmak için bu 100 elemanlarını çapraz gerektirir etmek
LinkedList uygulamasının avantajı açık adresleme uygulama örneğinde olduğu gibi bütün kova bellek ayırma işlemini ve O (N) aktarma / kopyasına gerek kalmamasıdır.
Yani, O (K) işlemi en aza indirmek için bir yol onun değer üzerinde size dayanan kendi pozisyonunda eleman eklemek de O'dur (log (N)) ve işlemlerini bulmak nerede İkili Arama Ağacı o kadar uygulanmasını dönüştürülmesidir. Bir BST katma özelliği sıralanmış geliyor olmasıdır!
İkili arama ağaçları tuşlarının üzerinde tanımlı bazı toplam sipariş (tuşlar benzerdir) varsa ve sipariş bilgilerini korumak istiyorsanız sözlüğü uygulamak için iyi bir seçimdir.
BST sipariş bilgilerini koruduğu gibi, (verimli) karma tabloları kullanarak yapılamaz dört ek dinamik set operasyonları sağlar. Bu işlemler şunlardır:
Her TSİ işlemi gibi tüm bu işlemler O (H) zaman karmaşıklığı sahiptir. Ayrıca kayıtlı tüm tuşlar böylece sadece-sırayla ağaç geçerek anahtarların sıralanmış diziyi almak için sağlayarak BST sıralanır kalır.
Özetle, istediğiniz tüm işlemler, insert performansında (çoğu zaman) silin ve karma tablo rakipsiz sonra kaldırmak ise. Ama herhangi bir veya bir BST, tercihen bir kendini dengeleyen BST kullanmalıdır yukarıda listelenen tüm işlemleri istiyorum.
Dize anahtarları ile kullanıldığında İkili arama ağaçları daha hızlı olabilir. Özellikle dizeleri uzun zaman.
az / daha hangi karşılaştırmaları kullanılarak İkili arama ağaçları dizeleri hızlı (bunlar eşit olmadığında). bir dize bulunmazsa Yani bir BST çabuk cevap verebilir. Bu bulduğunu zaman yalnızca bir tam bir karşılaştırma yapmak gerekir.
Bir karma tablosunda. Sen dize karma hesaplamak gerekir ve bu karma hesaplamak için en az bir kez tüm bayt geçmesi gerektiği anlamına gelir. Sonra tekrar, bir girdi bulunduğunda.