python字典
- 定义
- 底层实现
- 查找对比
- python字典与redis
定义
- 无序,可变的容器数据结构,key-value数据存储
- key可以为数值,字符串,元组,但是唯一,value则支持多种数据类型
- 读取速度快,时间复杂度
底层实现
python字典的底层实现是哈希表,即带有索引和存储空间的表
如d={},创建一个空字典,初始化一个长度为8 的C数组arr
1. 插入数据
d["name"]="jack"
首先对键- -“name”计算哈希值,然后对当前C数组arr的长度求余,
得到一个索引值,假如为5,则将当前的(哈希值,键,值)作为一个整体存入arr[5]
2.哈希碰撞
当插入的键,经过哈希计算,求余后若得到与之前一样的索引,比如5,
因此索引处已经存有数据,无法再次存入,那么就将当前的索引+ 一个偏移量,
重新计算索引位置,然后存入数据,这在python中为开放地址法
3. 扩容(可变)
当存入的数据超过总长度的2/3时,字典会成倍扩容,对旧数据根据新数组长度计
算索引,重新存入
4.更新值
d["name"]="tom"
首先计算键- "name"的哈希值,然后对当前数组总长度求余,得到索引,若索引
对应位置的数据的键==“name”,则更新它的值
5.删除
del d["name"]
计算当前键- "name" 的哈希值,求余,找到索引,删除数据,仍保持探测链,
标记此处有过数据
查找对比
列表:遍历所有数据,一个一个的比较,数据量大时,时间复杂度高
字典:对要查找的键,计算哈希值,求余运算得到索引,一步到位,查找效率高
python字典与redis
- 哈希碰撞
python字典–>开放地址法
redis–>单链法,在相应索引处,垂直引出一个链表节点,存入数据 - 扩容
python字典,则成倍的扩容,然后对所有的旧数据,重新计算哈希值,对新长度求余数,得到索引,存入数据
redis哈希,,则必定扩容,扩容为,且此值必须第一次超出,然后渐进式的rehash每个键值对,即每次访问数据的时候,从新计算哈希值,求余,存入索引位置