为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 地图内部实现 - 它如何在地图中搜索键?

Golang 地图内部实现 - 它如何在地图中搜索键?

Go
GCT1015 2022-01-17 20:16:05
我在“Go 编程语言”中读到“可以检索给定的键......平均使用恒定数量的键比较,无论哈希表有多大。” 不过,我不确定这在内部实现方面意味着什么。这是否意味着它会搜索每个键,直到找到匹配项,或者在内部使用某种类型的二进制(或其他)搜索算法?例如,如果我有一个包含 2,000 个键的映射,它是否“平均”需要查看 1,000 个才能找到匹配项,还是只需要查看 11(log2 n),就像使用二分搜索一样?
查看完整描述

2 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

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


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


您可以从这段代码中学到的一件事通常不会在很多类中涵盖,那就是如何在内部调整地图大小时不使迭代器无效。


查看完整回答
反对 回复 2022-01-17
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

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



查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 201 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号