2012-03-25 21 views
7

Conozco el principio básico de la estructura de datos de la tabla hash. Si tengo una tabla hash de tamaño N, tengo que distribuir mis datos en estos N tan poco como sea posible.¿Cómo implementar una tabla hash de tamaño dinámico?

Pero en realidad, la mayoría de los idiomas tienen sus tipos de tablas hash integradas. Cuando los uso, no necesito saber el tamaño de la tabla hash de antemano. Simplemente pongo todo lo que quiero en eso. Por ejemplo, en Ruby:

h = {} 
10000000.times{ |i| h[i]=rand(10000) } 

¿Cómo puede hacer esto?

Respuesta

3

Ver the Dynamic resizing section of the Hash table article on Wikipedia.

El enfoque habitual es utilizar la misma lógica que a dynamic array: tener un número de cubos y cuando hay demasiados elementos en la tabla hash, crear una nueva tabla hash con un tamaño mayor y mover todos los elementos a la nueva tabla de picadillo.

Además, dependiendo del tipo de tabla hash, este cambio de tamaño puede no ser necesario para la corrección (es decir, funcionaría incluso sin cambiar el tamaño), pero sin duda es necesario para el rendimiento.

+4

un buen enfoque de reposición es doblar el tamaño de la tabla, y luego cuando busca un valor, tiene su clave, y realiza una búsqueda modulu en su tabla hash comenzando con 'hash% current_size', luego' hash % current_size/2', etc. Cuando encuentre el valor, puede volver a generarlo. De esta forma, puede realizar un reinicio lento sin perder demasiado rendimiento, ya que los valores accedidos comúnmente se actualizan automáticamente. –

+0

@DvirVolk, lazy rehash es agradable. Ya conoce la entrada en la tabla hash más alta y sabe dónde insertar las tablas hash inferiores. Pero es posible que tenga una situación en la que una entrada contenga toda la tabla de cubos vacíos. Ese "cambio de tamaño incremental" de wiki es una solución de velocidad de tradoff para el tamaño de datos, según entiendo (finalmente tienes 2 * N cubetas donde N es el tamaño de la tabla hash más alta). El tamaño de duplicación es bueno para "copiar todas las entradas" por el hecho de que tiene que dividir cubos individuales en dos o combinar dos en uno (sin recálculo de hash) con la reutilización de listas enlazadas de cubetas antiguas. – ony

Cuestiones relacionadas