Me preguntaron recientemente '¿cómo implementaría una batería hastable'? Sé que el algoritmo de hashing es crítico ya que mientras menos colisiones, mejor será el rendimiento de WRT, pero ¿qué estructura de algoritmo/datos se debe emplear para entregar tiempo constante amortizado {O (1)} para insertar/eliminar/buscar?Implementación de Hashtable
Respuesta
Las tablas hash tienen dos posibilidades principales:
- direccionamiento abierto, que es una matriz simple [matriz dinámica podía comprender si puede dejar que su mesa de crecer sobre la marcha]. Una vez que se ha encontrado un conflicto, debe usar una segunda función hash para encontrar el siguiente plato al que se asignará el elemento. Tenga en cuenta que esta solución tiene algunos problemas [que se pueden resolver] cuando su tabla hash también permite eliminaciones. [Marca especial para los entrantes "borrados"]
- Encadenamiento - en esta solución, cada plato en el gama es una lista vinculada - containig todos los elementos hash a este plato. Aquí, todos los elementos asignados a un cierto valor están en la lista.
La parte importante de las tablas hash [en] ambas soluciones con el fin de permitir que armotorized O (1) insertar/del/mirar hacia arriba - es la asignación de una mesa grande y refrito de una vez alcanzado un pre definido load factor.
EDIT: complejidad análsis:
asumir un factor de carga del p
por alguna p < 1
.
- La probabilidad de la "colisión" en cada acceso es
p
lo tanto la media de la matriz accede es:Sigma(i * p^(i-1) * (1-p)) for each i in [1,n]
Esto le da:Sigma(i * p^(i-1) * (1-p)) = (1-p) * Sigma(i * p^(i-1)) <= (1-p) * 1/(p-1)^2 = 1-p = CONST
. [eche un vistazo a la corrección de Sigma(i * p^(i-1)) < 1/(p-1)^2 in wolfram alpha]. Por lo tanto, resulta en promedio una cantidad constante de accesos a la matriz. Además: Es posible que deba volver a configurar todos los elementos después de que se haya alcanzado el factor de carga, lo que da como resultadoO(n)
accesos a la matriz. Esto da como resultadon * O(1)
ops [agregando n elementos] y1 * O(n)
op [refrentado], por lo que obtiene:(n * O(1) + 1 * O(n))/n = O(1)
tiempo motorizado. - Muy similar a (1), pero el análisis se realiza en accesos de lista. Cada operación requiere exactamente un acceso a la matriz y una cantidad variada de accesos a la lista, con el mismo análisis que antes.
¿El downvoter se preocupará de comentar? – amit
No voté, pero creo que ha confundido su terminología. Las implementaciones de tablas hash "encadenadas" consisten en listas vinculadas de elementos dentro de cada cubo hash. Las implementaciones de tablas hash "abiertas dirigidas" son las que almacenan elementos dentro de un búfer, y se pueden implementar con la estrategia de doble hash que ha descrito. Compruebe la página a la que se ha vinculado ... –
@DarrenEngwirda: Gracias por su comentario. No soy un hablante nativo de inglés y tiendo a mezclar términos de vez en cuando debido a eso. Edité la respuesta. – amit
- 1. Implementación de Hashtable para C
- 2. Implementación de Java Hashtable # hashCode() ¿roto?
- 3. Implementación de Hashtable para Delphi 5
- 4. ¿Qué es un ejemplo de implementación de Hashtable en C#?
- 5. ¿hashtable de actualización por otra hashtable?
- 6. Hashtable en C++?
- 7. Hashtable Hashtable evitar el hashcode negativo
- 8. ¿Cuánta memoria usa una Hashtable?
- 9. Dictionary/HashTable Object in C++?
- 10. Ventajas de HashTable
- 11. ¿Qué tipo de resolución de colisión se elige para la implementación de HashTable/Dictionary en .net?
- 12. Diferencias entre .Net Hashtable, Java Hashtable y HashMap
- 13. PSCustomObject a Hashtable
- 14. Hashtable vs Dictionary
- 15. cmd.exe powershell HashTable
- 16. Apache Velocity: hashtable?
- 17. Cuándo utilizar un HashTable
- 18. Enum como clave de HashTable
- 19. Implementación genérica de System.Runtime.Caching.MemoryCache
- 20. Diccionario vs uso de memoria Hashtable
- 21. cómo serializar hashtable en C#
- 22. .Net Hashtable - Contiene vs ContainsKey
- 23. Implementación NSSet
- 24. ConcurrentHashMap y Hashtable en Java
- 25. Diferencia entre diccionario y Hashtable
- 26. Hashtable para cadena XML y de nuevo a HashTable sin utilizar .NET Serializador
- 27. Iterar y eliminar de Hashtable en Java
- 28. Hashtable de variable mutable en Ocaml
- 29. convertir HashTable a Dictionary en C#
- 30. Hashtable con clave multidimensional en C#
puede la fuerza de las matrices estar con usted –
¿Ha mirado en un libro, diga "Introducción a los algoritmos" por Cormen et al.? – Raphael
Ese es exactamente el libro que estoy en proceso de obtener. –