【问题标题】:persistent data structure (in Scala) that supports fast lookup AND insertion order?支持快速查找和插入顺序的持久数据结构(在 Scala 中)?
【发布时间】:2013-06-03 02:57:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: scala map persistent linkedhashmap insertion-order


    【解决方案1】:

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

    关于有限映射。 Scala(就像 Closure 一样)使用 HAMT (Hash Array Mapped Tree) 数据结构来实现哈希表。而且它真的很快。还有Fast Mergeble Integer Maps (by C. Okasaki) 可以用作有限映射。而且,你对树木的看法是对的。 Haskell 使用红黑树作为有限映射实现。它也很快,几乎O(1)。例如,要在 JVM 平台的此类映射中存储所有可能的键,您需要分配 2147483647 个节点。因此,要查找整个树,您只需要 log_2(2147483647)=31 步骤。没那么慢吧?

    【讨论】:

    • 我想这是我能得到的最接近的。也许我对一种数据结构的要求太高了。我刚刚被 Java 中的 LinkedHashMap 宠坏了。最后,对于我的特殊问题,我意识到我不需要那么多查找,并将结构简化为对列表。
    猜你喜欢
    • 1970-01-01
    • 2011-03-07
    • 2011-02-02
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多