Python dict和set的底层原理

0 前言

C++中的map和set都是使用红黑树来实现的,是一个排序的结构,插入,查找和删除都可以在logn的时间复杂度完成。另外C++中还提供了unordermap和unorderset数据结构,这两个数据结构是使用哈希表实现的,是没有排序,插入、查找和删除都可以在O(1)的时间复杂度内完成。
除了C++,Python也是我常用的一门编程语言,python提供了dict来存储键值对,相当于c++中的map,也提供了set数据结构,set中的元素是不可重复。Python的便利性,往往会让人忽略他的原理实现,我们这里来看一下pythondict和set的底层实现

1 原理

dict是用来存储键值对结构的数据的,set其实也是存储的键值对,只是默认键和值是相同的。Python中的dict和set都是通过散列表来实现的。下面来看与dict相关的几个比较重要的问题:

  1. dict中的数据是无序存放的
  2. 操作的时间复杂度,插入、查找和删除都可以在O(1)的时间复杂度
  3. 键的限制,只有可哈希的对象才能作为字典的键和set的值。可hash的对象即python中的不可变对象和自定义的对象。可变对象(列表、字典、集合)是不能作为字典的键和st的值的。
  4. 与list相比:list的查找和删除的时间复杂度是O(n),添加的时间复杂度是O(1)。但是dict使用hashtable内存的开销更大。为了保证较少的冲突,hashtable的装载因子,一般要小于0.75,在python中当装载因子达到2/3的时候就会自动进行扩容。

参考文章:

  1. Python字典底层实现原理
  2. [python]list, tuple, dictionary, set的底层细节
  3. Python dict和set的实现原理
  4. python 中 set 和 dict 的实现原理
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值