字典是否是有序

在Python3.6之前,字典是无序的,但是Python3.7+,字典是有序的。
在3.6中,字典有序是一个implementation detail,在3.7才正式成为语言特性,因此3.6中无法确保100%有序。

字典的查询、添加、删除的时间复杂度

字典的查询、添加、删除的平均时间复杂度都是O(1),相比列表与元祖,性能更优。

字典的实现原理

Python3.6之前的无序字典

字典底层是维护一张哈希表,可以把哈希表看成一个列表,哈希表中的每一个元素又存储了哈希值(hash)、键(key)、值(value)3个元素。

enteies = [['--', '--', '--'],[hash, key, value],['--', '--', '--'],['--', '--', '--'],[hash, key, value],
]

带入具体的数值来介绍

# 给字典添加一个值,key为hello,value为word
# my_dict['hello'] = 'word'# hash表初始如下
enteies = [['--', '--', '--'],['--', '--', '--'],['--', '--', '--'],['--', '--', '--'],['--', '--', '--'],
]hash_value = hash('hello')  # 假设值为 12343543 index = hash_value & ( len(enteies) - 1)  # 假设index值计算后等于3# 下面会将值存在enteies中
enteies = [['--', '--', '--'],['--', '--', '--'],['--', '--', '--'],[12343543, 'hello', 'word'],  # index=3['--', '--', '--'],
]# 继续向字典中添加值
# my_dict['color'] = 'green'hash_value = hash('color')  # 假设值为 同样为12343543
index = hash_value & ( len(enteies) - 1)  # 假设index值计算后同样等于3# 下面会将值存在enteies中
enteies = [['--', '--', '--'],['--', '--', '--'],['--', '--', '--'],[12343543, 'hello', 'word'],  # 由于index=3的位置已经被占用,且key不一样,所以判定为hash冲突,继续向下寻找[12343543, 'color', 'green'],  # 找到空余位置,则保存
]

enteies表是稀疏的,随着我们插入的值不同,enteies表会越来越稀疏(enteies也是一个会动态扩展长度的,每一此扩展长度,都会重新计算所有key的hash值),所以新的字典实现就随之出现。

Python3.7+后的新的实现方式

Python3.7+带入数据演示

# 给字典添加一个值,key为hello,value为word
# my_dict['hello'] = 'word'# 假设是一个空列表,hash表初始如下
indices = [None, None, None, None, None, None]
enteies = []hash_value = hash('hello')  # 假设值为 12343543
index = hash_value & ( len(indices) - 1)  # 假设index值计算后等于3# 会找到indices的index为3的位置
indices = [None, None, None, 0, None, None]
# 此时enteies会插入第一个元素
enteies = [[12343543, 'hello', 'word']
]# 我们继续向字典中添加值
my_dict['haimeimei'] = 'lihua'hash_value = hash('haimeimei')  # 假设值为 34323545
index = hash_value & ( len(indices) - 1)  # 假设index值计算后等于 0# 会找到indices的index为0的位置
indices = [1, None, None, 0, None, None]
# 此时enteies会插入第一个元素
enteies = [[12343543, 'hello', 'word'],[34323545, 'haimeimei', 'lihua']
]

查询字典

# 下面是一个字典与字典的存储
more_dict = {'name': '张三', 'sex': '男', 'age': 10, 'birth': '2019-01-01'}# 数据实际存储
indices = [None, 2, None, 0, None, None, 1, None, 3]
enteies = [[34353243, 'name', '张三'],[34354545, 'sex', '男'],[23343199, 'age', 10],[00956542, 'birth', '2019-01-01'],
]print(more_dict['age'])  # 当我们执行这句时hash_value = hash('age')  # 假设值为 23343199
index = hash_value & ( len(indices) - 1)  # index = 1entey_index = indices[1]  # 数据在enteies的位置是2
value = enteies[entey_index]  # 所以找到值为 enteies[2]

时间复杂度

字典的平均时间复杂度是O(1),因为字典是通过哈希算法来实现的,哈希算法不可避免的问题就是hash冲突,Python字典发生哈希冲突时,会向下寻找空余位置,直到找到位置。如果在计算key的hash值时,如果一直找不到空余位置,则字典的时间复杂度就变成了O(n)了。

常见的哈希冲突解决方法:

1 开放寻址法(open addressing)

开放寻址法中,所有的元素都存放在散列表里,当产生哈希冲突时,通过一个探测函数计算出下一个候选位置,如果下一个获选位置还是有冲突,那么不断通过探测函数往下找,直到找个一个空槽来存放待插入元素。

2 再哈希法

这个方法是按顺序规定多个哈希函数,每次查询的时候按顺序调用哈希函数,调用到第一个为空的时候返回不存在,调用到此键的时候返回其值。

3 链地址法

将所有关键字哈希值相同的记录都存在同一线性链表中,这样不需要占用其他的哈希地址,相同的哈希值在一条链表上,按顺序遍历就可以找到。

