【发布时间】:2011-12-22 05:35:10
【问题描述】:
我一直是Data.Sequence 的忠实粉丝。但正如我一直在了解Data.Vector 一样,它似乎可以做所有 Data.Sequence 可以做的事情,而且更好,而且它可以做更多的事情。我们是否应该弃用 Data.Sequence 而宣扬 Data.Vector?使用 Data.Sequence 而不是 Data.Vector 有什么好的理由吗?
【问题讨论】:
我一直是Data.Sequence 的忠实粉丝。但正如我一直在了解Data.Vector 一样,它似乎可以做所有 Data.Sequence 可以做的事情,而且更好,而且它可以做更多的事情。我们是否应该弃用 Data.Sequence 而宣扬 Data.Vector?使用 Data.Sequence 而不是 Data.Vector 有什么好的理由吗?
【问题讨论】:
这些数据结构都不能替代另一个; Data.Sequence 和 Data.Vector 实际上位于可用于表示序列的数据结构的截然相反的两端。
Data.Vector 是一个连续的元素数组。这意味着较小的内存占用和 O(1) 查找,但可怕的突变、连接和复制(每个 O(n))。 (如果放弃持久性,突变可能是 O(1)。)Data.Sequence 是一个纯粹的功能树。这意味着更高的内存使用率和更少的局部性,但它支持快速访问和突变 O(log n) 以及出色的串联 O(log(min(n1,n2))) 和复制。数据结构的选择实际上取决于手头的任务。
Data.Vector。Data.Sequence。【讨论】:
ST monad,Vectors 的突变变得非常容易。
Data.Sequence而不是Data.Vector来实现一个高效的队列或双端队列。
fmap、<*> 和(最近)fromFunction 具有向量只能梦想的惰性性能特征,而且他们的replicate 和*> 与 Tardis 一样——内部更大。所以replicate n v只需要O(log n)时间和空间,而截至今天,GitHub上*>的版本可以循环N个长度为L的序列的副本,只需要O(log N+log L)时间和额外的空间。
Seq 似乎比Vector 更擅长共享前缀。 snoc 上 Vector 是 O(n)。
【讨论】:
Vector 有流融合之类的东西,Seq 没有。
Seq over Vector!关键是,通过本机共享前缀,Seq 能够更有效地处理将要拆分和/或附加的持久数据。