1.字典的底层实现原理:
字典是由key-value配对组成的元素集合,是一个可变容器,可以存储任意类型的对象,字典的底层是维护一张哈希表,同时使用一张Indices表来辅助,计算key的哈希值再和mask做与操作【mask=字典最小长度(IndicesDictMinSize) - 1】
indices = [None, None, index, None, index, None, index]
enteies = [
[hash0, key0, value0],
[hash1, key1, value1],
[hash2, key2, value2]
]
hash_value = hash('color')
index = hash_value & ( len(enteies) - 1)
这个index就是要插入的indices的下标位置
得到index后,会找到indices的位置,但是此位置不是存的hash值,而是存的len(enteies),表示该值在enteies中的位置
2.哈希冲突
主要原因有两个
就是哈希函数算出来的地址被别的元素占用了
有限哈希空间:哈希函数的输出范围是有限的,因此不同的键可能会映射到相同的哈希值。
不均匀分布:如果哈希函数不是很均匀,某些哈希值可能会更频繁地出现,导致哈希冲突。
3.解决哈希冲突
开放定址法:我们在遇到哈希冲突时,去寻找一个新的空闲的哈希地址。例如,线性探测法和二次探测法。
链地址法:将所有哈希地址相同的记录都链接在同一链表中。
再哈希法:同时构造多个不同的哈希函数,等发生哈希冲突时就使用第二个、第三个等其他的哈希函数计算地址,直到不发生冲突为止。
建立公共溢出区:将哈希表分为基本表和溢出表,将发生冲突的都存放在溢出表中。
4.字典的key必须是不可变类型,可以是数字,字符串,元组
列表是可变类型不能作为字典的key
字典依赖于哈希表实现,哈希表要求key必须是可哈希的,可哈希意味着在对象的生命周期里哈希值是不变的