Python内置数据结构和算法
Python中collections模块提供的一些内置数据结构拓展
注:有空看看源码实现原理
- nametuple()(创建命名元组子类的工厂函数)
- deque类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)
- Counter字典的子类,提供了可哈希对象的计数功能
- OrderedDict字典的子类,保存了他们被添加的顺序
- defaultdict字典的子类,提供了一个工厂函数,为字典查询提供一个默认值
更多参考:python内置模块
Python dict底层结构
dict底层使用了哈希表
- 为了支持快速查找使用哈希表作为底层
- 哈希表平均查找时间复杂度O(1)
- CPython解释器使用二次探查解决哈希冲突问题
- 解决哈希冲突
- 哈希扩容:HashMap的初始值是16(1,<<4),负载因子0.75(听说这个值是经过大量实践算出来的,这个值设定最合理),初始值16指的是数组的长度(1<<4是2的4次方,这样写计算机执行更快),当数组的容量达到12(16*0.75)时,这时开始扩容,扩容为32(1<<5即2的5次方),每次扩容按照2的倍数递增,扩容是为了减少hash碰撞,让链表的数据更少(最好链表上就一个数据,即为数组的下标数据)
Python中list/tuple区别
- 都是线性结构、支持下标访问
- list是可变对象,tuple是保存的引用不可变,比如tuple中包容可变对象,如list,函数对list修改了,内容是会改变的
- list没有办法作为字典的key,tuple可以(可变对象不可hash),因为list有可能因为添加新的元素而导致内存地址的更换