En términos simples, ¿cómo funciona el algoritmo de hash perfecto “comprimir, hash y desplazar (CHD)”?

¿Qué es una tabla hash?

Una tabla hash es una estructura de datos particular que admite una operación principal *: dado un valor, una tabla hash le permite consultar si la tabla contiene o no ese valor (es decir, implementa un conjunto matemático). Hay muchas formas de implementar dicha estructura, pero la idea básica detrás de la mayoría de las implementaciones es más o menos la misma.

Dado un valor [math] x [/ math] para consultar, una función hash [math] h [/ math] se usa para transformarlo en un valor hash [math] h (x) [/ math], que es un pequeño entero no negativo Este valor hash se utiliza como índice en una matriz. En un escenario perfecto (vea la siguiente sección), el valor [math] x [/ math] estará en esta ubicación en la matriz si y solo si está presente en la tabla hash. Para la mayoría de los algoritmos de la tabla hash, las cosas no son tan simples, y hay pasos adicionales para determinar si [math] x [/ math] está en la tabla hash (ver resolución de colisión).

* Muchas implementaciones también le permiten insertar valores en la tabla hash (en lugar de requerir que todos los valores se presenten a medida que se construye la tabla) y eliminar valores de la tabla hash.

¿Qué es el hashing perfecto?

Para un conjunto dado [math] S [/ math] de valores, se dice que una función hash [math] h [/ math] es perfecta si [math] h [/ math] transforma cada valor en [math] S [/ matemáticas] en un número entero distinto. De manera equivalente, [matemáticas] h [/ matemáticas] no tiene colisiones. Las funciones hash perfectas son importantes porque las tablas hash que usan funciones hash perfectas se pueden implementar como describí anteriormente, cada valor en la tabla hash se puede almacenar en el índice de su valor hash.

¿Qué es el algoritmo de hash perfecto CHD?

Nota: Para lo siguiente, omitiré todas las matemáticas involucradas en el análisis. Para el tratamiento adecuado, vea el documento real. La descripción del algoritmo dada allí no es realmente tan difícil de entender.

El algoritmo de hash perfecto CHD describe un algoritmo para construir una función hash. El algoritmo real para el hash es como se describió anteriormente, simplemente aplique la función hash e indexe en una matriz.

Dado un conjunto [math] S [/ math] de elementos [math] n [/ math] y un número entero [math] m> n [/ math], el algoritmo de hash perfecto CHD para construir una función hash funciona de la siguiente manera.

Se elige un número entero [math] r [/ math] y una función hash [math] g [/ math] donde [math] g [/ math] transforma los valores en enteros no negativos menores que [math] r [/ math] . Esta función hash puede asignar múltiples valores en [math] S [/ math] al mismo valor hash, eso está bien.

Se elige una familia universal [math] U [/ math] de funciones hash [math] f_1, f_2, f_3, \ dots [/ math] que transforma los valores en enteros no negativos menores que [math] m [/ math]. En términos generales, una familia universal de funciones hash es una secuencia de funciones hash elegidas al azar que no tienen una relación perceptible entre sí (es decir, son independientes).

  // Esto terminará siendo nuestra matriz de elementos
 deje que la tabla sea una matriz vacía con m ranuras

 // Esta estructura terminará describiendo nuestra función hash
 deje que los índices sean una matriz vacía con ranuras r

 // Esto se usa para la contabilidad.  ¿Qué valores hash ya hemos usado?
 dejar que used_values ​​sea un conjunto vacío

 para i = 0 a r-1
   let bucket = el subconjunto de S que g se transforma en i
   para j = 1 hasta el infinito
     deje que los valores sean el conjunto que resulta de aplicar f_j a los elementos del depósito
     si | valores |  = | cubo |  y (los valores y los valores_utilizados son disjuntos)
       para x en el cubo
         establecer tabla [f_j (x)] = x
       agregar todos los elementos de valores a used_values
       establecer índices [i] = j
       ir a end_loop
   etiqueta: end_loop

 // Esta es nuestra función hash real.
 define f (x) =
   dejar i = g (x)
   dejar j = índices [i]
   devuelve f_j (x)

Esencialmente, para cada “grupo” de valores que [math] g [/ math] se asigna al mismo valor hash, elegimos una de nuestras funciones hash [math] f_j [/ math]. Nuestra función hash final [math] f [/ math] se asigna a los mismos valores que [math] f_j [/ math] en las entradas de ese segmento. Elegimos las funciones hash particulares [math] f_j [/ math] para que terminemos sin colisiones.

Resulta que cuando haces esto correctamente (en lugar de pasar por los cubos de [math] i = 0 \ text {to} r-1 [/ math], debes ir en orden descendente por tamaño del cubo), esto El algoritmo toma tiempo lineal. Además, los índices de las funciones hash que utiliza terminan siendo muy pequeños y fáciles de almacenar en formato comprimido.

More Interesting

¿Cuáles son algunos posibles temas de investigación en neurociencia computacional que se centran en datos neuronales?

¿Cuánto diseño de algoritmos hacen los investigadores de aprendizaje automático?

¿Tener demasiados datos ralentiza tu PC?

¿Es posible detectar líquido con visión artificial?

Estoy en primer año de ciencias de la computación, ¿cómo debo comenzar con mi trabajo de investigación?

¿Cuál es el punto de la informática teórica en un programa de pregrado?

Cómo realizar una nueva investigación en el campo de VLSI y electrónica integrada y publicarla en revistas internacionales

¿Qué algoritmos se pueden usar para agrupar opiniones sobre un tema expresado en lenguaje natural?

¿Qué profesores y laboratorios de investigación en la India están trabajando en el procesamiento del lenguaje natural?

¿Cuáles son los resultados en la investigación en el área de filtrado colaborativo para recomendaciones de artículos de noticias?

¿Me pueden ayudar a decidir si debo obtener un doctorado en informática teórica?

Mi trabajo de tesis está relacionado con el aprendizaje automático. ¿Alguien puede sugerir algún trabajo de aprendizaje automático que contenga alguna investigación que pueda completar en los próximos dos meses?

¿Cuánta similitud existe entre hacer compiladores y construir un analizador sintáctico que entienda un lenguaje natural?

¿Qué es el Protocolo de separación de localizador / identificador (LISP) en términos simples, con las terminologías en eso?

¿Qué beneficios obtiene Microsoft, como empresa comercial, de su departamento de investigación (MSR)?