Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary Golang map内部实现-如何在地图中搜索密钥?_Dictionary_Go - Fatal编程技术网

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

Dictionary Golang map内部实现-如何在地图中搜索密钥?,dictionary,go,Dictionary,Go,我在《Go编程语言》(The Go Programming Language)一书中读到,“给定的键可以被检索……平均使用恒定数量的键比较,不管哈希表有多大。”不过,我不确定这对其内部实现意味着什么。这是否意味着它会搜索每个键,直到找到匹配项,还是内部使用了某种类型的二进制(或其他)搜索算法 例如,如果我有一个包含2000个键的映射,它“平均”需要查看1000才能找到匹配项,还是像二进制搜索一样只查看11(log2 n)?本机映射类型使用一个实现。它在键上使用散列函数生成数据数组的索引。因此,一

我在《Go编程语言》(The Go Programming Language)一书中读到,“给定的键可以被检索……平均使用恒定数量的键比较,不管哈希表有多大。”不过,我不确定这对其内部实现意味着什么。这是否意味着它会搜索每个键,直到找到匹配项,还是内部使用了某种类型的二进制(或其他)搜索算法


例如,如果我有一个包含2000个键的映射,它“平均”需要查看1000才能找到匹配项,还是像二进制搜索一样只查看11(log2 n)?

本机映射类型使用一个实现。它在键上使用散列函数生成数据数组的索引。因此,一般来说,大多数动作发生在O(1)时间内。这通常是正确的,因为某些键在散列时可能会产生相同的索引,称为冲突,然后必须进行特殊处理


你很酷

映射被实现为哈希表。有很多地方可以解释散列;一个很好的可视化,你可以运行

围棋的一个很好的特点是

  • 源代码在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.


从这段代码中,您可以学到很多类通常不涉及的一件事,就是当映射在内部调整大小时,如何不使迭代器无效。

它使用一个哈希表,正如您问题中的引号所提到的。常量查找意味着O(1),查找时间不取决于映射中的元素数。