Tabla de picadillo
Tabla de picadillo
Función hash + método de resolución de conflictos
Método de construcción
Método de direccionamiento directo, excepto el método restante
Maneras de resolver conflictos
Método de direccionamiento abierto: método de detección lineal, método de detección cuadrado
Método de cremallera
1. Algunos términos de la tabla hash
Método hash (método hash)
Seleccione una función, calcule la ubicación de almacenamiento del elemento por palabra clave de acuerdo con la función y guárdelo de acuerdo con esto;
Al buscar, la misma función calcula la dirección para un valor k dado, y compara k con el código clave del elemento en la unidad de dirección para determinar si la búsqueda es exitosa.
Función hash (función hash)
Función de conversión utilizada en el método hash
Tabla hash (tabla hash)
Función hash: H (tecla) = k
conflicto
Se asignan diferentes claves a la misma dirección hash在散列查找方法中,冲突是不可能避免的,只有尽可能的减少
La palabra clave es diferente, el valor de la función hash es el mismo
tecla1! = tecla2, pero H (tecla1) = H (tecla2)
acumulación
La acumulación también se denomina conflicto no idéntico, lo que significa que dos elementos con diferentes valores de función hash compiten por la misma dirección hash posterior, lo que resulta en acumulación (o agregación).
Conflicto de no sinónimos
第一次冲突为同义词引起的冲突,第二次开始的冲突是非同义词引起的冲突
Sinónimo
Varias palabras clave con el mismo valor de función冲突的关键成为同义词
Recolectar
Las direcciones hash de las dos claves son diferentes, pero después de competir por la misma dirección sucesora, este fenómeno se denomina agregación.
Hará que los elementos que no son sinónimos estén en la misma secuencia de búsqueda, lo que aumentará el tiempo de búsqueda.
El agrupamiento es más serio, puede utilizar el método de sonda cuadrada
2. Método de construcción de la función hash
Hay dos problemas que deben resolverse cuando se usa una tabla hash:
-
Función hash construida
- La función seleccionada es lo más simple posible para aumentar la velocidad de rotación.
- La dirección calculada por la función seleccionada para el código clave debe distribuirse uniformemente en el conjunto de direcciones hash para reducir el desperdicio de espacio.
- Intente igualar la probabilidad de que la dirección hash aparezca en cualquier posición de la tabla, reduciendo así los conflictos
-
Desarrolle un buen plan de resolución de conflictos
Durante la búsqueda, si el código clave no se puede encontrar a partir de la dirección calculada por la función hash, otras unidades relevantes deben ser consultadas regularmente de acuerdo con las reglas de resolución de conflictos
-
Factores a considerar al construir una función hash
- Velocidad de ejecución (es decir, el tiempo necesario para calcular la función hash)
- Longitud de la palabra clave
- El tamaño de la tabla hash (cuanto mayor sea el tamaño, menor será la posibilidad de conflicto, pero una pérdida de espacio)
- Distribución de palabras clave
- Encuentra frecuencia
-
Construido según las características de la colección de elementos.
- Requisito 1: n datos originalmente solo ocupan n direcciones. Aunque el espacio se intercambia por tiempo cuando se realiza el hash , se espera que el espacio de direcciones del hash sea lo más pequeño posible
- Requisito 2: No importa qué método se utilice para el almacenamiento, el propósito es almacenar los elementos de la manera más uniforme posible para evitar conflictos.
-
Métodos de construcción de uso común
- Direccionamiento directo
- Análisis digital
- Método de toma de cuadrados
- Método de plegado
- Método de dividir y dejar resto
- Método de números aleatorios
-
Direccionamiento directo
前提是关键字基本连续
Tome la palabra clave en sí o un valor de función lineal de la palabra clave como dirección hash
Hsah (clave) = a * clave + b (ayb son constantes)
La palabra clave y la dirección son correspondencia uno a uno, sin conflicto
Solo aplicable cuando las palabras clave son básicamente continuas
优点
: Se utiliza un valor de función lineal de la clave del código de tecla como dirección hash, no se producirá ningún conflicto缺点
: Para ocupar un espacio de direcciones continuo, la eficiencia del espacio es baja -
Método de dividir y dejar resto
Hash (clave) = clave mod p (p es un número entero distinto de 0)
关键
: ¿Cómo elegir una P adecuada? Cuando p es un número primo (número primo), la posibilidad de conflicto es relativamente pequeña技巧
: Sea m la longitud de la tabla, tome p <= my sea un número primo
3. Métodos de manejo de conflictos
Método de dirección abierta (método de dirección abierta)
Método de dirección de cadena (método de cremallera)
Método de repetición (método de función de doble hash)
Cree un área de desbordamiento común
El primer conflicto es un conflicto causado por sinónimos y el segundo conflicto es un conflicto causado por no sinónimos.
La causa del conflicto está relacionada con tres factores
1. Factor de carga a (factor de carga):
- a = el número de registros almacenados / el tamaño de la tabla hash
- Cuando a es 0,6 ~ 0,9, la posibilidad de conflicto es relativamente pequeña (
既兼顾减少冲突的发生,又兼顾提高存储空间的利用率
) - Si hay 600 elementos, la longitud de la tabla es 667 ~ 1000.
2. Función hash:
- El valor hash calculado por una buena función hash se distribuirá uniformemente en todo el rango de direcciones de la tabla hash, reduciendo así los conflictos.
3. Métodos de manejo de conflictos
Una buena forma de manejar los conflictos puede reducir los conflictos secundarios.
- Método de direccionamiento de desarrollo
- Método de detección lineal (ventajas: resolución simple de conflictos, desventajas: pero propenso a problemas de acumulación)
- Método de detección cuadrado (ventaja: evita el problema de acumulación, desventaja: no necesariamente es capaz de detectar todas las unidades en la tabla hash)
- Método de cremallera
1. Método de dirección abierta (método de dirección abierta)
基本思想
: Cuando hay un conflicto, busque la siguiente dirección hash vacía. Siempre que la tabla hash sea lo suficientemente fuerte, la dirección hash vacía siempre se puede encontrar y el elemento de datos se almacena
Por ejemplo: excepto por el método restante Hi = (Hash (tecla) + d) mod md es una secuencia incremental
Método común: el método de detección lineal d es 1, 2, ... secuencia lineal m-1
El método de detección secundario d es el cuadrado de 1, el cuadrado de -1, el cuadrado de 2, el cuadrado de -2, ..., la secuencia cuadrática del cuadrado de q
El método de detección pseudoaleatorio d es una secuencia de números pseudoaleatorios
2. Método de dirección de cadena (método de cremallera)
基本思想
: Registra una dirección hash idéntica en un solo enlace de cadena
Establezca m listas enlazadas individualmente con m direcciones hash y luego use una matriz para almacenar los punteros principales de m listas enlazadas individualmente para formar una estructura dinámica
Los elementos con la misma dirección hash se colocan en una lista enlazada individualmente, y el puntero principal de la lista enlazada se coloca en la dirección hash correspondiente.
Pasos para construir una tabla hash en el método de dirección en cadena
- Tome la clave del elemento de datos, calcule su valor de función hash (dirección), si la lista vinculada correspondiente a la dirección está vacía, inserte el elemento en esta lista vinculada; de lo contrario, continúe con el siguiente paso para resolver el conflicto.
- De acuerdo con el método de manejo de conflictos seleccionado, se calcula la siguiente dirección de almacenamiento de la clave. Si la lista enlazada correspondiente a la dirección no está vacía, inserte el elemento en esta lista enlazada utilizando el método de preinterpolación o posinterpolación de la lista enlazada
Ventajas del método de dirección en cadena:
-
Los no sinónimos no entrarán en conflicto (sin acumulación), sin fenómeno de "agrupación", por lo que la duración media de la búsqueda es más corta.
-
La aplicación dinámica para el espacio de nodos en la lista vinculada es más adecuada para situaciones en las que la longitud de la lista es incierta
-
El método de direccionamiento abierto requiere un factor de relleno relativamente pequeño a para reducir los conflictos, por lo que cuando el tamaño de los datos es relativamente grande, se desperdicia mucho espacio.
El factor de relleno a en el método de la cremallera se puede establecer en> = 1, y cuando el elemento es grande, el campo de puntero agregado en el método de la cremallera se puede ignorar, ahorrando así espacio
-
En la tabla hash construida por el método zipper, la operación de eliminar el nodo es más fácil de implementar.
Desventajas del método de cremallera.
El puntero necesita espacio adicional, por lo que cuando el tamaño del elemento es relativamente pequeño, el método de direccionamiento abierto ahorra espacio. Si el espacio del puntero guardado se usa para expandir la escala de la tabla hash, el factor de relleno se puede reducir, lo que a su vez reduce el método de direccionamiento abierto. Conflictos, lo que aumenta la velocidad de búsqueda promedio
4. Búsqueda de tabla hash
Para el conjunto de palabras clave (19,14,23,1,68,20,84,27,55,11,10,79), n = 12
¿ASL de búsqueda de tabla desordenada? 6.5
¿ASL de búsqueda binaria de tabla ordenada? 3. +
Entonces, ¿busca ASL en la tabla hash?
5. Análisis de la eficiencia de búsqueda de la tabla hash
Utilice la longitud de búsqueda promedio ASL para medir el algoritmo de búsqueda, ASL depende de
-
Función hash
-
Maneras de lidiar con los conflictos
-
El factor de llenado de la tabla hash a = el número de registros llenados en la tabla / la longitud de la tabla hash
a 越大,表中记录数越多,说明表装得越满,发生冲突的可能性越大,查找时比较次数就越多
6. Eliminación de la tabla hash
Al realizar una operación de eliminación en una tabla hash que usa el método de dirección abierta para manejar conflictos, no puede simplemente vaciar el espacio del elemento eliminado, de lo contrario, la ruta de búsqueda del elemento sinónimo que se completará en la tabla hash después de que se truncará. Esto se debe a que en varios métodos de dirección abiertos, la unidad de dirección vacía es una condición para el error de búsqueda. Por lo tanto, el elemento eliminado solo se puede marcar para su eliminación, pero el elemento no se puede eliminar.
La tabla de cremallera es diferente de la tabla hash construida por el método de dirección abierta, y el nodo se puede eliminar directamente
7. Conclusión
- La tecnología de tabla hash tiene un buen rendimiento promedio, mejor que algunas tecnologías tradicionales.
- El método de dirección en cadena es mejor que el método de dirección abierta
- Dividir el método restante ya que una función hash es mejor que otros tipos de funciones
- De hecho, el rango de valores de la palabra clave es mucho mayor que el rango de cambio de la dirección hash.
- Cuando existe una cierta relación de mapeo entre las palabras clave de un grupo de datos y la dirección de almacenamiento, este grupo de datos es adecuado para el almacenamiento de la tabla hash.
- En general, asumiendo que la función hash es uniforme, se puede demostrar que la longitud de búsqueda promedio de la tabla hash obtenida por diferentes métodos de resolución de conflictos es diferente.
- La longitud de búsqueda promedio de la tabla hash no es una función del número de elementos n, sino una función del factor de relleno a. Por lo tanto, al diseñar la tabla hash, puede elegir una adecuada para controlar la longitud de búsqueda promedio de tabla de picadillo