Marc dio una gran respuesta a esta pregunta, pero quería agregar algunos datos que creo que realmente muestran la importancia de tener una buena función hash y un tamaño de tabla principal.
Estos datos provienen de una conferencia de Jon Bentley para MIT 6.172 (Performance Engineering of Software Systems), durante la cual describió la implementación de una tabla hash para un gran proyecto. La idea aquí es que se nos dan algunos números [matemática] a [/ matemática] y [matemática] c [/ matemática], y queremos dividirlos en algún índice en la tabla hash. Realizó un experimento in vitro en 10 millones de pares ” in vivo” (datos de producción), en varias funciones hash y tamaños de tabla diferentes. Los números en la tabla indican el “costo de búsqueda”, que fue su medida del número de colisiones.
Como puede ver, el tamaño de la tabla es importante para todas las funciones hash probadas, pero es especialmente importante cuando la función hash no es excelente (¡mire los 3 órdenes de aumento de tamaño entre el tamaño de la tabla 8191 a 8192 para las dos primeras funciones hash!)
- ¿Cuál es la diferencia entre estos dos métodos de inicialización de matrices Java?
- Si una computadora toma el control total del control del tráfico aéreo, ¿cómo será el algoritmo? ¿Cómo manejará los aterrizajes de emergencia y cómo manejará una pista paralela?
- ¿Por qué se usa el sistema binario?
- ¿Los programadores diseñan algoritmos o simplemente los toman de Internet?
- ¿Cómo podemos usar caché (s) para la optimización de la multiplicación de matrices?
[matemáticas] \ begin {array} {c | cccccc} \ textbf {Hash function} & \ textbf {8191} & \ textbf {8192} & \ textbf {8209} & \ textbf {9973} & \ textbf {10000} & \ textbf {10007} \\ \ hline a + c & 1.92 & 3510 & 2.06 & 1.69 & 11.5 & 1.77 \\ \ hline a >> 7 + c & 90 y 4196 & 90 y 90 y 102 & 90 \\ \ hline a >> 12 + c & 33 y 189 y 33 y 33 y 47 y 33 \\ \ hline a \ cdot (64 + 8 + 1) + \\ c \ cdot (16 + 4 + 1) y 1.84 y 3510 & 1.92 y 1.83 y 11.5 y 1.79 \\ \ hline a >> 7 \ cdot (64 + 8 + 1) + \\ c \ cdot (16 + 4 + 1) y 1.93 y 27.8 y 1.84 y 1.62 y 11.5 y 1.74 \ \ \ hline a >> 12 \ cdot (64 + 8 + 1) + \\ c \ cdot (16 + 4 + 1) y 1.86 y 2.01 y 1.95 y 1.65 y 1.61 y 1.55 \\ \ end {array} [/ mates]
Fuente: Bentley, Boyle, Krishnan, Meiners – Ingeniería de rendimiento en un sistema heredado – p. dieciséis