Dictionary Golang map内部实现-如何在地图中搜索密钥?
我在《Go编程语言》(The Go Programming Language)一书中读到,“给定的键可以被检索……平均使用恒定数量的键比较,不管哈希表有多大。”不过,我不确定这对其内部实现意味着什么。这是否意味着它会搜索每个键,直到找到匹配项,还是内部使用了某种类型的二进制(或其他)搜索算法Dictionary Golang map内部实现-如何在地图中搜索密钥?,dictionary,go,Dictionary,Go,我在《Go编程语言》(The Go Programming Language)一书中读到,“给定的键可以被检索……平均使用恒定数量的键比较,不管哈希表有多大。”不过,我不确定这对其内部实现意味着什么。这是否意味着它会搜索每个键,直到找到匹配项,还是内部使用了某种类型的二进制(或其他)搜索算法 例如,如果我有一个包含2000个键的映射,它“平均”需要查看1000才能找到匹配项,还是像二进制搜索一样只查看11(log2 n)?本机映射类型使用一个实现。它在键上使用散列函数生成数据数组的索引。因此,一
例如,如果我有一个包含2000个键的映射,它“平均”需要查看1000才能找到匹配项,还是像二进制搜索一样只查看11(log2 n)?本机映射类型使用一个实现。它在键上使用散列函数生成数据数组的索引。因此,一般来说,大多数动作发生在O(1)时间内。这通常是正确的,因为某些键在散列时可能会产生相同的索引,称为冲突,然后必须进行特殊处理
你很酷 映射被实现为哈希表。有很多地方可以解释散列;一个很好的可视化,你可以运行 围棋的一个很好的特点是
- 源代码在github上可用,并且
- 它是相当好的书面和记录,所以它不太难理解
// 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.
从这段代码中,您可以学到很多类通常不涉及的一件事,就是当映射在内部调整大小时,如何不使迭代器无效。它使用一个哈希表,正如您问题中的引号所提到的。常量查找意味着O(1),查找时间不取决于映射中的元素数。