La historia de que las tablas hash se amortizan Θ(1)Es una mentira una simplificación excesiva.
Esto solo es cierto si:
- La cantidad de datos a hash por elemento es trivial en comparación con el número de K eys y la velocidad de hash a K ey es rápida -k.
- El número de C ollisions es pequeña -c.
- Nosotros no tomamos en cuenta el tiempo necesario para R edimensionar la tabla hash -r.
Grandes cadenas de hash
Si la primera suposición es falsa, el tiempo de ejecución aumentará aΘ(k).
Esto es definitivamente cierto para cadenas grandes, pero para cadenas grandes una comparación simple también tendría un tiempo de ejecución deΘ(k). Entonces, un hash no es asintóticamente más lento, aunque el hash siempre será más lento que una simple comparación, porque la comparación tiene una ergo de exclusión tempranaO(1), Ω(k) y el hashing siempre tiene que hacer hash con la cadena completa O(k), Ω(k).
Tenga en cuenta que los enteros crecen muy lentamente. 8 bytes pueden almacenar valores de hasta1018; 8 bytes es una cantidad trivial de hash.
Si desea almacenar bigints, entonces piense en ellas como cadenas.
Algoritmo de hash lento
Si la cantidad de hashing de gasto no es trivial en comparación con el almacenamiento de los datos, entonces obviamente elΘ(1)la suposición se vuelve insostenible.
A menos que se use un hash criptográfico, esto no debería ser un problema.
Lo que importa es que n >> k. Mientras eso se mantengaΘ(1) Es una declaración justa.
Muchas colisiones
Si la función de hash es deficiente, o la tabla de hash es pequeña, o el tamaño de la tabla de hash es incómoda, las colisiones serán frecuentes y el tiempo de ejecución será deO(log(n)).
La función de hashing debe elegirse de modo que las colisiones sean raras y sigan siendo lo más rápido posible, en caso de duda, opte por menos colisiones a expensas de un hashing más lento.
Una regla de oro es que la tabla de hashing siempre debe tener menos del 75% de su capacidad.
Y el tamaño de la tabla hash no debería tener ninguna correlación con la función hashing.
A menudo, el tamaño de la tabla de hash es (relativamente) primo.
Cambiar el tamaño de la tabla hash
Debido a que una tabla hash casi completa generará demasiadas colisiones y una tabla hash grande (vacía) es un desperdicio de espacio, muchas implementaciones permiten que la tabla hash crezca (y se reduzca) según sea necesario.
El crecimiento de una tabla puede implicar una copia completa de todos los elementos (y posiblemente una reorganización), porque el almacenamiento debe ser continuo por razones de rendimiento.
Solo en casos patológicos será un problema cambiar el tamaño de la tabla hash, por lo que los cambios de tamaño (costosos pero raros) se amortizan en muchas llamadas.
Tiempo de ejecución
Entonces, el tiempo de ejecución real de una tabla hash esΘ(kcr).
Cada uno dek, c, r en promedio se supone que es una constante (pequeña) en el tiempo de ejecución amortizado y, por lo tanto, decimos que Θ(1) Es una declaración justa.
Para volver a sus preguntas
Por favor, discúlpeme por parafrasear, he intentado extraer diferentes conjuntos de significados, siéntase libre de comentar si me he perdido algo
Parece que le preocupa la longitud de la salida de la función hash. Llamemos estom (n generalmente se considera que es el número de elementos que se van a codificar). m estarán log(n)porque m necesita identificar de forma exclusiva una entrada en la tabla hash.
Esto significa que m crece muy lentamente. A 64 bits, el número de entradas de la tabla hash ocupará una porción considerable de RAM disponible en todo el mundo. Con 128 bits, superará con creces el almacenamiento en disco disponible en el planeta tierra.
Producir un hash de 128 bits no es mucho más difícil que un hash de 32 bits, así que no , el momento de crear un hash no esO(m) (o O(log(n)) Si tu quieres).
La función hash pasando por log(n)los bits de elemento llevarán tiempo . Θ(log(n))
Pero la función hash no pasa por bits de elementos .
Por un elemento (!!) solo va a través de los datos .
Además, la longitud de la entrada (k) no tiene relación con el número de elementos. Esto es importante, porque algunos algoritmos no hash tienen que examinar muchos elementos en la colección para encontrar un elemento (no) coincidente.
La tabla hash solo hace 1 o 2 comparaciones por elemento en consideración en promedio antes de llegar a una conclusión. log(n)
O(k)
¿Por qué las tablas hash son eficientes para almacenar elementos de longitud variable?
Debido a que, independientemente de la longitud de la entrada ( ), la longitud de la salida ( ) es siempre la misma, las colisiones son raras y el tiempo de búsqueda es constante.
Sin embargo, cuando la longitud de la clave aumenta en comparación con el número de elementos en la tabla hash ( ), la historia cambia ...km
kn
¿Por qué las tablas hash son eficientes para almacenar cadenas grandes?
Las tablas hash no son muy eficientes para cadenas muy grandes.
Si (es decir, el tamaño de la entrada es bastante grande en comparación con el número de elementos en la tabla hash), entonces ya no podemos decir que el hash tiene un tiempo de ejecución constante, pero debe cambiar a un tiempo de ejecución de especialmente porque no hay salida anticipada. Usted tiene a hash de la clave completa. Si solo está almacenando un número limitado de artículos, entonces puede que sea mucho mejor usar un almacenamiento ordenado, porque al comparar puede optar por salir tan pronto como se vea una diferencia. not n>>kΘ(k)k1 ≠ k2
Sin embargo, si conoce sus datos, puede optar por no usar la clave completa, sino solo la parte volátil (conocida o supuesta) de la misma, restaurando la propiedad mientras mantiene las colisiones bajo control. Θ(1)
Constantes ocultas
Como todos deberían saber simplemente significa que el tiempo por elemento procesado es una constante. Esta constante es bastante más grande para el hash que para una simple comparación.
Para tablas pequeñas, una búsqueda binaria será más rápida que una búsqueda hash, porque, por ejemplo, 10 comparaciones binarias podrían ser más rápidas que un solo hash.
Para conjuntos de datos pequeños, se deben considerar alternativas a las tablas hash.
Es en grandes conjuntos de datos que las tablas hash realmente brillan.Θ(1)