Szukam funkcji skrótu nad zestawami H (.) I relacją R (.,.) Tak, że jeśli A jest zawarte w B, to R (H (A), H (B)). Oczywiście R (.,.) Musi być łatwe do zweryfikowania (czas stały), a H (A) należy obliczyć w czasie liniowym.
Jednym z przykładów H i R jest:
- , gdzie k to stała liczba całkowita, a h (x) funkcja skrótu nad liczbami całkowitymi.
- R (H (A), H (B)) = ((H (A) i H (B)) == H (A))
Czy są jakieś inne dobre przykłady? (dobro jest trudne do zdefiniowania, ale intuicyjnie, jeśli R (H (A), H (B)), to whp A jest uwzględnione w B).
Późniejsza edycja :
- Szukam rodziny funkcji skrótu. Mam wiele zestawów; 3 - 8 elementów w każdym zestawie; 90% z nich ma 3 lub 4 elementy. Przykładowa funkcja skrótu, którą podałem, nie jest zbyt dobrze rozłożona w tym przypadku.
- Liczba bitów H (.) (W moim przykładzie k), które powinny być małe (tj. H (.) Musi mieścić się w liczbie całkowitej lub długiej).
- Jedną fajną właściwością R jest to, że jeśli H (.) Ma k bitów, to R (.,.) Jest prawdziwe dla par (3 ^ k - 2 ^ k) / 4 ^ k, tj. dla bardzo niewielu par.
- Filtry Bloom są szczególnie dobre w przypadku dużych zestawów. Próbowałem użyć BF do tego problemu, ale optymalne wyniki były tylko z jedną funkcją.
(crosspost z stackoverflow , nie otrzymałem wystarczająco dobrej odpowiedzi)
ds.algorithms
hash-function
Alexandru
źródło
źródło
Odpowiedzi:
(Ta odpowiedź była pierwotnie w komentarzach, ale przenoszę ją do osobnej odpowiedzi według sugestii Suresha).
W przypadku aplikacji z bardzo małymi zestawami prawdopodobnie chcesz, aby liczba funkcji mieszania Blooma była dość duża, aby zminimalizować liczbę wyników fałszywie dodatnich. Aby zaoszczędzić czas obliczeń, sugeruję następującą odmianę filtra Blooma. Załóżmy, że masz trzy tradycyjne funkcje skrótu , , dla elementów, z których każdy wytwarza ciągi bitowe. Hashuj każdy element do bitowej i tych trzech funkcji skrótu. Wynikowe wartości skrótu elementu będą wynosić okołok h1 h2 h3 m 2−3=1/8th te. Mieszaj każdy zestaw bitowo lub skrótami jego elementów składowych. Ponieważ twoje zestawy zawierają 3-8 elementów, wynikowe wartości skrótu będą znajdować się w sąsiedztwie wartości połowy, co jest prawdopodobnie tym, co chcesz najlepiej utrzymać na niskim poziomie fałszywie dodatnich wyników.
Różnica między powyższym schematem polega na tym, że tradycyjny filtr Blooma jest analogiczny do różnicy między klasycznym modelem losowym Erdos a losowymi wykresami nieregularnymi. Powyższy schemat ma efektywną liczbę skrótów Blooma różni się nieco wokół średniej ale jest dość duży, więc ta różnica nie powinna mieć znaczenia.Gn,p d k m/8 m/8
źródło
Spróbowałbym użyć filtra Blooma jako skrótu z relacją taką samą, jak twoja propozycja. Obliczenie najlepszego rozmiaru filtra liczby funkcji skrótu dla twojej aplikacji nie powinno być zbyt trudne; inspirację znajdziesz w artykule Bloom Bloom w Wikipedii . W zależności od tego, jak bardzo chcesz uniknąć fałszywych alarmów, wystarczy coś takiego jak i .m k m=64 k=4
źródło