Hashing conjuntos de enteros para pruebas de inclusión

10

Estoy buscando una función hash sobre los conjuntos H (.) Y una relación R (.,.) Tal que si A está incluida en B, entonces R (H (A), H (B)). Por supuesto, R (.,.) Debe ser fácil de verificar (tiempo constante) y H (A) debe calcularse en tiempo lineal.

Un ejemplo de H y R es:

  • , donde k es un entero fijo y h (x) una función hash sobre enteros.H(A)=xA1<<(h(x)modk)
  • R (H (A), H (B)) = ((H (A) y H (B)) == H (A))

¿Hay otros buenos ejemplos? (bueno es difícil de definir pero intuitivamente si R (H (A), H (B)) entonces whp A está incluido en B).

Edición posterior :

  1. Estoy buscando una familia de funciones hash. Tengo muchos juegos; 3 - 8 elementos en cada conjunto; El 90% de ellos tienen 3 o 4 elementos. El ejemplo de función hash que proporcioné no está muy bien distribuido para este caso.
  2. El número de bits de H (.) (En mi ejemplo, k) que debe ser pequeño (es decir, H (.) Debe caber en un entero o largo).
  3. Una buena propiedad de R es que si H (.) Tiene k bits, entonces R (.,.) Es verdadero para (3 ^ k - 2 ^ k) / 4 ^ k pares, es decir. por muy pocos pares.
  4. Los filtros Bloom son especialmente buenos para conjuntos grandes. Intenté usar BF para este problema, pero los resultados óptimos fueron con una sola función.

(crosspost de stackoverflow , no recibí una respuesta lo suficientemente buena)

Alexandru
fuente
"whp" sobre qué? ¿Asume que sus entradas provienen de cierta distribución?
Jukka Suomela
¿Y realmente está buscando una función hash fija única y no una familia de funciones hash?
Jukka Suomela
@ Jukka: Creo que quiere decir si R (H (A), H (B)), entonces con alta probabilidad concluimos que A es un subconjunto de B. La probabilidad se toma sobre elecciones aleatorias de A y B, así como lanzamientos internos de monedas de H y R (si corresponde).
MS Dousti
Estoy buscando una familia de funciones hash. Mis conjuntos tienden a ser pequeños (de 3 a 8 elementos cada uno; el 90% de ellos tienen 3 o 4 elementos), por lo que la función hash de ejemplo que proporcioné no está muy bien distribuida.
Alexandru
Una buena propiedad de R es que si H (.) Tiene n bits, entonces R (.,.) Es verdadero para (3 ^ n - 2 ^ n) / 4 ^ n pares, es decir. por muy pocos pares.
Alexandru

Respuestas:

10

(Esta respuesta estaba originalmente en los comentarios, pero la estoy moviendo a otra respuesta por sugerencia de Suresh).

kh1h2h3m23=1/8thunos. Hash cada conjunto al bit o de los hashes de sus elementos constituyentes. Debido a que sus conjuntos tienen de 3 a 8 elementos, los hashes resultantes estarán cerca de la mitad, lo que presumiblemente es lo que desea para mantener baja la tasa de falsos positivos.

Gn,pdkm/8m/8

Warren Schudy
fuente
Esto es particularmente bueno para grandes m (32 o 64) como usted sugirió.
Alexandru
4

mkm=64k=4

Warren Schudy
fuente
k
h1h2h3m
La ventaja de esta variación es que hace un mejor uso del paralelismo inherente a las operaciones de palabras que tienen la mayoría de las computadoras.
Warren Schudy
Warren, deberías publicar esto como respuesta. Merece algunos votos
Suresh Venkat
2
@Warren, @Suresh: Creo que tendría más sentido combinar estas dos respuestas estrechamente relacionadas y luego eliminar los comentarios. Sería más fácil de seguir, en particular porque una de las respuestas se refiere a parámetros definidos en la otra.
Jukka Suomela