在著名的《The Go 编程语言》中,指出 Map 的 key 检索操作涉及一个常量键比较的平均次数,无论其哈希表的大小如何。这激发了人们对底层实现和所使用的特定搜索算法的好奇。
Go 映射的实现利用了哈希表。散列是一个广泛讨论的话题,本质上是一种根据键的散列值将数据组织到桶数组中的方法。在 Go 中,每个存储桶最多可容纳 8 个键值对,并且利用哈希的最低有效位来定位适当的存储桶。
但是,需要强调的是,Go 映射实现了链接,这无缝管理超过八个密钥散列到同一存储桶的情况。发生这种情况时,会使用额外的存储桶来链接到溢出的键。
为了说明这一点,请考虑一个具有 2,000 个键的映射。定位特定键的平均比较次数不一定是 1,000 次。 Go 地图的实现采用了散列和链接的复杂组合,从而消除了详尽的线性搜索的需要。
此外,可在 GitHub 上公开访问的 Go 源代码提供了有关地图实现的宝贵见解。代码的清晰度和文档使得深入研究其内部工作原理变得相对简单。
通过检查 hashmap 的源文件,我们发现了 Go 的映射实现的一个有趣的方面:在映射调整大小期间保留迭代器的有效性。这种技术确保即使映射的底层结构发生变化,迭代器也能保持其功能。
以上是Go 的 Map 实现如何实现恒定的平均键搜索时间?的详细内容。更多信息请关注PHP中文网其他相关文章!