【问题标题】:Does Data.Vector replace Data.Sequence?Data.Vector 是否取代 Data.Sequence?
【发布时间】:2011-12-22 05:35:10
【问题描述】:

我一直是Data.Sequence 的忠实粉丝。但正如我一直在了解Data.Vector 一样,它似乎可以做所有 Data.Sequence 可以做的事情,而且更好,而且它可以做更多的事情。我们是否应该弃用 Data.Sequence 而宣扬 Data.Vector?使用 Data.Sequence 而不是 Data.Vector 有什么好的理由吗?

【问题讨论】:

    标签: haskell vector sequence


    【解决方案1】:

    这些数据结构都不能替代另一个; Data.SequenceData.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)时间和额外的空间。
    【解决方案2】:

    Seq 似乎比Vector 更擅长共享前缀。 snocVector 是 O(n)。

    【讨论】:

    • 嗯,Vector 有流融合之类的东西,Seq 没有。
    • @FUZxxl 我当然不提倡Seq over Vector!关键是,通过本机共享前缀,Seq 能够更有效地处理将要拆分和/或附加的持久数据。
    • @FUZxxl:即使使用流融合,在大多数情况下,snoc 和 cons 都需要使用 Vector 复制整个数组,而 Data.Sequence 则不是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多