Perfecto hash mínimo para combinaciones matemáticas.
Primero, define dos enteros.N
yK
, dóndeN >= K
, ambos conocidos en tiempo de compilación. Por ejemplo:N = 8
yK = 3
.
A continuación, define un conjunto de enteros.[0, N)
(o[1, N]
Si eso hace que la respuesta sea más simple) y llámala.S
. Por ejemplo:{0, 1, 2, 3, 4, 5, 6, 7}
El número de subconjuntos deS
conK
Los elementos están dados por la fórmula.C(N, K)
. Ejemplo
Mi problema es este: crea un hash mínimo perfecto para esos subconjuntos. El tamaño de la tabla hash de ejemplo seráC(8, 3)
o56
.
No me importa el ordenamiento, solo que haya 56 entradas en la tabla hash y que puedo determinar el hash rápidamente de un conjunto deK
enteros Tampoco me importa la reversibilidad.
Ejemplo hash:hash({5, 2, 3}) = 42
. (El número 42 no es importante, al menos no aquí)
¿Hay un algoritmo genérico para esto que funcione con cualquier valor deN
yK
? No pude encontrar uno buscando en Google, o mis propios esfuerzos ingenuos.