Verimli tekrarlanan eklemeler için veri yapısını ayarlama


11

Kelime boyutu öğelerinin kümelerini (tekrarlama yok) tutan ve hızlı yerleştirmeyi (amortisör O (1)) destekleyen, alan açısından verimli bir veri yapısı arıyorum. "Yer tasarruflu" ile, ideal olarak, elemanlarını saklamak için kelimeleri kastediyorum .nn+o(n)n

Küme olmak sorunun önemli bir parçasıdır: her öğe kez eklenirse kullanılan alan n log n olamaz .lognnlogn

Yapı ayrıca öğelerinin listelenmesini de desteklemelidir (verimli bir şekilde); aklı başında herhangi bir yapının burada sıkıntı yaşamaması gerekir. (Hızlı üyelik sorguları bir artıdır.)


2
Karma tablonun hile yapmamasının bir nedeni var mı?
Dave

@Dave: Bunu alan gereksinimini karşılama olarak düşünmüyorum, ancak sanırım yeterince katı bir dinamik yeniden boyutlandırma programı işe yarayabilir. Ama genellikle kod yazmadan önce neler olduğunu görmek isterim.
Charles

1
Dinamik yeniden boyutlandırma ile amortismanlı elde etmek için, boyutu n + o ( n ) ile tam olarak karşılamak istiyorsanız, alan gereksinimini karşıladığını düşünmediğim sabit bir oranla büyütmeniz gerekir . Ö(1)n+Ö(n)
Dave

Tamam, bu saçma-ama evrenin sabit boyut (wordsize öğeleri) olduğu göz önüne alındığında biraz hatta tam bit vektör bir büyüklüğe sahip olacaktır olduğu ...Ö(1)
Magnus Lie Hetland

@Magnus: Sanırım sorudaki O- ve o-notasyonlarının arkasındaki gerçek fonksiyonların kelime boyutuna bağlı olmadığı anlamına geliyor.
Tsuyoshi Ito

Yanıtlar:


10

Bence Raman ve Rao'nun "Özlü Dinamik Sözlükler ve Ağaçlar" belirttiğiniz sınırlara uyuyor. Özetden:

Önce bir kümenin temsilini veriyoruz içinde destekleri üyelik sorguları o O ( 1 ) en kötü durum zaman ve gelen / silme içine eklemeler S in O ( 1 ) itfa edilmiş zaman beklenen. Gösterim B + o ( B ) bitlerini kullanır, burada B = l g ( mSU={0,...,m-1},|S|=nÖ(1)SÖ(1)B+Ö(B)temsil etmek bilgiler-teorik asgari alanıdırS.B=lg(mn)S


Harika görünüyor. (Kabul etmeden önce makaleyi okuduğumu anlayacaksınız, değil mi?)
Charles

1

Uygulamanız bazı yanlış pozitifleri tolere edebilirse, bir Bloom filtresi kullanmayı düşünmelisiniz .

Vikipedi'nin Açıklaması: Bloom filtresi, bir öğenin bir kümenin üyesi olup olmadığını test etmek için kullanılan, yerden tasarruf sağlayan olasılıklı bir veri yapısıdır. Yanlış pozitifler mümkündür, ancak yanlış negatifler mümkün değildir. Öğeler kümeye eklenebilir, ancak kaldırılamaz. Sete ne kadar çok eleman eklenirse, yanlış pozitif olasılığı o kadar büyük olur.


Benimki mükemmel bir veri yapısı için +1 değil.
Charles
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.