Tengo números en un rango específico (generalmente de 0 a alrededor de 1000). Un algoritmo selecciona algunos números de este rango (de 3 a 10 números). Esta selección se realiza con bastante frecuencia, y necesito verificar si ya se ha seleccionado una permutación de los números elegidos.¿Buena función hash para permutaciones?
por ejemplo, un paso selecciona [1, 10, 3, 18]
y otro [10, 18, 3, 1]
, entonces la segunda selección se puede descartar porque es una permutación.
Necesito hacer este control muy rápido. Ahora pongo todas las matrices en un hashmap y uso una función hash personalizada: simplemente resume todos los elementos, por lo que 1 + 10 + 3 + 18 = 32, y también 10 + 18 + 3 + 1 = 32. Para iguales, utilizo un conjunto de bits para verificar rápidamente si los elementos están en ambos conjuntos (no necesito clasificación cuando uso el conjunto de bits, pero solo funciona cuando el rango de números es conocido y no demasiado grande).
Esto funciona bien, pero puede generar muchas colisiones, por lo que el método equals() se llama con bastante frecuencia. Me preguntaba si hay una manera más rápida de buscar permutaciones.
¿Hay buenas funciones hash para las permutaciones?
ACTUALIZACIÓN
he hecho un poco de referencia: generar todas las combinaciones de números en el rango de 0 a 6, y longitud de la matriz 1 a 9. Hay 3003 permutaciones posibles, y una buena de hash debe generado cerca a esto muchas diferentes hashes (que usar números de 32 bits para el hash):
hashes- 41 diferentes sólo por la adición de (así que hay un montón de colisiones)
- 8 hashes diferentes valores para XOR'ing juntos
- 286 hashes diferentes para multiplicar
- 3003 hashes diferentes para (I + 2e) y multiplicando como ABC ha sugerido (usando 1779033703 para R)
Así hash del ABC se puede calcular muy rápido y es mucho mejor que todo el resto. ¡Gracias!
PD: No quiero ordenar los valores cuando no es necesario, porque esto sería demasiado lento.
No estoy seguro de que su enfoque de sumar los valores para crear un hash funcione como usted desea. Claro 1 + 10 + 3 + 18 = 10 + 18 + 3 + 1 = 32, pero también lo hace 1 + 12 + 3 + 16. –
@Paul, esa es la razón por la que hará una clasificación y comparación si el valor es igual. – pierrotlefou
Resultó que mi algoritmo estaba medio cocido (1,2,3) colisionó con (1,6,7) y son posibles muchas otras colisiones. Cerré la publicación para evitar confusiones. –