¿Qué es una función hash, la naturaleza y el concepto de una tabla hash (tabla hash) y cómo resolver conflictos?

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

Inserte la descripción de la imagen aquí

2. Método de construcción de la función hash

Hay dos problemas que deben resolverse cuando se usa una tabla hash:

  1. 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
  2. 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

  3. Factores a considerar al construir una función hash

    1. Velocidad de ejecución (es decir, el tiempo necesario para calcular la función hash)
    2. Longitud de la palabra clave
    3. 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)
    4. Distribución de palabras clave
    5. Encuentra frecuencia
  4. 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.
  5. Métodos de construcción de uso común

    1. Direccionamiento directo
    2. Análisis digital
    3. Método de toma de cuadrados
    4. Método de plegado
    5. Método de dividir y dejar resto
    6. Método de números aleatorios
  6. 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

  7. 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.
Inserte la descripción de la imagen aquí

Pasos para construir una tabla hash en el método de dirección en cadena
  1. 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.
  2. 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

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

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 越大,表中记录数越多,说明表装得越满,发生冲突的可能性越大,查找时比较次数就越多

Inserte la descripción de la imagen aquí

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

Supongo que te gusta

Origin blog.csdn.net/weixin_46195957/article/details/111569845
Recomendado
Clasificación