İşlevsel sözlük veri yapısını nasıl seçerim?


10

Aşağıdaki veri yapıları hakkında biraz okudum:

  • Bagwell'in İdeal Karma Denemeleri
  • Larson's Dynamic karma tabloları
  • Kırmızı-Siyah ağaçlar
  • Patricia ağaçları

... ve eminim dışarıda bir sürü başka var. Her birinin neye daha uygun olduğuna ya da neden birini diğerine tercih ettiğime dair çok az şey gördüm. İşte, bu satırlar boyunca birkaç soru:

  1. Hangi işlevsel sözlük veri yapılarının bilinmesi önemlidir?
  2. Bu yaklaşımların artıları ve eksileri nelerdir?
  3. Daha zorunlu bir veri yapısı kullanmak ne zaman mantıklıdır?

2 ve 3 rakamları daha önemli olanlardır. :-)


İlgili: Okasaki'den bu yana tamamen işlevsel veri yapılarındaki yenilikler neler? (Bu soru sadece sözlüklerle sınırlı değildir.)
Tsuyoshi Ito

Bu soru (3 numaralı madde dışında) [büyük liste] hissine sahiptir.
Kaveh

2
yukarıdaki bağlantılı sorunun endişelerinizi ele alıp almadığını bilmek faydalı olacaktır, eğer değilse neden olmasın?
Suresh Venkat

@Suresh - Bu 1 numaraya cevap veriyor, ancak 2 ve 3 daha önemli olanlardı. Çoğunlukla daha büyük bir incelemeye bakıyorum, böylece hangilerinin daha derinlemesine incelenmeye değer olduğunu belirleyebilirim.
Jason

2
tamam. bu yüzden soruyu düzenlemeye değer olabilir.
Suresh Venkat

Yanıtlar:


16

Kaybolmadan # 2'ye gerçekten cevap veremiyorum (bu yapıları karşılaştırabileceğiniz çok fazla boyut var), ancak # 3 için cevap oldukça basit.

Aşağıdaki şartlar altında zorunlu bir veri yapısı kullanın: (a) kesinlikle takma ad yoksa veya (b) etkin yayın için gerçekten takma ad kullanmanız gerekiyorsa.

Veri yapınızın hiçbir şekilde örtüşmesi yoksa, işlevsel veri yapılarının kalıcı olmasından yararlanamazsınız. Yani maliyetini ödemek için hiçbir sebep yok. Bu tavsiyede iki uyarı vardır. Birincisi, fonksiyonel bir veri yapısının uygulanmasının basitliğini tercih edebilirsiniz: fonksiyonel bir kırmızı-siyah ağaç için silme uygulamak sizi lanetlendirir, ancak üst işaretçilerle zorunlu bir kırmızı-siyah ağaçta silme uygulamak intiharı düşündürür. İkincisi, ödevler gc'd dilinde beklediğinizden daha pahalı olabilir, çünkü yazımlar veri yapılarını genç neslin dışına taşıyabilir. Gerçekten iyi bir önbellek efektleri ve gc teorimiz yok, bu yüzden kıyaslama yapmaktan başka seçeneğiniz yok.

İkincisi, bir yayın kanalına ihtiyacınız varsa, paylaşılan bir veri yapısı bunu yapmak için mükemmel bir yoldur. Sürekli zamanlı bir güncelleme ile, diğer birçok kişiye keyfi olarak bir değerin değiştiğini söyleyebilirsiniz. (Bu yüzden sendika bulma bu kadar büyük bir veri yapısıdır.) Tamamen işlevsel bir kurulumla, ya diğer tüm insanları değiştirmeniz ya da onlara manuel olarak kodladığınız bir duruma soyut işaretçiler vermeniz gerekir (bu bir tür obtuse) yapılacak şey).

Ya takma ad ve nesne sahipliği hakkında mantık yürütmek istemiyorsanız veya aynı veri yapısının birden çok sürümüne ihtiyacınız varsa (hem yeni hem de eski bir sürüme ihtiyacınız var demektir), yalnızca işlevsel bir veri yapısı kullanın.

