¿Por qué alguien usa el hashing cuando el peor tiempo de búsqueda del hashing es O (n) y eso para bbst es logn?

Cuando está haciendo computación de ultra alto rendimiento en grandes conjuntos de datos, es un ahorro de tiempo significativo usar O (1). Suponga que tiene una base de datos con 1 millón de registros, necesitaría realizar 29 operaciones para encontrar un registro cuando use log ny un millón cuando use n.

Dado que no es posible mantener una tabla de DB de ese tamaño en la RAM, en la mayoría de los casos, debe realizar todas las operaciones en un disco, que es aproximadamente 10,000 veces más lento que la RAM para las unidades tradicionales y aproximadamente 100 veces más lento que las unidades de estado sólido .

Entonces, en una unidad tradicional, estás hablando de un tiempo de recuperación de unos pocos milisegundos en comparación con casi 10 a 15 segundos para una búsqueda de registro. En un entorno de alta transacción, incluso en un SSD, esto sería un obstáculo para el espectáculo.

Las tablas hash pueden admitir una operación O (1) si permite que la tabla se escale con el número de claves que desea almacenar, mientras que los árboles de búsqueda binarios siempre serán O (log (n)).

Supongamos que quiero almacenar palabras en el diccionario web utilizando tablas hash. Decido que mi función hash solo estará determinada por la primera letra de cada palabra. Por ejemplo, ‘apple’ y ‘alligator’ se asignarán a la primera entrada en la tabla hash. Tenga en cuenta que esta es una función hash pobre porque hay más palabras que comienzan con ‘t’ que palabras que comienzan con ‘x’, pero supongamos que todas las palabras están distribuidas uniformemente por su primera letra. En el caso que he descrito, esta tabla hash será O (n / 26) = O (n).

Ahora crezcamos la tabla hash y actualicemos nuestra función hash para que las primeras dos letras de una palabra determinen la salida, suponiendo que todas las palabras sean mayores que dos letras. ‘Apple’ y ‘aplicación’ se asignan a la misma entrada, pero ‘cocodrilo’ no compartirá la misma entrada. En ese caso, el tiempo de ejecución de nuestra tabla hash suponiendo una distribución uniforme es O (n / (26 * 26)), que sigue siendo O (n) pero significativamente mejor que nuestra primera función hash.

La idea general es que, dada una buena función hash y una tabla hash lo suficientemente grande, el tiempo de ejecución será O (n / a) donde a es igual al número de entradas en la tabla. Si a es casi tan grande como n, entonces la tabla hash tendrá el peor tiempo de ejecución de O (1), que es mucho más rápido que un árbol de búsqueda binario O (log (n)).

No programamos sobre la base de que obtendremos el peor de los casos, de hecho, si su búsqueda de tabla hash es algo así como O (n), entonces tiene una función hash horriblemente rota que está distribuyendo una gran cantidad de entradas en un número muy pequeño de cubos En la práctica, el habitable se amortizará O (1).