Escoger el tamaño correcto de la tabla hash es tan crítico como elegir la función hash. El factor de carga alpha = n / m (elementos sobre buckets) determina la probabilidad de colisión y, con ello, el costo promedio de inserción y búsqueda. Un plan de rehashing mantiene el rendimiento cuando la tabla crece.
Para open addressing es común elegir capacidades primas, porque facilitan recorrer todas las celdas con doble hashing y reducen patrones de colisión. En encadenamiento no es obligatorio, pero un primo cercano al doble del número esperado de elementos dispersa mejor.
alpha hasta 1.0 (una colisión promedio por bucket); algunos diseños van hasta 2.0 si las listas son cortas.Mantener alpha acotado preserva el tiempo promedio O(1). Si crece, la tabla se vuelve más lenta y debe ampliarse.
alpha supera el umbral definido (ej. 0.7 en open addressing, 1.0 en chaining).El rehash crea una tabla más grande y reinserta todos los pares clave-valor con la misma función hash (o una nueva). El paso es O(n) pero se realiza esporádicamente.
def rehash(tabla, nuevo_tam):
tam = nuevo_tam * 2 + 1 # siguiente primo aproximado
nueva = [None] * tam
for entrada in tabla:
if entrada is None:
continue
idx = hash(entrada[0]) % tam
while nueva[idx] is not None:
idx = (idx + 1) % tam # probing lineal para simplificar
nueva[idx] = entrada
return nueva, tam
La operación reinserta los pares para alinearlos con el nuevo módulo. En open addressing es obligatorio; en encadenamiento también mejora la longitud promedio de las listas.
alpha estable conserva O(1) promedio.| Escenario | Estrategia | Umbral de rehash |
|---|---|---|
| Diccionario en memoria (chaining) | Capacidad primo cercano al doble del esperado | alpha >= 1.0 |
| Tabla compacta (open addressing) | Capacidad primo; doble hashing | alpha >= 0.7 |
| Cache LRU simple | Capacidad potencia de 2; rehash al 0.75 | alpha >= 0.75 |
Como regla general, define un umbral, mide alpha en cada inserción y dispara el rehash antes de que el rendimiento se degrade.