[Estructura y algoritmo de datos JS] implementan la función hash

Tabla de contenido

1. Excelente función hash

1. Multiplicación continua de potencias

2. Ley de Horner (algoritmo de Qin Jiushao)

3. Cómo lograr una distribución uniforme.

En segundo lugar, implemente la función hash


1. Excelente función hash

Antes de construir la tabla hash, necesitamos una función hash para procesar los datos.

Entonces, ¿cómo implementar esta función hash? De acuerdo con el blog anterior [estructura de datos JS] para entender la tabla hash , ya hemos entendido qué es una tabla hash y por qué necesitamos diseñar una función hash.

De hecho, se trata de lograr dos objetivos:

  • Capacidad para calcular rápidamente y obtener hashCode rápidamente
  • Haga que los elementos se distribuyan uniformemente en la tabla hash.

1. Multiplicación continua de potencias

Para el almacenamiento de datos mencionado anteriormente, una forma es usar el poder de la multiplicación para obtener el código hash.

dar = 7 * 27 ^ 3 + 9 * 27 ^ 2 + 22 * ​​27 + 5 = 144941

De esta forma, en realidad es un polinomio, que se puede reducir a:

El número de multiplicaciones aquí es: n + (n-1) + ... + 1 = n (n + 1) / 2 veces

El número de adiciones es: N veces.

La complejidad de tiempo obtenida es (N ^ 2 + N) / 2 que es O (N ^ 2)

2. Ley de Horner (algoritmo de Qin Jiushao)

La ley de Horner es una optimización de polinomios, por lo que se reduce el número de multiplicaciones, de manera que se puede obtener rápidamente el hashCode, que se transforma en la siguiente forma:

Toma dar como ejemplo

El número de multiplicaciones aquí es: N veces;

El número de adiciones es: N veces.

La complejidad de tiempo obtenida es (N + N) u O (N)

Por lo tanto, el uso de la ley de Horner puede mejorar en gran medida la eficiencia y reducir el tiempo de cálculo.

3. Cómo lograr una distribución uniforme.

Al diseñar una tabla hash, ya tenemos dos métodos para manejar las asignaciones al mismo valor de subíndice, es decir, para resolver conflictos, uno es el método de dirección en cadena y el otro es el método de dirección abierta.

Independientemente del método, será mejor que hagamos que los datos se distribuyan uniformemente en la tabla hash .

Entonces, cuando usamos constantes, debemos usar números primos

1. La longitud de la tabla hash .

2. La base de la enésima potencia (37 se usa a menudo).

Los números primos son muy importantes, suponga que la longitud de la tabla es 10 (el valor del subíndice es 0 ~ 9)

Una palabra clave específica se asigna a la posición donde el valor del subíndice es 0 y el tamaño del paso es 5, luego la secuencia de exploración será 0-5-0-5 ... y el ciclo continúa.

Si la longitud de la tabla es 11, entonces la secuencia a explorar es: 0-5-10-4-9-3-8-2-7-1-6, por lo que no habrá bucles y los datos se pueden en la tabla hash distribuidos uniformemente.

 

En segundo lugar, implemente la función hash

 Diseñe una función hash
    1. Convierta la cadena en un número relativamente grande para obtener hashCode.
    2. Comprima este código hash de gran número en el rango del tamaño de la matriz.

 

Se deben pasar dos parámetros, uno es la cadena y el otro es la longitud de la tabla hash.

function hashFunc(str, size){

      //定义一个变量来存储hashCode
      var hashCode = 0;

      // 利用霍纳法则计算出hashCode的值
      // give -> Unicode编码
      for (var i = 0; i < str.length; i++) {
        hashCode = 37 * hashCode + str.charCodeAt(i); 
      }

      // 利用hashCode与哈希表的长度取余得到下标值
      var index = hashCode % size;

      return index;
}

 

Código de prueba:

    //测试
    alert(hashFunc('abc', 7)); // 4
    alert(hashFunc('cla', 7)); // 2
    alert(hashFunc('nbr', 7)); // 1
    alert(hashFunc('kba', 7)); // 0

Resumen: una buena función hash es mapear datos a diferentes ubicaciones lo más rápido posible .

Supongo que te gusta

Origin blog.csdn.net/weixin_42339197/article/details/99544523
Recomendado
Clasificación