我已经读过" Go编程语言"可以检索一个"给定的密钥...平均使用一定数量的密钥比较,无论哈希表有多大。"我不确定这在内部的实现方面意味着什么。这是否意味着它会搜索每个键,直到找到匹配或者是内部使用的某种类型的二进制(或其他)搜索算法?
例如,如果我有一张包含2,000个按键的地图,那么它的平均值是""需要看1000才能找到匹配,或者只看11(log2 n),就像二元搜索一样?
谢谢, 本
答案 0 :(得分:23)
地图实现为哈希表。有很多地方可以解释哈希; Here's你可以运行一个很好的可视化。
Go的一个不错的功能是
来自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很酷!