2008-11-13 100 views

Respuesta

9

Depende del factor de carga (el punto "por ciento lleno" donde la tabla aumentará su tamaño y redistribuirá sus elementos). Si sabe que tiene exactamente 1000 entradas, y ese número nunca cambiará, puede establecer el factor de carga en 1.0 y el tamaño inicial en 1000 para una máxima eficiencia. Si no estaba seguro del tamaño exacto, puede dejar el factor de carga en su valor predeterminado de 0,75 y establecer su tamaño inicial en 1334 (tamaño esperado/LF) para realmente buen rendimiento, a un costo de memoria extra.

se puede utilizar el siguiente constructor para establecer el factor de carga:

Hashtable(int initialCapacity, float loadFactor) 
+0

Suponiendo que la función hash se comporta bien en el conjunto de claves esperadas. Una función hash casera puede no comportarse bien en una mesa de tamaño mínimo. Para una función casera, tendrías que ejecutar experimentos. –

+0

Si la función hash no se comporta bien, los elementos colisionantes se almacenarán en el mismo contenedor (en una lista vinculada). La mesa con un tamaño mínimo no tendrá ningún efecto en el rendimiento. –

1

Hay una cierta discusión de estos factores en la documentación de Hashtable

+0

Esto es más un comentario que una respuesta. – tomasyany

3

Es necesario tener en cuenta la función hash también.

una regla de oro sugiere que el tamaño de la tabla sea aproximadamente el doble, de modo que haya espacio para expandirse y, con suerte, mantener pequeñas las colisiones.

Otra regla general es suponer que está realizando un tipo de hash relacionado con el módulo, luego redondee el tamaño de su tabla al siguiente número primo más grande y use ese número primo como el valor del módulo.

¿Qué tipo de cosas has hecho? Más detalles deberían generar mejores consejos.

0

Dos veces es bueno.

No tiene un gran conjunto de claves. No se moleste en discusiones difíciles sobre su implementación de HashTable, y vaya para 2000.

+0

2000 no tiene un buen tamaño, porque no es excelente. 2001 sería bueno, no es primordial, pero al menos ni siquiera. Distribuirá las claves en la mesa mucho mejor. Una buena tabla hash se encargará de una buena función hash, pero la mayoría de las veces se usa el tamaño. – ReneS

+0

Esta es una pregunta interesante. Su afirmación es correcta si usa una clave hash de tipo: H (s) = s [0] + b * s [1] + b^2s [2] + ... [N] Creo que el estándar de la industria actual es para usar 2^k como tamaño y mejores funciones hash como Jenkins. La última vez que verifiqué que el estándar estaba funcionando con excelente, sin embargo. – fulmicoton

+0

Los números primos e impares son más fríos;) – ReneS

1

Déjelo crecer. Con este tamaño, el manejo automático está bien. Aparte de eso, 2 x tamaño + 1 es una fórmula simple. Los números primos también son buenos, pero tan pronto como su conjunto de datos alcance un cierto tamaño, la implementación de hash podría decidir volver a generar y hacer crecer la tabla.

Sus claves están impulsando la efectividad y son lo suficientemente claras.

En pocas palabras: Haga la pregunta sobre el tamaño cuando tenga problemas tales como el tamaño o el rendimiento lento, aparte de eso: ¡No se preocupe!

+0

Preocúpese si el rendimiento * en esta área * se convierte en un problema. Si intenta manejarlo por adelantado, es más probable que inserte un error o simplemente tenga un código innecesariamente complejo que puede causar un problema de mantenimiento. –

+0

Estoy de acuerdo. Primero tenga el problema y busque una solución después. – ReneS

0

Me gustaría reiterar lo que https://stackoverflow.com/users/33229/wwwflickrcomphotosrene-germany dijo anteriormente. 1000 no parece ser un gran hash para mí. He estado usando muchas tablas hash de ese tamaño en Java sin ver mucho en cuanto a problemas de rendimiento. Y casi nunca pierdo el tamaño o el factor de carga.

Si ejecutó un generador de perfiles en su código y determinó que la tabla hash es su problema, entonces sin dudas comience a ajustar. De lo contrario, no asumiría que tienes un problema hasta que estés seguro.

Después de todo, en la mayoría de los códigos, el problema de rendimiento no está donde usted cree que está. Intento no anticiparme.

Cuestiones relacionadas