Je souhaite implémenter une banque de données en mémoire pour un service Web à Haskell. Je veux exécuter des transactions dans la STM
monade.
Lorsque je google table de hachage sur Steam Haskell, je n'obtiens que ceci: Data. BTree. HashTable. STM.
Le nom et la complexité du module suggèrent que cela est implémenté sous forme d'arbre. Je pense qu'un tableau devrait être plus efficace pour les tables de hachage mutables.
Y a-t-il une raison pour éviter d'utiliser un tableau pour une STM
table de hachage? Dois-je gagner quelque chose avec cette table de hachage à vapeur ou dois-je simplement utiliser une référence de vapeur à un IntMap
?
data-structures
haskell
Simon Bergot
la source
la source
Store ! blah
etStore ! baz
devra être séquentielleRéponses:
Le problème avec une implémentation de table de hachage basée directement sur un tableau est que certaines opérations sur celui-ci nécessiteront inévitablement un redimensionnement du tableau de temps linéaire (c'est-à-dire, la création d'un tableau plus grand / plus petit et la copie de toutes les données). Il existe plusieurs algorithmes standard qui abordent ce problème, comme le hachage linéaire ou le hachage de coucou .
Il n'y a pas si longtemps, un autre algorithme nommé Hash Array Mapped Trie a émergé, qui a gagné une grande popularité dans les langages fonctionnels comme Clojure, Scala et, bien sûr, Haskell (avec les bibliothèques "unordered-containers" et "hamtmap") en raison du support de persistant structures de données.
Il n'y a pas longtemps, j'ai publié une bibliothèque de conteneurs spécialisés STM basée sur cet algorithme nommé "conteneurs stm", qui devrait parfaitement s'adapter à votre tâche. Vous pouvez également consulter un article de blog d'introduction , couvrant une motivation derrière la bibliothèque et fournissant des repères.
la source
L'implémentation que vous référencez fait partie d'un package pour implémenter un B-Tree simultané. Le HashTable lui-même est implémenté comme un tableau de TVars d'objets Data.Map.
Les valeurs de complexité citées sont le pire des cas . N'oubliez pas que les tables de hachage sont généralement le pire des cas O (N) pour la recherche, l'insertion et la suppression. L'utilisation de Map pour les compartiments la ramène à O (log (N)).
la source