python的有序字典

字典即哈希表,由空间换取时间得到取数O(1)的速度。

对于哈希表有一个很好的比喻就是柜子,每一个对象通过计算获取一个hash值,hash值就像是柜子的编号(字典的key),用以迅速的查找柜子里所存储的东西(字典的value)。如果柜子里有多个东西(hash值不唯一),根据具体算法的实现方式有不同的处理方式,如链表(遍历柜子里的东西),内部再建一个哈希表,使用开放地址等。

在早期的python中,是通过对hash值取余找value的,而它的开放寻址以及动态改变数组长度(当数量超过当前数组长度的一定比例时,数组就会扩容)

每往字典里存入一个键值,就会构建一个1*3的数组,分别为哈希值,指针a,与指针b
比如dct[“a”]=“b”,内存即为
‘’’
[[…,…,…]
[…,…,…]
[14124124123123,指向"a"的指针,指向b的指针]]
‘’’
读取时根据余数取对应位置的数组
python自带开放寻址(余数相同时,Python为了不覆盖之前已有的值,就会使用开放寻址技术重新寻找一个新的位置存放这个新的键值对)以及动态扩容

那么python3.6之后的有序字典是怎么样的呢?

my_dict['name'] = 'kingname'

'''
# 内存示意图
indices = [None, 0, None, None, None, None, None, None]

entries = [[-5954193068542476671, 指向name的指针, 执行kingname的指针]]
'''

哈希值的取余为1,因此将indices[1]=0,0为索引,表示这是entries的第一个
由于始终在entries之后添加属于,从而达到了使字典有序的效果,且entries这种方式的占用空间也小于之前构建的二维数组,从而达到了功能的增强与性能的提升。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值