1. Python dict 底层实现:
Python3.6 之前,直接维护一张三列的数组,第一列代表字典key的哈希值,后面的key和value,通过哈希计算得到索引。
Python3.6 及以后维护两张表,一张索引表,在相应的位置(哈希计算得到的索引)上记录数组实际存储的位置(第二张表);数组实际存储的表格按顺序依次放入每次添加的字典数据。
https://zhuanlan.zhihu.com/p/73426505
2. 如何解决哈希冲突(散列冲突)?
开放寻址法:
线性探测,如果某个存储位置被占用后,依次往后查找直到有空闲位置为止(删除数据的时候,标记为 deleted,直到有下个元素插入)。 以及 二次探测 或者 双重散列。
散列表的装载因子 = 填入表中的元素个数/散列表的长度
优点: 数据都存储在数组中,可以有效地利用 CPU 缓存加快查询速度,序列化简单。
缺点:删除麻烦,冲突的代价更高,装载因子的上线不能太大,更浪费内存空间。
数据量小,装载因子小的时候,适合。
拉链法:
在每个桶或者槽会对应一个链表,依次往后放置元素。链表可以个使用 跳表、红黑树等。
优点:
对内存的利用率高,链表结点可以在需要的时候再创建;对装载因子的容忍度更高,可以大于 1.
适合大对象、大数据,更加灵活,支持更多的优化策略。