scala - Scala Vector 中的结构共享

标签 scala functional-programming

Scala 中的结构共享 List简单易懂。但是 Scala Vector是比列表更复杂的数据结构。 Scala 中如何实现结构共享Vector ?

最佳答案

Vector 基本上是一棵树(trie),每一层都有 32 个宽的分支。例如,如果您有一个包含 3000 个元素的 Vector 并且您想要索引元素 2045,例如,它会转换为 100000010101在二进制中,它会将其分解为 5 位块以用作树的索引:10 (即 2)在第一个分支然后 00000 (即 0)在下一个,最后是 10101 (即 21)在终端分支中,然后是数据。

鉴于这种结构,很容易看出如何在结构上共享事物:您可以共享任何未更改的子树。因此,如果您使用不同的元素 2045 创建一个新向量,则不必更改所有 3000 个元素,而是“仅”重新创建三个大小为 32 的数组:终端一个被替换为更新其元素 21 的副本;那么它的父级必须被一个在索引 0 中具有这个新子级的副本替换;那么它的父级必须用索引 2 中的正确子树替换。

现在,只要向量中的元素超过 32 个,这就提供了相当多的结构共享,但这仍然是一个相当大的开销。因此,向量末尾的添加是特殊情况,因此您只需添加到现有数组。旧的 Vectors 仍然指向那个数组,但他们认为结束更早(并且那部分没有改变)所以它可以正常工作。

有一个更复杂但类似的方案,允许以类似的方式在向量的前面添加(基本上,通过在前面留下空间并通过索引和偏移量跟踪指向的位置以及索引方案)。

但是,实现的技巧并不能允许在前后交替添加,因此每次添加都可以有效地重建树。制作一个具有更好结构共享的版本是可能的,但访问速度可能会慢一些。

关于scala - Scala Vector 中的结构共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31481665/

相关文章:

xml - java.nio.charset.UnmappableCharacterException : Input length = 1

scala - Kotlin zip所有替代方案

design-patterns - 是否可以向 Scala 中的内置类型添加方法?

scala - 如何在 Scala 中使用 Reader 和 Writer monad?

scala - 函数式编程的非数值用例?

kotlin - ArrowKt Try渴望执行的替代方法

scala - 在函数外部导入 scalaz monad 语法

scala - 如何在 Scala-IDE 中解析对旋转生成的模板类的引用?

lambda - 方案:β 降低挑战

unit-testing - OCaml 使用异步编写超时函数