纯功能(持久)环形缓冲区

时间:2018-10-19 18:36:20

标签: haskell data-structures clojure ocaml purely-functional

我想通过以下操作使用纯功能数据结构实现环形缓冲区

  • 按索引的有效随机访问
  • 添加到最前面
  • 从后面移走

使用持久数据结构的原因是因为我有一个写程序线程和几个读程序线程,并且我想避免读者阻塞写程序。

通过使读取者线程仅在拍摄快照时才持有该锁,然后使用快照进行处理,可以轻松地做到这一点。

支持这些操作的现有可用数据结构是什么?

  • 双向链表不能有效地进行索引查找并且为O(n)
  • 基于Phil Bagwell理想哈希树的Clojure PersistentVector,支持log32N中的索引访问,并且subvec可用于从头开始删除元素。
  • 还可以通过将整数存储为键来使用哈希数组映射的特里,但可能效率不高。

在这种情况下,还可以使用其他纯功能数据结构吗?

1 个答案:

答案 0 :(得分:5)

finger tree(在标准库中为Data.Sequence)是持久性随机访问序列的首选。我认为它满足您的条件-随机访问索引为 O(log n)(更具体地说,索引到边缘的距离的对数),其他为 O(1)< / em>。我不知道任何持久性数据结构的性能要比这更好。