Hashing set di numeri interi per i test di inclusione


10

Sto cercando una funzione hash sugli insiemi H (.) E una relazione R (.,.) Tale che se A è incluso in B, allora R (H (A), H (B)). Naturalmente, R (.,.) Deve essere facile da verificare (tempo costante) e H (A) deve essere calcolato in tempo lineare.

Un esempio di H e R è:

  • , dove k è un numero intero fisso e h (x) una funzione hash su numeri interi.H(A)=xA1<<(h(x)modk)
  • R (H (A), H (B)) = ((H (A) & H (B)) == H (A))

Ci sono altri buoni esempi? (buono è difficile da definire ma intuitivamente se R (H (A), H (B)) allora whp A è incluso in B).

Modifica successiva :

  1. Sto cercando una famiglia di funzioni hash. Ho molti set; 3 - 8 elementi in ogni set; Il 90% di essi ha 3 o 4 elementi. La funzione hash di esempio che ho fornito non è molto ben distribuita per questo caso.
  2. Il numero di bit di H (.) (Nel mio esempio, k) che dovrebbe essere piccolo (es. H (.) Deve rientrare in un numero intero o lungo).
  3. Una bella proprietà di R è che se H (.) Ha k bit allora R (.,.) È vero per le coppie (3 ^ k - 2 ^ k) / 4 ^ k, cioè. per pochissime coppie.
  4. I filtri Bloom sono particolarmente adatti per set di grandi dimensioni. Ho provato a usare BF per questo problema, ma i risultati ottimali erano con una sola funzione.

(crosspost da StackOverflow , non ho ricevuto una risposta abbastanza buona)


"whp" su cosa? Pensi che i tuoi input provengano da una certa distribuzione?
Jukka Suomela,

E stai davvero cercando una singola funzione hash fissa e non una famiglia di funzioni hash?
Jukka Suomela,

@Jukka: penso che significhi se R (H (A), H (B)), quindi con alta probabilità concludiamo che A è un sottoinsieme di B. La probabilità è presa su scelte casuali di A e B, nonché lanci di monete interne di H e R (se presenti).
MS Dousti,

Sto cercando una famiglia di funzioni hash. I miei set tendono ad essere piccoli (3 - 8 elementi ciascuno; il 90% di essi ha 3 o 4 elementi) quindi la funzione di hash di esempio che ho dato non è molto ben distribuita.
Alexandru,

Una bella proprietà di R è che se H (.) Ha n bit allora R (.,.) È vero per le coppie (3 ^ n - 2 ^ n) / 4 ^ n, cioè. per pochissime coppie.
Alexandru,

Risposte:


10

(Questa risposta era originariamente nei commenti ma la sto spostando in una risposta separata su suggerimento di Suresh.)

kh1h2h3m23=1/8thquelli. Hash ogni set al bit per bit o degli hash dei suoi elementi costitutivi. Poiché i tuoi set hanno 3-8 elementi, gli hash risultanti saranno vicini a quelli della metà, il che è presumibilmente ciò che vuoi mantenere al meglio il tasso di falsi positivi.

Gn,pdkm/8m/8


Questo è particolarmente utile per grandi m (32 o 64) come hai suggerito.
Alexandru,

4

mkm=64k=4


k

h1h2h3m

Il vantaggio di questa variazione è solo che fa un uso migliore del parallelismo insito nelle operazioni a parola che la maggior parte dei computer ha.
Warren Schudy,

Warren, dovresti pubblicare questo come risposta. Merita alcuni voti
Suresh Venkat,

2
@Warren, @Suresh: penso che avrebbe più senso combinare queste due risposte strettamente correlate, e quindi eliminare i commenti. Sarebbe più facile da seguire, in particolare poiché una delle risposte si riferisce a parametri definiti nell'altra.
Jukka Suomela,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.