我想通过以下操作使用纯功能数据结构实现环形缓冲区
按索引进行有效的随机访问
添加到前面
从背面移除
使用持久数据结构的原因是因为我有一个写程序线程和几个读程序线程,并且我想避免读者阻塞写程序。
通过使读取器线程仅在拍摄快照时才持有锁,然后使用快照进行处理,可以轻松实现此目的。
支持这些操作的现有可用数据结构是什么?
双链表无法有效地执行索引查找,并且为O(n)
Clojure PersistentVector基于Phil Bagwell理想哈希树,支持log32N中的索引访问,并且subvec可用于从头开始删除元素。
散列数组映射的特里也可以通过将整数存储为键来使用,但效率可能不高。
在这种情况下,可以使用其他哪个纯功能数据结构?
最佳答案
finger tree(在标准库中为Data.Sequence
)是持久性随机访问序列的首选。我认为它满足您的条件-随机访问索引为O(log n)(更具体地说,索引到边缘的距离的对数),其他为O(1)。我不知道任何持久性数据结构的性能要比这更好。
关于haskell - 纯功能(持久)环形缓冲区,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52898190/