Golang地图内部实现 - 如何在地图中搜索密钥?

时间:2016-06-23 15:17:01

标签: dictionary go

我已经读过" Go编程语言"可以检索一个"给定的密钥...平均使用一定数量的密钥比较,无论哈希表有多大。"我不确定这在内部的实现方面意味着什么。这是否意味着它会搜索每个键,直到找到匹配或者是内部使用的某种类型的二进制(或其他)搜索算法?

例如,如果我有一张包含2,000个按键的地图,那么它的平均值是""需要看1000才能找到匹配,或者只看11(log2 n),就像二元搜索一样?

谢谢, 本

2 个答案:

答案 0 :(得分:23)

地图实现为哈希表。有很多地方可以解释哈希; Here's你可以运行一个很好的可视化。

Go的一个不错的功能是

  • 源代码可在github上找到,
  • 写得很好并且有文档证明,所以不难理解。

来自hashmap的源文件:

// A map is just a hash table. The data is arranged
// into an array of buckets. Each bucket contains up to
// 8 key/value pairs. The low-order bits of the hash are
// used to select a bucket. Each bucket contains a few
// high-order bits of each hash to distinguish the entries
// within a single bucket.
//
// If more than 8 keys hash to a bucket, we chain on
// extra buckets.

https://github.com/golang/go/blob/master/src/runtime/map.go

您可以从许多类中通常没有涉及的代码中学到的一件事是,如何在内部调整地图大小时使迭代器无效。

答案 1 :(得分:6)

原生地图类型使用hash table实施。它在密钥上使用散列函数来生成数据数组的索引。因此,通常,大多数动作发生在O(1)时间内。这通常是正确的,因为某些键在散列时可能会产生相同的索引,称为碰撞,然后必须专门处理。

Hash tables很酷!