我需要一个数据结构,它支持以下内存和时间效率操作,可以假设该值具有排序。
另外,结构必须是不可变的,因为我想使用Haskell。
如果我不假设不变性,可能会选择布隆过滤器。
我正在对我的优化问题进行编码,因为我无法回避,是否已经处理了一个条目,我必须查找。
答案 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
。