持久数据结构(在Scala中),支持快速查找和插入顺序?

时间:2013-06-06 22:30:08

标签: scala map persistent linkedhashmap insertion-order

当我使用地图时,我倾向于选择其元素可以按插入顺序迭代的元素。这使他们感觉更具确定性并且更容易测试。出于这个原因和其他人,我一直是Java中LinkedHashMap的傻瓜。

在FP世界中,对于查找,树木优先于地图。是的,在Scala中有一个名为ListMap的LinkedHashMap的不可变版本,但它不使用哈希值,对于大多数实际用途来说似乎太慢了。

如果我想获得不变性的优势,我怎样才能满足我对记住插入顺序以及快速查找的数据结构的渴望?有人在图书馆某处写过什么东西吗?

1 个答案:

答案 0 :(得分:1)

Finit maps(哈希表,字典)通常不保证正确的顺序迭代。对于大多数库和语言来说,这是常见的事情。因此,如果您想迭代它,我建议您将密钥(指针)存储到支持插入顺序迭代的其他数据结构中。因此,您可以遍历辅助数组并查找到finit映射以获取有关该条目的详细信息。

关于finit地图。 Scala(就像Closure一样)使用HAMT(Hash Array Mapped Tree)数据结构进行哈希表实现。它真的很快。还有Fast Mergeble Integer Map s(由C. Okasaki提供)可以用作有限元图。而且,你对树木是正确的。 Haskell使用Red-Black树作为finit map实现。它也很快,几乎O(1)。例如,要在JVM平台中将所有可能的密钥存储在此类映射中,您需要分配2147483647个节点。因此,要查看整个树,您只需要log_2(2147483647)=31个步骤。不是那么慢,对吧?