Quero implementar um armazenamento de dados na memória para um serviço da Web em Haskell. Eu quero executar transações na STM
mônada.
Quando eu coloco no Google o haskell da tabela de hash, recebo apenas isso: Data. BTree. HashTable. STM.
O nome e as complexidades do módulo sugerem que isso é implementado como uma árvore. Eu pensaria que uma matriz deveria ser mais eficiente para tabelas de hash mutáveis.
Existe um motivo para evitar o uso de uma matriz para uma STM
hashtable? Ganho alguma coisa com esta tabela de hash de vapor ou devo apenas usar uma referência de vapor para uma IntMap
?
data-structures
haskell
Simon Bergot
fonte
fonte
Store ! blah
eStore ! baz
terá de ser sequenciaisRespostas:
O problema com uma implementação de tabela de hash baseada diretamente em uma matriz é que algumas das operações nela exigirão inevitavelmente redimensionamento linear da matriz de tempo (ou seja, criar uma matriz maior / menor e copiar todos os dados para ela). Existem vários algoritmos padrão que abordam esse problema, como Linear Hashing ou Cuckoo Hashing .
Há pouco tempo , surgiu outro algoritmo chamado Hash Array Mapped Trie , que ganhou grande popularidade em linguagens funcionais como Clojure, Scala e, é claro, Haskell (com as bibliotecas "unordered-containers" e "hamtmap") devido ao suporte a persistentes estruturas de dados.
Há pouco tempo, lancei uma biblioteca de contêineres especializada em STM, com base nesse algoritmo chamado "stm-containers", que deve se encaixar perfeitamente na sua tarefa. Você também pode conferir uma postagem introdutória do blog , cobrindo uma motivação por trás da biblioteca e fornecendo referências.
fonte
A implementação que você faz referência faz parte de um pacote para implementar uma B-Tree simultânea. O próprio HashTable é implementado como uma matriz de TVars de objetos Data.Map.
Os valores de complexidade citados são os piores casos . Lembre-se de que as hashtables geralmente são O (N) o pior caso para pesquisa, inserção e exclusão. Usar o Mapa para os buckets reduz para O (log (N)).
fonte