【发布时间】:2012-05-13 11:11:35
【问题描述】:
我在 Haskell 中寻找一种同时支持快速索引和快速追加的数据结构。这是针对递归引起的记忆问题。
从向量在 c++ 中的工作方式(它是可变的,但在这种情况下这不重要)看来,具有(摊销)O(1) 附加和 O(1) 索引的不可变向量应该是可能的(好的,不是的,请参阅这个问题的 cmets)。这在 Haskell 中是否可行,或者我应该使用具有(AFAICT 无论如何)O(1) 附加和 O(log(min(i,n-i))) 索引的 Data.Sequence?
在相关的说明中,作为一名 Haskell 新手,我发现自己渴望一份实用、简洁的 Haskell 数据结构指南。理想情况下,这将对最实用的数据结构以及性能特征和实现它们的 Haskell 库的指针提供相当全面的概述。似乎那里有很多信息,但我发现它有点分散。我是不是要求太多了?
【问题讨论】:
-
我很确定不存在这样的数据结构。如果你所有的追加都是线性发生的,使用
Data.Vector,因为融合会给你想要的性能,否则使用Data.Sequence -
谢谢。我认为这应该是可能的,但也许是专业的......你能解释一下“你所有的附加都是线性发生的”是什么意思吗?你的意思是线性增加的指数?似乎使用向量每个操作仍然是 O(n) ...
-
基本上,如果您可以将向量视为以不保存中间值的方式通过代码“线程化”,则可以将附加“融合”到单个操作中。跨度>
-
"从向量在 c++ 中的工作方式(它是可变的,但在这种情况下应该无关紧要)看来,具有 O(1) 附加和 O(1) 索引的不可变向量应该是可能的”。您如何想象这样的数据结构如何工作?它如何避免在插入时复制数据,并且该操作仍然具有
O(1)复杂性?简而言之,我认为你在这里错了。 C++ 向量的可变性确实在这里很重要。 -
@Paul:嗯,不变性要求您可以对具有两个不同值的同一个基向量执行附加操作,结果应该产生两个不同的向量。这对于您描述的方案是不可能的(向量必须至少复制一次)。
标签: haskell data-structures vector