Ich möchte einen In-Memory-Datenspeicher für einen Webdienst in Haskell implementieren. Ich möchte Transaktionen in der STM
Monade ausführen .
Wenn ich die Hash-Tabelle Steam Haskell google, erhalte ich nur Folgendes: Data. BTree. HashTable. STM.
Der Modulname und die Komplexität legen nahe, dass dies als Baum implementiert ist. Ich würde denken, dass ein Array für veränderbare Hash-Tabellen effizienter sein sollte.
Gibt es einen Grund, die Verwendung eines Arrays für eine STM
Hashtabelle zu vermeiden ? Erhalte ich mit dieser Steam-Hash-Tabelle etwas oder sollte ich nur einen Steam-Ref zu einem verwenden IntMap
?
data-structures
haskell
Simon Bergot
quelle
quelle
Store ! blah
undStore ! baz
sequentiell sein müssenAntworten:
Das Problem bei einer Hash-Tabellen-Implementierung, die direkt auf einem Array basiert, besteht darin, dass für einige Operationen zwangsläufig eine lineare Größenänderung des Zeit-Arrays erforderlich ist (dh ein größeres / kleineres Array erstellt und alle Daten darauf kopiert werden). Es gibt mehrere Standardalgorithmen, die sich diesem Problem nähern, wie z. B. lineares Hashing oder Cuckoo Hashing .
Vor nicht allzu langer Zeit ist ein weiterer Algorithmus namens Hash Array Mapped Trie aufgetaucht, der aufgrund der Unterstützung von Persistent in funktionalen Sprachen wie Clojure, Scala und natürlich Haskell (mit den Bibliotheken "unordered-container" und "hamtmap") große Popularität erlangt hat Datenstrukturen.
Vor kurzem habe ich eine STM-spezialisierte Containerbibliothek veröffentlicht, die auf dem Algorithmus "stm-container" basiert und perfekt zu Ihrer Aufgabe passen sollte. Sie können auch einen einführenden Blog-Beitrag lesen, in dem eine Motivation hinter der Bibliothek behandelt und Benchmarks bereitgestellt werden.
quelle
Die Implementierung, auf die Sie verweisen, ist Teil eines Pakets zum Implementieren eines gleichzeitigen B-Tree. Die HashTable selbst ist als Array von TVars von Data.Map-Objekten implementiert.
Die angegebenen Komplexitätswerte sind im ungünstigsten Fall . Denken Sie daran, dass Hashtabellen normalerweise O (N) Worst Case für das Nachschlagen, Einfügen und Löschen sind. Wenn Sie Map für die Buckets verwenden, wird es auf O (log (N)) reduziert.
quelle