Scala - TrieMap 与 Vector

标签 scala data-structures hash trie

我读到 scala 中的 TrieMap 是基于数组映射的 trie,而 Vector 读取位映射向量 trie。

这两种数据结构是否都由相同的哈希树思想支持,或者它们之间是否存在差异?

最佳答案

有一些相似之处,但从根本上说它们是不同的数据结构:

矢量

Vector 中不涉及散列。索引直接描述进入树的路径。当然,向量的占用索引是连续的。

忽略 scala.collection.immutable.Vector 的生产实现中显示指针的所有技巧,向量中的每个分支节点都具有 相同数量的 child (在 scala Vector 的情况下为 32)。这允许使用简单的位操作进行索引。缺点是在向量中间拼接元素代价高昂。

enter image description here

哈希表

在 HashTrieMap 中,哈希码是进入树的路径。这意味着占用的索引不是连续的,而是均匀分布的。这需要对树分支节点进行不同的编码。

HashTrieMap 中,一个分支节点有最多 32 个 child (但是如果你有一个非常糟糕的散列码分布,那么完全有可能有一个分支节点只有一个 child )。有一个 Int 位图来编码哪个 child 对应哪个位置,这意味着在 HashTrieMap 中查找值需要频繁调用 Integer.bitCount ,幸运的是,它是现代 CPU 固有的 CPU。

enter image description here

这是一个有趣的项目,可让您查看 VectorHashMap 等 Scala 数据结构的内部结构:https://github.com/stanch/reftree

此答案中的图像是使用此项目生成的。

关于Scala - TrieMap 与 Vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37185648/

相关文章:

c# - .NET List.Find 运行时错误

php - 使用 PHP、MySQL 和 MD5 创建登录

scala - 如何在多个字段上动态排序 scala 列表

java - 如何实现每个节点都是一个类的堆?

scala - spark 将函数应用于并行列

algorithm - 计算地理 map 上点密度最高区域的高效算法

android - 是否每部 Android 手机都支持 SHA-256

c++ - 生成 blake2b 哈希时崩溃

scala - 在我的 Play 应用程序中没有请求的情况下无法从路由中获取 URL

java - 从 Scala(和 Java)访问 DRb 对象(例如 Ruby 队列)的最佳方式是什么?