【发布时间】:2010-02-08 16:12:26
【问题描述】:
我正在使用 Haskell 开发一个需要循环缓冲区的小型概念项目。我已经设法使用具有 O(1) 旋转的数组创建了一个缓冲区,但当然需要 O(N) 进行插入/删除。我找到了一个使用列表的实现,它似乎需要 O(1) 来进行插入和删除,但由于它维护一个左右列表,因此在旋转时越过某个边界需要 O(N) 时间。在命令式语言中,我可以实现一个具有 O(1) 插入、删除和旋转的双向链接循环缓冲区。我认为这在像 Haskell 这样的纯函数式语言中是不可能的,但我很想知道我是否错了。
【问题讨论】:
-
如果旋转时“越界”需要O(N)时间,不越界的代价是多少?如果是 O(1) 并且你只有 1/N 的概率越过边界,那么旋转平均需要 O(1) 时间。
-
是的,但是执行顺序操作可以保证您会在某个时刻越过它,并且时间复杂度对于每次旋转都很重要,因为这最终可能会成为一个软实时应用程序。
-
我从未使用过循环缓冲区;简单描述一下你的缓冲区在做什么很容易吗?在你的应用程序中它应该“覆盖”元素吗?
-
忘了补充:您是否考虑过是否可以利用惰性来使循环缓冲区结构变得不必要?
-
具体来说,我需要能够传递一个焦点在某个样本上的缓冲区,改变该样本,在 O(1) 中向左旋转焦点,并在 O(1) 中向右旋转焦点),全部作为单独的操作。
标签: haskell functional-programming circular-buffer