Scala 为什么向量这么浅?

Scala 为什么向量这么浅?,scala,collections,vector,clojure,tree,Scala,Collections,Vector,Clojure,Tree,Scala向量的分支因子为32,而不是其他数字,其基本原理是什么?更小的分支因子不会带来更多的结构共享吗?Clojure似乎使用了相同的分支因子。分支因子32有什么神奇之处吗?如果你能解释一下什么是分支因子,那会有所帮助: 树或图的分支因子是每个节点上的子节点数 因此,答案似乎主要在这里: 向量表示为具有高分支因子的树。每一个 树节点最多包含32个向量元素或最多包含 32个其他树节点。最多可以表示32个元素的向量 在单个节点中。最多可使用32*32=1024个元素的向量 用单一间接方式表示。从

Scala向量的分支因子为32,而不是其他数字,其基本原理是什么?更小的分支因子不会带来更多的结构共享吗?Clojure似乎使用了相同的分支因子。分支因子32有什么神奇之处吗?如果你能解释一下什么是分支因子,那会有所帮助:

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

因此,答案似乎主要在这里:

向量表示为具有高分支因子的树。每一个 树节点最多包含32个向量元素或最多包含 32个其他树节点。最多可以表示32个元素的向量 在单个节点中。最多可使用32*32=1024个元素的向量 用单一间接方式表示。从根上跳两下 到最终元素节点的树对于最多为 215个元素,向量三跳,220个,向量四跳 有225个元素,最多230个元素的向量有5个跃点。 因此,对于所有大小合理的向量,元素选择包括 最多可选择5个基本阵列。这就是我们说的 他写道,元素访问是“有效的恒定时间”

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

关于为什么它可能是32的更多信息,你可以看看这篇文章,正如在导言中,他们做出了与上面相同的声明,关于它几乎是恒定时间,但这篇文章讨论的是Clojure,而不是Scala


这是更新的“有效固定时间”。有了这么大的分支因子,您永远不必超过5个级别,即使对于TB级的向量也是如此。这里有一段视频,Rich在第9频道谈论Clojure的这一点和其他方面

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

只需在James的答案中添加一位即可

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

但是,在实际应用中 跳数是比基数2小得多的跳数,足以使其保持接近恒定时间,即使对于相当大的N值也是如此

我敢肯定,由于内存块的大小,他们选择了32个(而不是更高的数字),但主要原因是与较小的大小相比,跳数较少


我还建议您在InfoQ上观看此演示,Daniel Spiewak从30分钟开始讨论向量:

我谴责主流媒体。现在删除评论以避免冗余。现代缓存线为64字节。英特尔最新的处理器可能只有128字节。