Czy istnieje funkcja skrótu dla zbioru liczb całkowitych (tj. Wielu), która ma dobre gwarancje teoretyczne?


36

Ciekawe, czy istnieje sposób przechowywania skrótu zbioru liczb całkowitych, który ma następujące właściwości, najlepiej:

  1. Wykorzystuje spację O (1)
  2. Można go zaktualizować, aby odzwierciedlał wstawianie lub usuwanie w czasie O (1)
  3. Dwie identyczne kolekcje (tj. Kolekcje, które mają te same elementy o tych samych wielokrotnościach) zawsze powinny mieć skrót do tej samej wartości, a dwie odrębne kolekcje powinny mieć skrót do różnych wartości z dużym prawdopodobieństwem (tj. Funkcja jest niezależna lub parami niezależna)

Jedną z początkowych prób byłoby przechowywanie modulo produktu losowej liczby pierwszych skrótów poszczególnych elementów. Spełnia to 1 i 2, ale nie jest jasne, czy to, czy też ścisła odmiana, spełnia 3.

Pierwotnie opublikowałem to na StackOverflow .

* Właściwości 1 i 2 można nieco rozluźnić, powiedzmy, O (log n) lub mały podliniowy wielomian. Chodzi o to, czy możemy zidentyfikować wiele zestawów i rzetelnie przetestować równość bez przechowywania samych elementów.


Jaka jest twoja reprezentacja multisets? To znaczy, jak kodujesz multiset jako ciąg bitowy? Jeśli naprawdę chcesz uzyskać operacje w czasie (niezależnie od rozmiaru multisetu), myślę, że powinieneś jawnie kodować. O(1)
— Jukka Suomela

Kodowanie zbiorów nie jest ważne. Funkcja skrótu powinna być niezależna od reprezentacji zbiorów. Gdybym używał kanonicznej reprezentacji zbioru skrótów, to każdy standardowy skrót w reprezentacji bitowej zbioru spełniałby 3, a prawdopodobnie 1, ale nie 2. Powinienem dodać, że dwie równe kolekcje powinny zawsze mieć skrót o tej samej wartości.
— poniedziałek

Co dokładnie masz na myśli przez 2? Czy masz stary zestaw, stary kod skrótu i ​​nowy element i chcesz obliczyć nowy kod skrótu? A może dostajesz tylko stary kod skrótu i ​​nowy element?
— Mihai

Idealnie nie byłby potrzebny stary zestaw. Nie musisz nawet być w stanie wykonywać zapytań członkowskich (ważne, biorąc pod uwagę ograniczenia miejsca), po prostu testować równość, prawdopodobnie poprzez porównywanie wartości skrótu, które mają małe prawdopodobieństwo fałszywie dodatniego.
— poniedziałek

Odpowiedzi:


17

Jeśli uważasz, że zestawy żyją we wszechświecie , dość łatwo jest rozwiązać problem z czasem aktualizacji O ( lg u ) . Wszystko czego potrzebujesz to szybka funkcja skrótu dla wektora liczb u , z szybkimi „lokalnymi aktualizacjami”.[u]O(lg⁡u)u

, gdzie p jest wystarczająco dużą liczbą pierwszą, a a jest równomiernie narysowane z [ p ] . Po dodaniu lub usunięciu elementu I , trzeba dodać / odjąć a ja z kodu skrótu, który zajmuje O ( lg í ) czas korzystania dziel i rządź do potęgowania. Ponieważ wielomian stopnia uh(x→)=(∑i=1uxiai)modppa[p]iaiO(lg⁡i)umoże mieć tylko pierwiastki , prawdopodobieństwo zderzenia dla dwóch różnych zbiorów wynosi O ( u / p ) . Można to zrobić bardzo małe, przyjmując, że p jest wystarczająco duże (na przykład p = u 2 i pracujesz w „podwójnej precyzji”). Jeśli zestawy są znacznie mniejsze niż [ u ] , możesz oczywiście rozpocząć od skrócenia wszechświata do mniejszego wszechświata.uO(u/p)pp=u2)[u]

Czy ktoś zna rozwiązanie z prawdopodobieństwem kolizji przy mieszaniu do zakresu [ p ] ? To powinno być możliwe.O(1/p)[p]


0

Carter i Wegman opisują to w nowych funkcjach skrótu oraz ich zastosowaniu w uwierzytelnianiu i ustawianiu równości ; jest bardzo podobny do tego, co opisujesz. Zasadniczo komutatywną funkcję skrótu można aktualizować pojedynczo dla wstawiania i usuwania oraz dopasowań o wysokim prawdopodobieństwie w O (1).


Myślę, że działa to tylko na zestawach, a nie na multisetach (jak zadawane pytanie). Z sekcji 5, na dole strony 274: „DODAJ (x, S) - Dodaje element x do zestawu o nazwie S. Tej operacji nie można użyć, jeśli x jest już członkiem S.”
— jbapple,

Masz rację; Brakowało mi części „multi”. Wydaje się prawdopodobne, że funkcja skrótu poradziłaby sobie z duplikatami, choć nie mam na to żadnych wzmianek.
— KWillets,

-2

Jakość funkcji skrótu zawsze będzie zależeć od właściwości elementów, które musi mieszać. Czy możesz coś o tym powiedzieć? Na przykład sugestia produktu jest prawdopodobnie słabą funkcją skrótu, jeśli elementy x_i multiset zwykle mają wiele małych czynników pierwszych. Ale możesz to poprawić w tym przypadku, po prostu biorąc iloczyn wszystkich x_i + p mod q dla niektórych liczb pierwszych p i q.


1
Tak, to jest powód do zebrania skrótów poszczególnych elementów przed ich pomnożeniem.
— poniedziałek

Co? Sugestią PO jest po prostu pomnożenie ich wszystkich razem, prawda? Mówię, że jeśli dodasz stałą przed każdym z nich, prawdopodobnie uzyskasz lepszy skrót.
— 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

suma pozwala nam mieć wiele wystąpień o tej samej wartości
xor pozwala nam mieć zestawy tej sumy na tę samą kwotę

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.