【问题标题】:Persistent data structures in ScalaScala 中的持久数据结构
【发布时间】:2011-03-07 15:14:38
【问题描述】:

Scala 中的所有不可变数据结构都是持久的吗?如果不是,它们中的哪些是,哪些不是?那些坚持不懈的人的行为特征是什么?另外,它们与 Clojure 中的持久数据结构相比如何?

【问题讨论】:

    标签: data-structures scala clojure persistent


    【解决方案1】:

    Scala 的不可变数据结构都是持久的,从某种意义上说,旧值由“更新”操作维护。事实上,我不知道不可变和持久之间的区别。对我来说,这两个术语是别名。

    Scala 2.8 的两个不可变数据结构是向量和哈希尝试,表示为 32 叉树。这些最初是由 Phil Bagwell 设计的,他在 EPFL 与我的团队一起工作,然后被 Clojure 采用,现在最终被 Scala 2.8 采用。 Scala 实现与 Clojure 实现共享一个共同的根,但肯定不是它的一个端口。

    【讨论】:

    • 嗯,我的理解是,“持久”是指更新不可变值返回的值与原始值共享子结构而不是完全克隆的实现。这可以为不可变集合提供与可变集合接近的性能 - 您无需复制 10k 旧元素即可添加一个新元素。
    • 我不认为数据共享(与复制相反)是持久性的先决条件,因为该术语通常被使用。 (en.wikipedia.org/wiki/Persistent_data_structure)
    • 我在akka.io/docs/akka/1.2/scala/stm.html 中找到了这一段:“Scala 提供了所谓的持久化数据结构,这使得处理不可变集合的速度更快。它们是不可变的,但具有恒定的时间访问和修改。它们使用结构共享和插入或更新不会破坏旧结构,因此是“持久的”。可以快速处理不可变的复合类型。持久数据结构目前由 Map 和 Vector 组成。” - 鉴于这个答案,我觉得有点令人费解。我可能只是误解了一些东西。
    • “持久”意味着当你“修改”其中一个结构时(例如,将 key/val 插入到 map 中),原始数据结构提供的性能保证也适用于派生数据结构.如果不是这种情况,很容易构建一个实现。
    【解决方案2】:
    【解决方案3】:

    List、Vector、HashMap 和 HashSet 在 Scala 2.8 上都是持久化的。还有其他持久性数据结构,但这些涵盖了所有主要用途,我不确定列举所有这些有什么意义。

    【讨论】:

    • 这是否意味着HashMap的+方法是O(1)?
    • @MartinKonicek "Effective" O(1),这意味着必须有一些假设才能使其为 O(1)。查看集合performance characteristics docs。
    • 谢谢@Daniel C. Sobral!
    【解决方案4】:

    对于您问题的最后一部分,我记得 Rich Hickey 在演示文稿中提到 Clojure 数据结构已被移植到 Scala。此外,Michael Fogus 在 this interview 中提到了 Scala 2.8 采用 Clojure 的一些数据结构的计划。

    抱歉,细节太少了...我不确定上述 Scala 2.8 计划的状态如何,但我记得 Rich 和 Michael 提到过这一点,并认为这对你来说可能是一件有趣的事情 google如果你有兴趣的话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      相关资源
      最近更新 更多