Quiero implementar un almacén de datos en memoria para un servicio web en Haskell. Quiero ejecutar transacciones en la STM
mónada.
Cuando busco en Google Hashell Steam Table solo obtengo esto: Data. BTree. HashTable. STM.
el nombre del módulo y las complejidades sugieren que esto se implementa como un árbol. Creo que una matriz debería ser más eficiente para tablas hash mutables.
¿Hay alguna razón para evitar usar una matriz para una STM
tabla hash? ¿Gano algo con esta tabla de hash de vapor o debería usar una referencia de vapor para una IntMap
?
data-structures
haskell
Simon Bergot
fuente
fuente
Store ! blah
yStore ! baz
tendrá que ser secuencialRespuestas:
El problema con una implementación de tabla hash basada directamente en una matriz es que algunas de las operaciones en ella inevitablemente requerirán cambiar el tamaño de la matriz de tiempo lineal (es decir, crear una matriz más grande / más pequeña y copiar todos los datos en ella). Existen múltiples algoritmos estándar que abordan este problema, como el hash lineal o el hash de cuco .
No hace mucho tiempo , surgió otro algoritmo llamado Hash Array Mapped Trie , que ganó una gran popularidad en lenguajes funcionales como Clojure, Scala y, por supuesto, Haskell (con las bibliotecas de "contenedores no ordenados" y "hamtmap") debido al soporte de persistentes estructuras de datos.
No hace mucho tiempo, lancé una biblioteca de contenedores especializados en STM basada en ese algoritmo llamado "contenedores-stm", que debería adaptarse perfectamente a su tarea. También puede consultar una publicación de blog introductoria , que cubre una motivación detrás de la biblioteca y proporciona puntos de referencia.
fuente
La implementación a la que hace referencia es parte de un paquete para implementar un B-Tree concurrente. HashTable en sí se implementa como una matriz de TVars de objetos Data.Map.
Los valores de complejidad citados son el peor de los casos . Recuerde que las tablas hash son generalmente el peor caso de O (N) para búsqueda, inserción y eliminación. El uso de Map para los depósitos lo reduce a O (log (N)).
fuente