字典的底层实现原理与哈希冲突解决

1.字典的底层实现原理:

字典是由key-value配对组成的元素集合,是一个可变容器,可以存储任意类型的对象,字典的底层是维护一张哈希表,同时使用一张Indices表来辅助,计算key的哈希值再和mask做与操作【mask=字典最小长度(IndicesDictMinSize) - 1】

indices = [None, None, index, None, index, None, index]
enteies = [
    [hash0, key0, value0],
    [hash1, key1, value1],
    [hash2, key2, value2]
]
hash_value = hash('color')  
index = hash_value & ( len(enteies) - 1)  

这个index就是要插入的indices的下标位置 

得到index后,会找到indices的位置,但是此位置不是存的hash值,而是存的len(enteies),表示该值在enteies中的位置 

 2.哈希冲突

主要原因有两个

就是哈希函数算出来的地址被别的元素占用了

有限哈希空间:哈希函数的输出范围是有限的,因此不同的键可能会映射到相同的哈希值。

不均匀分布:如果哈希函数不是很均匀,某些哈希值可能会更频繁地出现,导致哈希冲突。

3.解决哈希冲突

开放定址法:我们在遇到哈希冲突时,去寻找一个新的空闲的哈希地址。例如,线性探测法和二次探测法。

链地址法:将所有哈希地址相同的记录都链接在同一链表中。

再哈希法:同时构造多个不同的哈希函数,等发生哈希冲突时就使用第二个、第三个等其他的哈希函数计算地址,直到不发生冲突为止。

建立公共溢出区:将哈希表分为基本表和溢出表,将发生冲突的都存放在溢出表中。

4.字典的key必须是不可变类型,可以是数字,字符串,元组

列表是可变类型不能作为字典的key

字典依赖于哈希表实现,哈希表要求key必须是可哈希的,可哈希意味着在对象的生命周期里哈希值是不变的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值