python高级课程学习笔记 (1.3)—— dict 实现原理

摘抄自 Python字典dict实现原理

python3.6 之前

dict 底层由一个列表实现,

enteies = [
    ['--', '--', '--'],
    [hash1, key1, value1],
    ['--', '--', '--'],
    ['--', '--', '--'],
    [hash2, key2, value2],
]

计算key的hash值hash(key),再和mask做与操作【mask=字典最小长度(DictMinSize) - 1】,运算后会得到一个数字index,这个index就是要插入的enteies哈希表中的下标位置

若index下标位置已经被占用,则会判断enteies的key是否与要插入的key是否相等如果key相等就表示key已存在,则更新value值如果key不相等,就表示 hash冲突 ,则会继续向下寻找空位置,一直到找到剩余空位为止。

随着数据插入, 空白位置减少, 当小于三分之一时, 会增加存储空间.
字典的三个基本操作(添加元素,获取元素和删除元素)的平均事件复杂度为 O(1)

Python中所有不可变的内置类型都是可哈希的。

可变类型(如列表,字典和集合)就是不可哈希的,因此不能作为字典的键。

python3.7 之后

新字典还使用了一张Indices表来辅助。下来列出新的结构:

indices = [None, None, index, None, index, None, index]
enteies = [
    [hash0, key0, value0],
    [hash1, key1, value1],
    [hash2, key2, value2]
]

计算key的hash值【hash(key)】,再和mask做与操作【mask=字典最小长度(IndicesDictMinSize) - 1】,运算后会得到一个数字【index】,这个index就是要插入的indices的下标位置(注:具体算法与Python版本相关,并不一定一样)得到index后,会找到indices的位置,但是此位置不是存的hash值,而是存的len(enteies),表示该值在enteies中的位置如果出现hash冲突,则处理方式与老字典处理方式类似.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值