Me gustaría saber si hay una función de números de n bits a números de n bits que tenga las siguientes características:
- debe ser biyectivo
- Tanto como deben calcularse bastante rápidof - 1
- debería devolver un número que no tenga una correlación significativa con su entrada.
La razón es esta:
Quiero escribir un programa que funcione con datos. Parte de la información de los datos se almacena en un árbol de búsqueda binario donde la clave de búsqueda es un símbolo de un alfabeto. Con el tiempo, agrego más símbolos al alfabeto. Los nuevos símbolos simplemente obtienen el siguiente número gratuito disponible. Por lo tanto, el árbol siempre tendrá un pequeño sesgo en las teclas más pequeñas, lo que provoca un reequilibrio mayor de lo que creo que debería ser necesario.
Mi idea es manglear los números de los símbolos con manera que se extiendan ampliamente en todo el rango de . Dado que los números de los símbolos solo importan durante la entrada y la salida, lo que ocurre solo una vez, la aplicación de dicha función no debería ser demasiado costosa.[ 0 , 2 64 - 1 ]
Pensé en una iteración del generador de números aleatorios Xorshift, pero realmente no sé cómo deshacerlo, aunque en teoría debería ser posible.
¿Alguien sabe tal función?
¿Es esta una buena idea?
fuente
Respuestas:
Puede usar el hash de Fibonacci , a saber
.hF(k)=k⋅5√−12−⌊k⋅5√−12⌋
Para obtienes n números separados por pares (aproximadamente) distribuidos uniformemente en [ 0 , 1 ] . Al escalar a [ 1 .. M ] y redondear (hacia abajo), obtienes números distribuidos uniformemente en ese intervalo.k=1,…,n n [0,1] [1..M]
Por ejemplo, estos son escalados a [ 0..10000 ] (secuencia original izquierda, ordenada a la derecha):hF(1),…,hF(200) [0..10000]
Esta es una instancia de lo que Knuth llama hashing multiplicativo . Para el tamaño de palabra de la computadora, A algún número entero relativamente primo para w y M el número de direcciones necesarias, utilizamosw A w M
como función hash. Lo anterior sigue con (asegúrese de poder calcularlo con suficiente precisión). Si bien esto también funciona con cualquier otro número irracional además deϕ-1, es uno de los dos únicos números que conducen a los números "más uniformemente distribuidos".A/w=ϕ−1=5√−12 ϕ−1
Encuentre más en El arte de la programación de computadoras , Volumen 3 de Donald Knuth (capítulo 6.4 de la página 513 en la segunda edición). En particular, encontrará por qué los números resultantes son distintos por pares (al menos si ) y cómo calcular la función inversa si usa A y w naturales en lugar de ϕ - 1 .n≪M A w ϕ−1
fuente
Para entradas de bits, esta función funciona:k
Esto es reversible, ya que , y tiene pares no secuenciales { n , m } , n < m , donde h a s h ( m ) < h a s h ( n ) . Tenga en cuenta que la salida y la entrada pueden correlacionarse, especialmente si su entrada está en { 1 , ... , 2 ⌈ khash(hash(n))=n {n,m},n<m hash(m)<hash(n) .{1,…,2⌈k2⌉−1}
Ref: función hash reversible
fuente