【问题标题】:Why are vectors so shallow?为什么向量这么浅?
【发布时间】:2012-09-09 22:08:18
【问题描述】:

Scala 的向量具有 32 的分支因子而不是其他数字的基本原理是什么?较小的分支因子不会实现更多的结构共享吗? Clojure 似乎使用相同的分支因子。我缺少的分支因子 32 有什么神奇之处吗?

【问题讨论】:

  • 我责怪主流媒体。

标签: scala collections vector clojure tree


【解决方案1】:

如果您能解释一下什么是分支因子会有所帮助:

树或图的分支因子是每个节点的子节点数。

所以,答案似乎主要在这里:

http://www.scala-lang.org/docu/files/collections-api/collections_15.html

向量表示为具有高分支因子的树。每一个 树节点最多包含向量的 32 个元素或最多包含 32 个其他树节点。最多可以表示 32 个元素的向量 在单个节点中。最多可包含 32 * 32 = 1024 个元素的向量 用单个间接表示。从根的两跳 到最后一个元素节点的树对于最多具有的向量就足够了 215 个元素,向量 3 跳 220 ,向量 4 跳 具有 225 个元素和 5 个跃点,用于具有最多 230 个元素的向量。 因此,对于所有合理大小的向量,元素选择涉及 最多 5 个原始数组选择。这就是我们的意思,当我们 写道元素访问是“有效的恒定时间”。

因此,基本上,他们必须就每个节点有多少个孩子做出设计决定。正如他们解释的那样,32 似乎是合理的,但是,如果你发现它对你来说过于严格,那么你总是可以编写自己的类。

关于为什么它可能是 32 的更多信息,您可以查看这篇论文,因为在介绍中他们做出了与上面相同的声明,关于它几乎是恒定的时间,但这篇论文似乎更多地处理 Clojure比 Scala。

http://infoscience.epfl.ch/record/169879/files/RMTrees.pdf

【讨论】:

    【解决方案2】:

    詹姆斯布莱克的回答是正确的。选择 32 项的另一个论据可能是,许多现代处理器中的高速缓存行大小为 64 字节,因此两行可以容纳 32 个整数,每行 4 个字节,或者在 32 位机器或 64 位 JVM 上可以容纳 32 个指针,堆大小高达32GB 由于指针压缩。

    【讨论】:

    • 现在删除评论,以避免冗余。
    • 现代缓存线是 64 字节。英特尔最新、最新的处理器可能只有 128 字节。
    【解决方案3】:

    这是更新的“有效恒定时间”。有了这么大的分支因子,你永远不必超过 5 个级别,即使是 TB 级的向量也是如此。这是 Rich 在第 9 频道上谈论 Clojure 的其他方面的视频。http://channel9.msdn.com/Shows/Going+Deep/Expert-to-Expert-Rich-Hickey-and-Brian-Beckman-Inside-Clojure

    【讨论】:

      【解决方案4】:

      只是在詹姆斯的回答中添加一点。

      从算法分析的角度来看, 因为这两个函数的增长是对数的,所以它们的缩放方式相同。

      但是,在实际应用中,具有 hops 的 hops 数量比 base 2 少得多,足以使其保持更接近恒定时间,即使对于相当大的 N 值也是如此。

      我确信他们准确地选择了 32 个(而不是更高的数字),因为内存块大小有所不同,但主要原因是与较小的大小相比,跃点数更少。

      我还建议您观看 InfoQ 上的此演示文稿,Daniel Spiewak 在大约 30 分钟开始讨论向量:http://www.infoq.com/presentations/Functional-Data-Structures-in-Scala

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-12
        • 2021-09-04
        • 1970-01-01
        • 2011-04-18
        • 1970-01-01
        • 2020-06-01
        相关资源
        最近更新 更多