最近刷算法题时经常要在某个列表中查询某个值。在列表中查询值的时间复杂度高,因此采用字典来代替查询过程。字典的查询、删除、插入平均时间复杂度都是O(1)。
1、字典是通过哈希算法实现的,字典的key可以是str,int,tuple等不可变对象,不能是列表(可变,不可哈希);
2、python3.7之前字典是无序的;
3、字典的实现过程(python3.7之后):
3.1 哈希表和indices:
indices = [None, None, index, None, index, None, index]
entries = [
[hash0, key0, value0],
[hash1, key1, value1],
[hash2, key2, value2]
]
3.2、hash(key)后得到的值与len(entries)-1做‘与’操作得到index(哈希出来的值通常很大,所以做‘与’操作)
3.3、indices中找到index对应的值,此时indices中存储的是key在entries的位置(len(entries))
3.4、解决冲突:python的哈希一般保证indices辅助表间隔取值【None,index,None,index】,使得冲突时能很快找到下一个值。
4、为什么新字典是有序的?
新字典的entries不再是稀疏的,而是由indices维护具体的位置,所以插入的值是有序的。