插入和搜索的功能结构的良好选择 -

时间:2010-09-23 13:25:51

标签: search data-structures haskell

我需要一个数据结构,它支持以下内存和时间效率操作,可以假设该值具有排序。

  • 为结构添加值
  • 找出值是否在结构中

另外,结构必须是不可变的,因为我想使用Haskell。

如果我不假设不变性,可能会选择布隆过滤器。

我正在对我的优化问题进行编码,因为我无法回避,是否已经处理了一个条目,我必须查找。

2 个答案:

答案 0 :(得分:4)

通常在需要检查成员资格的情况下使用的数据结构通常为Data.Set,这是一个基于树的集合,可在O(log n)时间内提供查找和插入操作。

但是,由于您提到了bloom过滤器:有Bloom Filter implementations for Haskell。因此,在您选择其他语言的bloom过滤器的情况下,您仍然可以在Haskell中这样做。

答案 1 :(得分:4)

Data.Set确实是最直接的选择,但如果您可以将数据结构投影到Int,那么您可以使用IntSet来获得比Data.Set更高的效率。如果您的投影是有损的(也就是说它实际上是一个哈希),那么使用基础IntSet(即HashSet)的哈希表通常会更有效。确切地说,这样的软件包存在于Hackage中,并且已被评为非常好的基准:http://hackage.haskell.org/package/hashmap

最后,如果您需要进行成员资格检查,而不是提取,并且您真的关心使用最小空间,那么您可以将数据结构投影到整数(假设可以节省空间,这实际上取决于...)然后使用这些HashSet