Scala不可变索引序列是如何实现的,其操作的复杂性是什么?

Scala不可变索引序列是如何实现的,其操作的复杂性是什么?,scala,time-complexity,scala-collections,seq,Scala,Time Complexity,Scala Collections,Seq,我隐约记得在某个地方读到Scala的不可变索引序列操作是O(logn),但对数的底足够大,因此在所有实际用途中,这些操作几乎类似于O(1)。这是真的吗 如何实现IndexedSeq来实现这一点?IndexedSeq是一个向量,它是一个扇出为32的树(实际上是trie)结构。所以,不计算内存的局部性,你永远不会超过大约6的O(logn)因子——与二叉树相比,它的范围是1到30 也就是说,如果你也计算内存的局部性,你会注意到索引到1G元素向量和10元素向量之间的巨大差异。(你会注意到数组也有很大的不

我隐约记得在某个地方读到Scala的不可变索引序列操作是O(logn),但对数的底足够大,因此在所有实际用途中,这些操作几乎类似于O(1)。这是真的吗


如何实现
IndexedSeq
来实现这一点?

IndexedSeq
是一个
向量,它是一个扇出为32的树(实际上是trie)结构。所以,不计算内存的局部性,你永远不会超过大约6的O(logn)因子——与二叉树相比,它的范围是1到30


也就是说,如果你也计算内存的局部性,你会注意到索引到1G元素向量和10元素向量之间的巨大差异。(你会注意到
数组也有很大的不同。)

默认的
不可变。IndexedSeq
向量。以下是关于其实施的摘录:

向量表示为具有高分支因子的树(树或图的分支因子是每个节点上的子节点数)。每个树节点最多包含32个向量元素,或最多包含32个其他树节点。单个节点中最多可以表示32个元素的向量。最多包含32*32=1024个元素的向量可以用单个间接寻址表示。对于包含最多2^15个元素的向量,从树的根到最终元素节点的两个跳足够了;对于包含2^20个元素的向量,三个跳足够了;对于包含2^25个元素的向量,四个跳足够了;对于包含最多2^30个元素的向量,五个跳足够了。因此,对于所有大小合理的向量,一个元素选择最多涉及5个基本数组选择。这就是我们在写元素访问是“有效的恒定时间”时的意思

immutable.HashSet
immutable.HashMap
使用类似的技术实现