【问题标题】:What kind of data structure is used for immutable maps?不可变映射使用什么样的数据结构?
【发布时间】:2012-01-30 00:38:26
【问题描述】:

我知道普通的可变映射是如何工作的(使用哈希表),并且我知道不可变列表是如何工作的(递归链表)以及它们相对于可变列表的优势(恒定时间追加而不会弄乱原始映射)但是不可变映射(例如斯卡拉的)工作?

我知道在生成新地图时不弄乱原始地图的好处,但是底层数据结构是如何工作的,它们具有什么样的性能特征,例如与可变哈希表相比?有没有人们用来实现这些的标准数据结构,我可以在 CLRS/wikipedia 中查找?

【问题讨论】:

  • CLRS 以及几乎所有其他数据结构/算法教科书都严重偏向于可变性和杂质。 Chris Okasaki字面意思写了一本关于函数式数据结构的书,它是基于他早期的论文工作并对其进行了扩展。您应该看的其他作品是 Phil Bagwell 和 Rich Hickey。

标签: scala functional-programming immutability


【解决方案1】:

持久哈希映射是使用称为Hash trie的结构实现的。它是originally proposed by Phil Bagwell(他是 EPFL Scala 小组的成员),但实际上首先由 Clojure 实现。当 2.8 于 2010 年问世时,它击中了 scala。

Dan Spiewak 有一个great talk on functional data structures,其中非常清楚地解释了哈希树的机制(以及银行家队列等其他内容)!他还在演讲中很好地解释了渐近大 O 性能。

去年 10 月,Phil 在 London scala Lift Off 上发表了另一场演讲,这次是关于并行持久数据结构。

持久排序映射通过Red-Black tree实现

【讨论】:

  • 一般来说,持久化数据结构依赖于结构共享​​>(例如持久化的 cons 列表共享它们的尾部)。通常,您为此使用树。如果您了解持久性 cons 列表的工作原理,那么您就成功了一半:毕竟,列表只是一棵退化的树,到处只有一个分支。 (或者,树是列表的概括,其中每个单元格可以有多个后继。)
  • 我认为有趣的信息是如何将这种理解与基于哈希的访问联系起来
【解决方案2】:

它可以是一棵树(红黑)或哈希图。它们的访问特性取决于底层实现。一棵树是 O(log n) 用于读取访问;哈希映射是 O(1)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多