Bu tavsiyeyi takiben en zor bulduğum yer grafik algoritmalarıyla. Gerçekten zarif zorunlu grafik algoritmaları vardır, ancak genellikle kalıcılık istediğiniz durumdur (örneğin derleyiciler yazarken). İnsanlar tipik olarak farkı ayırmaya ve havalı zorunluluk algoritmasını kullanmaya çalışırlar, ancak kalıcılığı elde etmek için versiyonlamayı yana yatırmaya çalışırlar. Bu genellikle oldukça korkunç, hatalarla dolu ve zorunlu algoritmanın performans avantajını kaybetmeye eğilimlidir.


2
bu bağlamda örtüşme nedir?
Suresh Venkat

6
Diğer ad, aynı veri parçasına birden çok referansınız olduğunda olur. Bu veriler değiştirilebilirse, onu kullanan bir program hakkında akıl yürütme, ona erişebilecek ve değiştirebilecek diğer tüm alt programları açıkça dikkate almalıdır. Bu veri parçası değiştirilemezse, o zaman onu kullanan bir program hakkında yerel olarak akıl yürütebilirsiniz, takma adı yok sayılır, çünkü verilere erişebilecek kimsenin verileri değiştiremeyeceğini biliyorsunuzdur.
Neel Krishnaswami

"ancak ana işaretçilerle zorunlu bir kırmızı-siyah ağaçta silme uygulamak sizi intihar etmeyi bırakacaktır" Sedgewick'in sola yaslanmış kırmızı-siyah ağaçlarına göz atın. Genel silme durumu standart bir hile ile silme-min'e indirgenir ve silme-min'in kendisi LLRB ağaçları için çok basittir. Üst işaretçi gerekmez.
Vognsen

1
"Bu genellikle oldukça korkunç, hatalarla dolu ve zorunlu algoritmanın performans avantajını kaybetmeye eğilimlidir." Norman Ramsey'in optimize edici bir derleyicide kontrol akış grafikleri için fermuar kullanma konusundaki makalesi, zorlayıcı bir uzlaşmaya örnek teşkil etmektedir. Bir CFG'deki temel bloklar arasında referansların kolay ve verimli yerinde yeniden kablolanmasını desteklemek için etkili bir şekilde yerel bir yığınınız vardır, ancak temel blokların içeriğinin manipülasyonu işlevseldir (veya fermuarların felsefi görünümünüze bağlı olarak yarı işlevseldir).
Vognsen Per

1

Hangi işlevsel sözlük veri yapılarının bilinmesi önemlidir?

Yüksekliği dengelenmiş ikili ağaçlar ve bunların denemeleri çok yönlü bir uzlaşmadır. Ayrıca:

  • Patricia ağaçları.
  • Hash deniyor.

Bu yaklaşımların artıları ve eksileri nelerdir?

Yüksekliği dengeli ikili ağaçlar ve bunların denemeleri, atomik anahtarlar için çok yönlü bir uzlaşmadır. Denemeler, sıralı anahtarlar için aynıdır, örneğin dize anahtarları.

Patricia ağaçları birkaç kat daha hızlı olabilir, ancak yalnızca tamsayı tuşlarına izin verir.

Karma denemeler dengeli ikili ağaçlardan birkaç kat daha hızlı olabilir, özellikle de karma karşılaştırmadan daha ucuzsa ve polimorfizmin bir yükü varsa (örn. .NET üzerinde dizeler) ve yığına işaretçiler yazmak hızlıdır (örneğin, JVM ve CLR gibi VM'ler işlevsel diller yerine zorunlu diller için optimize edilmiştir). Hash, mutasyonun dahili optimizasyon olarak kullanılmasına da izin verir.

Kırmızı-siyah ağaçlar daha az önemlidir, çünkü yükseklik dengeli ağaçlara göre önemli bir faydaları yoktur, ancak verimli birleşme, kavşak ve farklılığa izin vermedikleri önemli dezavantajlara sahiptirler.

Benzer şekilde, parmak ağaçları pratikte çok daha iyi değildir.

Daha zorunlu bir veri yapısı kullanmak ne zaman mantıklıdır?

Sözlüğünüz bir kez doldurulduktan sonra yalnızca aramalar için kullanıldığında, yani dondurulmuş.

Performansa ihtiyacınız olduğunda (.NET gibi iyi bir karma tablo Dictionarygenellikle herhangi bir genel işlevsel sözlükten 10-40 × daha hızlıdır).

Zayıf bir sözlüğe ihtiyacınız olduğunda, bilinen tamamen işlevsel bir zayıf sözlük yoktur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.