go map

哈希表: 哈希表使用桶来保存k,v

使用hash函数 hash(k) 来确定v存在哪里

怎么确定位置呢? hash(k)=e e%m 或者 e &(m-1) 其中第二种方法要保证 m为2的正数次幂 4 =100 4-1=3=011 这样才能保证所有的桶都能被选中。

如果出现了hash碰撞怎么解决:

开放地址:如果碰撞了则将该k存在下一个不冲突的位置,寻找时如果发现 k并不是我们的k 则向下继续寻找,如果遍历完都没有就是不存在。

拉链法:在发生冲突的桶后边加一个新创建的桶的指针,引向新的桶。

扩容方法:

负载因子: 目前桶中保存kv数量/桶的数量

发生扩容时首先创建一个新的桶 并将map的引用地址指向新的桶 ,保存旧桶的地址 以及一个旧桶中的迁移数量,每次访问map都完成一部分的迁移任务直到旧桶中没有数据。

渐进式扩容可以避免一次性扩容带来的性能抖动。

        

noverflow 当前使用溢出桶的数量-> 等量扩容的一个衡量标准

extra  使用溢出桶的一些情况的结构体指针

如果哈希表要分配的桶的数量大于 2**4个 ,则会预分配 2**B-16 个预分配溢出桶

 

 

 为什么要进行等量扩容:因为如果  Map中删除了过多的变量 则  原来桶存在内存浪费,使用新的桶将桶中数据更加紧凑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值