4 公共溢出区

其基本思想是:所有关键字和基本表中关键字为相同哈希值的记录,不管他们由哈希函数得到的哈希地址是什么,一旦发生冲突,都填入溢出表。

Python字典底层实现原理相关推荐

  1. python的底层实现,Python封装底层实现原理详解(通俗易懂)

    事实上,Python 封装特性的实现纯属"投机取巧",之所以类对象无法直接调用以双下划线开头命名的类属性和类方法,是因为其底层实现时,Python 偷偷改变了它们的名称. 前面章节 ...

  2. python字典实现原理_Python字典底层实现原理详解

    在Python中,字典是通过散列表或说哈希表实现的.字典也被称为关联数组,还称为哈希数组等.也就是说,字典也是一个数组,但数组的索引是键经过哈希函数处理后得到的散列值.哈希函数的目的是使键均匀地分布在 ...

  3. python字典的实现原理_Python字典的实现原理

    以下是自己的学习记录,算是一个总结. 接下来会依次对下面问题做一个解答: 1. Python的dict和set为什么是无序的? 2. 为什么不是所有的python对象都可以用作dict的键和set中的 ...

  4. Python判断不可变对象(字符串,整数,浮点数,数组)相等的办法以及其底层实现原理

    Python判断不可变对象(字符串,整数,浮点数,数组)相等的办法以及其底层实现原理 Python中,判断不可变对象是否相等与Java十分不同. 结论 Python中判断两个字符串相等:既可以使用&q ...

  5. python解释器的工作原理_Python GIL全局解释器锁详解(深度剖析)

    通过前面的学习,我们了解了 Pyton 并发编程的特性以及什么是多线程编程.其实除此之外,Python 多线程还有一个很重要的知识点,就是本节要讲的 GIL. GIL,中文译为全局解释器锁.在讲解 G ...

  6. Python中字典对象实现原理

    python中字典对象实现原理 注:字典类型是Python中最常用的数据类型之一,它是一个键值对的集合,字典通过键来索引,关联到相对的值,理论上它的查询复杂度是 O(1) 字典是Python的一种可变 ...

  7. python字典长度可变吗_Python字典dict实现原理

    一. 什么是字典? 字典是一系列由键(key)和值(value)配对组成的元素的集合.字典是一个可变容器模型,可以存储任意类型对象.字典实现与哈希算法密不可分(不同的Python版本,算法会不同),不 ...

  8. python字典实现原理-哈希函数-解决哈希冲突方法

    python字典实现原理-哈希函数-解决哈希冲突方法 参考文章: (1)python字典实现原理-哈希函数-解决哈希冲突方法 (2)https://www.cnblogs.com/guyannanfe ...

  9. Python 字典实现原理

    Python里的实现用了一种被称为散列表(hash table,也被称为哈希表)的更高效的数据结构. 散列表的核心是散列函数(hashing function,也被称为哈希函数).散列函数会把键作为参 ...

最新文章

  1. educoder 使用线程锁(lock)实现线程同步_性能:Lock的锁之优化
  2. ZooKeeper在HBase集群中的作用
  3. caffe loss一直nan什么情况
  4. java销售额查询_用JSP+JavaBean开发模式实现一个销售额的查询
  5. html5做一个相册_HTML5最新版本介绍
  6. 阿里云新设浙江猫精人工智能科技有限公司
  7. java 方法引用_JAVA 8 方法引用 - Method References
  8. 计算机设备耗材管理系统,实验室耗材管理方法、系统、计算机设备和存储介质与流程...
  9. CMOS模拟集成电路设计 吴金 学习记录2
  10. 神奇的夏时令——本来设置好的日期在保存完成后少了一天?
  11. android app unlock sim pin,android Sim卡锁定 pin解锁流程学习
  12. Java面试题目分析
  13. Au:剪辑的基础操作
  14. SpringBoot整合j2cache缓存
  15. 33岁跨专业考计算机研究生,盲目跨专业考研考上以后也不轻松
  16. HTML——表格的基本样式
  17. 电脑外设(I/O)简介:显示器
  18. 电脑装双系统有什么坏处?可不只是速度变慢!
  19. typedef的用法。
  20. MySQL之表的创建

热门文章

  1. Tomcat介绍,jdk安装,Tomcat安装
  2. 多级队列调度算法可视化界面_模拟多级反馈队列调度算法原理(源程序c++)
  3. smzdm 扫地机器人_千元扫地机器人哪个好?真实测评!
  4. 多层 JSON 转换成 CSV
  5. 底盘线控悬架智能化趋势
  6. 如何理解ROC曲线和AUC值
  7. 使用pytorch训练你自己的图像分类模型(包括模型训练、推理预测、误差分析)
  8. 牛客C++面经——给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内
  9. 关于string.h头文件的函数——C语言
  10. Animation of CSS3