为什么矢量太浅?

时间:2012-09-17 16:34:25

标签: scala collections vector clojure tree

分支因子为32的Scala矢量背后的原理是什么,而不是其他数字?不小的分支因子能够实现更多的结构共享吗? Clojure似乎使用相同的分支因子。我错过的分支因子32有什么神奇之处吗?

4 个答案:

答案 0 :(得分:13)

如果你解释了分支因素是什么会有所帮助:

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

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

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

  

向量表示为具有高分支因子的树。一切   树节点最多包含32个向量元素或最多包含   32个其他树节点。可以表示具有多达32个元素的向量   在一个节点中。最多32 * 32 = 1024个元素的矢量可以   用单个间接表示。从根的两个跃点   最终元素节点的树足以满足最多的向量   2 15 元素,2个 20 的载体有3个跃点,载体有4个跃点   对于具有最多2个 30 元素的载体,具有2个 25 元素和5个跃点。   因此,对于所有合理大小的向量,元素选择都涉及   最多5个原始数组选择。这就是我们的意思   写道,元素访问是“有效的恒定时间”。

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

有关为什么它可能是32的更多信息,你可以看一下这篇论文,就像它们在上面做出的声明一样,关于它几乎是不变的时间,但是这篇论文看起来像Clojure,更多比斯卡拉。

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

答案 1 :(得分:8)

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

答案 2 :(得分:4)

这是更新的“有效恒定时间”。有了这么大的分支因子,你就不必超过5级,即使对于TB级的矢量也是如此。这是Rich的一个视频,讲述了第9频道Clojure的内容和其他方面。http://channel9.msdn.com/Shows/Going+Deep/Expert-to-Expert-Rich-Hickey-and-Brian-Beckman-Inside-Clojure

答案 3 :(得分:4)

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

从算法分析的角度来看,http://www.texify.com/img/%5CLARGE%5C%21O%28log%20_b%20%28N%29%29%20%3D%20O%28log%20_k%20%28N%29%29.gif因为两个函数的增长是对数的,所以它们的扩展方式相同。

但是,在实际应用中,有 enter image description here跳数比基数2少得多,足以让它更接近恒定时间,即使是相当大的N值。

我确信他们因为一些内存块大小而精确地选择了32(而不是更高的数字),但主要原因是与较小的大小相比,跳数更少。

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