Go 关于Map的底层实现

  • 摘要:此文章为个人笔记,如若有错欢迎纠正,如需看参考文献请直接跳最下方
  • 什么是map:由一组<key,value>对组成的抽象数据结构,并且同一个key只会出现一次
  • map的模型源码地址: src/runtime/map.go
  • map的实现方式:Go采用哈希查找表方式实现map,并且使用链表方式解决哈希冲突
  • map的主要数据结构有
  1. 哈希查找表:

    在go语言中,map是由多个桶(buckets)组成的,每个桶(buckets)里又由多个hmap组成,当将数据存入map时,底层会使用哈希函数得到数据的key的哈希值。此时再通过这哈希值的低5位来决定将数据放入哪一个桶内(buckets),当这个桶内(buckets)的元素已经超过8个时,hmap会扩展该桶(buckets)。因为桶内(buckets)有8个位置,所以又会将刚的key的哈希值的高8位,来决定将这个数据放在桶内哪个位置

    桶(buckets)(由多个hmap组成的,go语言中可以看到bmap,bmap结构体内就存放着我们的数据)

    选择桶:有可能把这个key放在放在同一个桶(buckets)内(通过计算key的哈希值的低5位的值来决定放在哪一个桶(hmap)内),是因为经过哈希计算后的哈希结果是"一类"的。

    位置:又会根据key计算出来的哈希值的高8位来决定这个key落在桶(bmap)内的8个位置中的哪个位置,之后bmap就会扩充数据结构来存放key和value和其他字段

    如果一个桶内key存放过多时,此时当前桶(buckets)内已经装不下更多的数据,就会对当前的桶(buckets)进行等量扩容或者2倍扩容,那样在原来一个桶得中key会被一分为2被重新分配到2个桶中,扩容过程是渐进的,主要是防止一次扩容需要搬迁的key数量过多,引发性能问题,每次搬迁最多2个bucket
     

  2. 搜索树(暂未了解,了解后更新)

    一般采用自平衡搜索树,包含(AVL树,红黑树)

    自平衡搜索输最差的搜索效率是O(logN),哈希查找最差是O(N),哈希查找的平均查找效率是O(1)

  • 查找,赋值,删除:

这些操作的核心内容都是如何定位到key所在的位置,再之后就如上诉那般操作对其进行数据操作

 

 

注:

此篇文章目的为记录个人日常的学习笔记,若笔记哪里有错误或者侵权或者哪里各个不好的地方,欢迎各位指出错误和答案,或者好的意见或者建议,感谢。

参考文献1https://www.jianshu.com/p/aa0d4808cbb8

参考文献2:https://mp.weixin.qq.com/s/nsT4zf8zLrhdXOZqhm-qGw

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值