Özlü Veri Yapısı algoritmaları için iyi bir genel bakış gerekiyor


14

(zaten ana sitede sorulmuş , ancak burada daha iyi kapsama alanı istemek için üzgünüm)

Ben haberi yana Özlü Veri Yapıları o bölgede en son gelişmeleri iyi bir genel umutsuz ihtiyacı var.

Google'ı kafamın üstünden gelen isteklerde google sonuçlarında görebildiğim birçok makaleyi googled ve okudum. Burada önemli bir şeyi kaçırdığımdan şüpheleniyorum.

İşte benim için özel konular:

  1. İkili ağaçların öz, sol / sağ çocuk, bir alt ağaçtaki eleman sayısı etkin işlemlerle özlü kodlanması.

    Buradaki ana soru şöyledir: bildiğim tüm yaklaşımlar, ağaç düğümlerinin nefes birinci sırada numaralandırıldığını varsayar (bu alandaki öncü çalışmalarda olduğu gibi Jacobson, G. J (1988). Özlü statik veri yapıları). görevim için uygun görünüyor. Derinlik-ilk düzende verilen büyük ikili ağaçlarla ilgileniyorum ve derinlik-ilk düğüm endeksleri diğer düğüm özelliklerinin anahtarlarıdır, bu yüzden ağaç düzenini değiştirmek benim için en aza indirmek istediğim bir maliyete sahiptir. Bu nedenle, BF dışındaki diğer ağaç düzenlerini dikkate alarak çalışmalara referans alma ilgisi.

  2. Harici bellekteki büyük değişken uzunluklu öğeler diziler. Diziler değişmez: Öğeleri eklemek / silmek / düzenlemek zorunda değilim. Tek gereksinim O (1) eleman erişim süresidir ve mümkün olduğunca düşük ek yük, basit ofset ve boyut yaklaşımından daha iyidir. Görevim için tipik veriler hakkında topladığım bazı istatistikler:

    tipik ürün sayısı - yüz milyonlarca, on milyarlarca kişiye kadar;

    öğelerin yaklaşık% 30'unun uzunluğu 1 bit'ten fazla değildir ;

    % 40-% 60 ürünün uzunluğu 8 bit'ten azdır;

    öğelerin yalnızca birkaç yüzdesi 32 ila 255 bit arasında bir uzunluğa sahiptir (255 bit sınırdır)

    ortalama madde uzunluğu ~ 4 bit +/- 1 bit.

    madde uzunluklarının başka herhangi bir dağılımı teorik olarak mümkündür, ancak pratik olarak ilginç tüm vakaların yukarıda açıklanan istatistiklere yakın istatistikleri vardır.

Herhangi bir karmaşıklığa sahip makalelere bağlantılar, herhangi bir belirsizliğin öğreticileri, az ya da çok belgelenmiş C / C ++ kütüphaneleri - benzer görevlerde sizin için yararlı olan ya da eğitimli tahmininizle böyle görünen her şey - minnetle takdir edilmektedir.

Güncelleme : 1. soruya eklemeyi unuttum: uğraştığım ikili ağaçlar değişmez. Onları değiştirmek için hiçbir gereksinimim yok, ihtiyacım olan tek şey onları çeşitli şekillerde her zaman düğümden çocuklara veya ebeveyne hareket ettirmek, böylece bu tür işlemlerin ortalama maliyeti O (1).

Ayrıca, tipik ağacın milyarder düğümleri vardır ve RAM'de tam olarak saklanmamalıdır.

Yanıtlar:


12

Pratikte etkili olan özlü harici bellek veri yapılarıyla ilgilendiğinizi varsayıyorum. Bu durumda, muhtemelen birkaç temel teknik ve bazı mühendislik ile istediğinizi elde edebilirsiniz.

Ağaçlar için, Arroyuelo ve ark.: Succinct Trees in Practice . Kağıt, ana bellekteki ağaçlar ile ilgilidir, ancak tekniklerin çoğu, aşağıdaki gibi benzer seçeneklerle harici bellekte kullanılabilir.

İkinci sorunuza gelince, en önemli seçenek öğeler için hangi kodlamayı kullandığınıza karar vermektir. Açıkladığınız dağıtım göz önüne alındığında, önce -codes veya -codes kullanmayı denerdim . Kodlamayı seçtiğinizde, sonraki adım diziyi boyutu bloklarında kodlamaktır , burada blok boyutu seçilir, böylece boyutu rastgele disk okumaları pratikte etkilidir.γδBB

Doğru bloğu hızlı bir şekilde bulmak için, ana bellekte bulunan bir rütbe sözlüğüne ihtiyacınız vardır. Sahip olduğu varsayıldığında öğeleri, bir ikili dizi inşa uzunluğu , nereye öğe IFF yeni bir blok başlar. Boşluk kodlaması diziyi iyi sıkıştırır; Gupta vd .: Sıkıştırılmış veri yapıları: sözlükler ve veri farkında önlemler bu endekse bir örnek verir. öğesini bulmak istiyorsanız , blok almanız ve öğeyi almak için kodunu çözmeniz gerekir.nSnS[ben]=1benjrbirnk(j)

Rütbe endeksini küçük tutmak istiyorsanız, blok boyutunu oldukça büyük (muhtemelen kilobayt veya onlarca kilobayt) yapmanız gerekir, bu da yukarıdaki temel çözümü CPU yoğun hale getirir. Bu, diskte saklanan bloklara biraz ek yük eklenerek çözülebilir. Temel olarak aynı çözümü özyinelemeli olarak uygularsınız, böylece her disk bloğu bir dizi küçük bloğu ve başka bir sıralama dizinini depolar. Doğru disk bloğunu aldığınızda, tüm bloğun kodunu çözmek yerine kodu çözülecek doğru küçük bloğu bulmak için içindeki sıralama dizinini kullanırsınız. Bu ikincil endeksle, rasgele erişimler muhtemelen mevcut en hızlı katı hal sürücülerle bile G / Ç'ye bağlı hale gelir.

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.