【发布时间】:2012-09-09 22:08:18
【问题描述】:
Scala 的向量具有 32 的分支因子而不是其他数字的基本原理是什么?较小的分支因子不会实现更多的结构共享吗? Clojure 似乎使用相同的分支因子。我缺少的分支因子 32 有什么神奇之处吗?
【问题讨论】:
-
我责怪主流媒体。
标签: scala collections vector clojure tree
Scala 的向量具有 32 的分支因子而不是其他数字的基本原理是什么?较小的分支因子不会实现更多的结构共享吗? Clojure 似乎使用相同的分支因子。我缺少的分支因子 32 有什么神奇之处吗?
【问题讨论】:
标签: scala collections vector clojure tree
如果您能解释一下什么是分支因子会有所帮助:
树或图的分支因子是每个节点的子节点数。
所以,答案似乎主要在这里:
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。
【讨论】:
詹姆斯布莱克的回答是正确的。选择 32 项的另一个论据可能是,许多现代处理器中的高速缓存行大小为 64 字节,因此两行可以容纳 32 个整数,每行 4 个字节,或者在 32 位机器或 64 位 JVM 上可以容纳 32 个指针,堆大小高达32GB 由于指针压缩。
【讨论】:
这是更新的“有效恒定时间”。有了这么大的分支因子,你永远不必超过 5 个级别,即使是 TB 级的向量也是如此。这是 Rich 在第 9 频道上谈论 Clojure 的其他方面的视频。http://channel9.msdn.com/Shows/Going+Deep/Expert-to-Expert-Rich-Hickey-and-Brian-Beckman-Inside-Clojure
【讨论】:
只是在詹姆斯的回答中添加一点。
从算法分析的角度来看, 因为这两个函数的增长是对数的,所以它们的缩放方式相同。
但是,在实际应用中,具有 hops 的 hops 数量比 base 2 少得多,足以使其保持更接近恒定时间,即使对于相当大的 N 值也是如此。
我确信他们准确地选择了 32 个(而不是更高的数字),因为内存块大小有所不同,但主要原因是与较小的大小相比,跃点数更少。
我还建议您观看 InfoQ 上的此演示文稿,Daniel Spiewak 在大约 30 分钟开始讨论向量:http://www.infoq.com/presentations/Functional-Data-Structures-in-Scala
【讨论】: