İyi teorik güvenceleri olan bir tamsayıların toplanması (yani, çoklu kümeler) için bir karma işlevi var mı?


36

İdeal olarak, aşağıdaki özelliklere sahip olan çoklu küme tam sayı kümesini saklamanın bir yolu olup olmadığını merak ediyorum:

  1. O (1) alanı kullanır
  2. Bir ekleme veya silme işleminin O (1) sürede yansıtılması için güncellenebilir
  3. İki özdeş koleksiyon (yani aynı çokluğa sahip aynı öğelere sahip olan koleksiyonlar) her zaman aynı değere sahip olmalı ve iki ayrı koleksiyon yüksek olasılıkla farklı değerlere sahip olmalıdır (yani, işlev bağımsız veya ikili bağımsızdır)

Bu konuda ilk girişim, ürün modülünü, bireysel elemanların hashlarının rastgele bir asalını depolamak olacaktır. Bu, 1 ve 2'yi tatmin eder, ancak yakın bir varyasyonun 3 yerine getirip getirmeyeceği açık değildir.

Bunu aslında StackOverflow'a gönderdim .

* Özellikler 1 ve 2, örneğin O (log n) veya küçük bir sublinear polinom için biraz gevşetilebilir. Mesele şu ki, çoklu kümeleri tanımlayıp tanımlayamayacağımızı ve elemanları kendileri saklamadan eşitliği güvenilir bir şekilde test edip edemeyeceğimizi görmek.


Çoklu cihaz gösterimi nedir? Yani bir multiset'i bit dizgisi olarak nasıl kodlarsınız? Eğer gerçekten O(1) zamanlı işlemler yapmak istiyorsanız (multiset'in boyutundan bağımsız olarak), kodlamayı açık bir şekilde yapmanız gerektiğini düşünüyorum.
Jukka Suomela

Setlerin kodlanması önemsizdir. Karma işlevi kümelerin temsilinden bağımsız olmalıdır. Bir karma kümenin kanonik bir gösterimini kullanıyor olsaydım, kümenin bit gösterimi üzerindeki herhangi bir standart karma, 3 ve muhtemelen 1 olur; ancak 2 olmazdı. İki eşit koleksiyonun her zaman aynı değere sahip olması gerektiğini eklemeliyim.
jonderry

Tam olarak ne demek 2 ile? Eski seti, eski karma kodunu ve yeni öğeyi alıyor musunuz ve yeni karma kodunu hesaplamak istiyor musunuz? Yoksa sadece eski karma kodu ve yeni elemanı mı alıyorsunuz?
Mihai

İdeal olarak, eski sete ihtiyacınız olmaz. Üye sorgusu (önemli, alan sınırları verilen), sadece eşitlik testi, muhtemelen yanlış pozitif olasılığı düşük olan hash değerlerini karşılaştırarak gerçekleştirmeniz gerekmiyor.
jonderry

Yanıtlar:


17

Eğer evrende yaşadığımızı setlerinin düşünürsek , oldukça kolay olan sorunu çözmek için Ç ( lg u ) güncelleme zamanında. İhtiyacınız olan tek şey hızlı "yerel güncellemeler" ile u sayılarının bir vektör için hızlı bir karma işlevidir .[u]O(lgu)u

p bir [ s ] i , bir i O ( lg i ) u u O ( u / p ) p p = u 2 [ u ]h(x)=(i=1uxiai)modppa[p]iaiO(lgi)uuO(u/p) . Bu, yeterince büyük olmasıyla çok küçük yapılabilir (örneğin, ve "çifte hassasiyette çalışıyorsunuz). Eğer kümeler dan çok daha küçükse , elbette evreni daha küçük bir evrene indirerek başlayabilirsiniz.pp=u2[u]

menziline girerken çarpışma olasılığı olan bir çözüm bilen var mı ? Bu mümkün olmalı.[ p ]O(1/p)[p]


0

Carter ve Wegman bunu New hash fonksiyonlarında ve bunların doğrulama ve ayarlı eşitlikteki kullanımlarında ; tarif ettiğinize çok benzer. Temel olarak değişmeli bir karma işlevi, ekleme ve silme işlemleri için her seferinde bir öğe ve O (1) 'de yüksek olasılık eşleşmeleri için güncellenebilir.


Bence bu sadece setler üzerinde çalışır, multisets'e değil (sorulan soruya göre). Bölüm 5'ten, sayfanın altındaki 274: "EKLE (x, S) - x öğesini S adlı gruba ekler. Bu işlem, x'in zaten S üyesiyse kullanılamaz."
jbapple

Haklısın; "Çok" kısmını özledim. Bir karma işlevinin yinelenenleri işlemesi muhtemel görünüyor, ancak bunun için bir alıntı yapmadım.
KWillets

-2

Bir karma işlevinin kalitesi her zaman, sahip olması gereken öğelerin özelliklerine bağlı olacaktır. Bununla ilgili bir şey söyleyebilir misin? Örneğin, multiset'inizin x_i öğeleri tipik olarak birçok küçük ana faktöre sahipse, ürün öneriniz muhtemelen zayıf bir karma işlevidir. Ancak bu durumda, bazı p ve q için tüm x_i + p mod q ürünlerini alarak basitçe iyileştirebilirsiniz.


1
Evet, ayrı ayrı öğelerin karma değerlerini, çoğalmadan önce almalarının nedeni budur.
jonderry

Ne? OP'nin önerisi, hepsini bir arada çarpmaktır, değil mi? Bunu yapmadan önce her birine bir sabit eklerseniz, muhtemelen daha iyi bir karma elde edersiniz.
TonyK

-5
A = 0x4F1BBCDD
B = 0x314EFB75
A*B = 1 
N = size of set before addition/removal<P>
Add X
H = (H-N)*B
U = H >> 16
V = H & 0xFFFF
H = (((U+X)&M)<<16) + ((V^X)&M)
H *= A
H += N+1

Remove X
H = (H-N)*B
U = H >> 16
V = H & 0xFFFF
H = (((U-X)&M)<<16) + ((V^X)&M)
H *= A
H += N-1

toplam, aynı değerde birden fazla oluşum elde
etmemize izin verir, xor aynı miktarda toplanan kümeler elde etmemize izin verir.

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.