Saya ingin mengimplementasikan datastore dalam memori untuk layanan web di Haskell. Saya ingin menjalankan transaksi di STM
monad.
Ketika saya google hash table steam Haskell saya hanya mendapatkan ini: Data. BTree. HashTable. STM.
Nama modul dan kerumitan menyarankan ini diterapkan sebagai pohon. Saya akan berpikir bahwa array harus lebih efisien untuk tabel hash yang bisa berubah.
Apakah ada alasan untuk menghindari penggunaan array untuk STM
hashtable? Apakah saya mendapatkan sesuatu dengan tabel hash uap ini atau haruskah saya menggunakan referensi uap ke IntMap
?
data-structures
haskell
Simon Bergot
sumber
sumber
Store ! blah
danStore ! baz
harus berurutanJawaban:
Masalah dengan implementasi tabel hash berdasarkan langsung pada array adalah bahwa beberapa operasi di atasnya pasti akan memerlukan pengubahan ukuran array waktu linier (yaitu, menciptakan array yang lebih besar / lebih kecil dan menyalin semua data ke dalamnya). Ada beberapa algoritma standar yang mendekati masalah ini, seperti Linear Hashing atau Cuckoo Hashing .
Belum lama ini algoritma lain bernama Hash Array Mapped Trie muncul, yang memperoleh popularitas besar di berbagai bahasa fungsional seperti Clojure, Scala dan, tentu saja, Haskell (dengan perpustakaan "wadah tidak berurutan" dan "hamtmap") karena dukungan dari persisten struktur data.
Belum lama ini saya merilis perpustakaan kontainer khusus-STM berdasarkan algoritma yang bernama "stm-container", yang seharusnya sesuai dengan tugas Anda dengan sempurna. Anda juga dapat melihat posting blog pengantar , yang mencakup motivasi di belakang perpustakaan dan memberikan tolok ukur.
sumber
Referensi implementasi Anda adalah bagian dari paket untuk mengimplementasikan B-Tree bersamaan. The HashTable sendiri diimplementasikan sebagai array objek TVars Data.Map.
Nilai kompleksitas yang dikutip adalah yang terburuk . Ingat bahwa hashtables biasanya O (N) kasus terburuk untuk pencarian, penyisipan, dan penghapusan. Menggunakan Map untuk bucket membawanya ke O (log (N)).
sumber