哈斯克尔:Datastruture与O(1)追加和O(1)索引?(Haskell: Datastru

2019-07-29 06:27发布

我要寻找在Haskell同时支持快速索引和快速追加的数据结构。 这对于源自递归一个记忆化问题。

载体在C工作++(这是可变的,但不应该在这种情况下,重要)的方式似乎与两个(摊销)O不变载体(1)追加和O(1)分度应该是可能的(好吧,这不是,看评论这个问题)。 这是poossible在Haskell或者我应该去Data.Sequence具有(AFAICT反正)O(1)追加和O(日志(分(I,NI)))索引?

与此相关,作为一个Haskell新手,我发现自己的一个实用,简明指南Haskell的数据结构的向往。 理想情况下,这将给予比与性能特点和指针沿着最实用的数据结构相当全面的概述哈斯克尔在那里它们被实施库。 它似乎有大量的信息在那里,但我发现它是一个小散。 我是不是要求太多了?

Answer 1:

如果没有记错,C ++矢量被实现为与边界和大小信息的数组。 当插入会增加边界超出了尺寸,大小加倍。 这是摊销O(1)时间插入(未O(1)如权利要求你),并且可以在Haskell使用被仿真就好Array类型,或许与合适的IOST预先考虑。



Answer 2:

对于简单的记忆化问题,你通常要建表一次,然后无法修改它。 在这种情况下,你可不必担心追加,而不是通过思考记忆化表的建设作为一个操作。

一种方法是采取懒惰的评价优势和参考表,同时我们正在建设它。

import Data.Array
fibs = listArray (0, n-1) $ 0 : 1 : [fibs!(i-1) + fibs!(i-2) | i <- [2..n-1]]
  where n = 100

当表的元素之间的依赖关系,使拿出提前进行评价,一个简单的订单很难这种方法是非常有用的。 但是,它需要使用盒装数组或向量,这可能使这种方法不适合于大表由于额外的开销。

对于未装箱的载体,你有一个像操作constructN它可以让你在一个纯粹的方式建一个表,而使用突变之下,使之高效。 它通过给传递迄今构建的载体,然后可以用它来计算下一个元素的前缀的不可变视图功能执行此操作。

import Data.Vector.Unboxed as V
fibs = constructN 100 f
  where f xs | i < 2 = i
             | otherwise = xs!(i-1) + xs!(i-2)
             where i = V.length xs


Answer 3:

看看这使你应该使用什么更明智的选择。

但简单的事实是,如果你想要一个C ++向量的等效,使用Data.Vector



文章来源: Haskell: Datastruture with O(1) append and O(1) indexing?