Tablas de Dispersión

(Hashing)

Redispersión

Cuando la tabla está muy llena, el tiempo en que se ejecutan las operaciones aumenta bastante; además el intento de insertar elementos puede fallar en la dispersión cerrada con resolución cuadrática.
Una solución es la redispersión, que consiste en construir otra tabla de aproximadamente el doble del tamaño de la anterior, con una función de dispersión asociada, y recorrer la tabla de dispersión original, calculando la nueva posición de cada elemento e insertándolo en la nueva tabla. Lo veremos con un ejemplo:
Tenemos una tabla de dispersión cerrada de tamaño 7, con una función de dispersión: h(x) = x MOD 7, y usamos la exploración lineal para las colisiones. Si insertamos los elementos: 13, 15, 24, 6 y 23, la tabla resultante será:

0
1
2
3
4
5
  6
6
15
23
24
 
 
13
Como la tabla está tan llena, creamos una nueva. El tamaño de ésta será el nömero primo más cercano al doble del tamaño de la tabla original, en este caso 17. Luego la nueva función de dispersión será: h(x) = x MOD 17.
Recorremos la tabla anterior y vamos insertando los elementos 6, 15, 23, 24 y 13 en la tabla nueva. La nueva tabla de dispersión cerrada después de la redispersión es la siguiente:

 
0
1
2
3
4
      5
  6
7
8
9
10
11
12
13
14
15
16
 
   
   
  
    
    
    
6
23
24
  
    
     
    
13
    
15
      

El mayor inconveniente de este método es que es muy costoso y, a veces, lento. Existen varias estrategias a la hora de implantar la redispersión: redisperar cuando la tabla se llene a la mitad (l=0.5); redispersar cuando falla una inserción o redispersar cuando la tabla llega a un factor de carga determinado. La tercera estrategia es la más conveniente (si se elige un buen umbral de corte), ya que el rendimiento disminuye al aumentar el factor de carga.
La ventaja es que libera al programador de ocuparse del tamaño de la tabla.
La redispersión se puede hacer en lenguajes como Ada y C, pero no en lengujes como PASCAL, MODULA,...

 

Tema anterior