字典是通过哈希表实现的。字典也被称为哈希数组等。
字典 ---------------------哈希数组
键------(哈希函数)--数组索引
值-------------------------数组值
哈希函数的目的是使键均匀地分布在数组中,并且可以在内存中以O(1)的时间复杂度进行寻址,从而实现快速查找和修改。
哈希表中哈希函数的设计困难在于将数据均匀分布在哈希表中,从而尽量减少哈希碰撞和冲突。
(1)数据添加
key------》哈希函数--------》整型数字-----》数字对数组长度取余----》数组的索引
value----》在以该数字为下标的数组空间里。
(2)数据查询
key------》哈希函数--------》整型数字-----》数字对数组长度取余----》数组的索引----》value
本质是多对一的映射,哈希碰撞是不可避免的,但是一个好的哈希函数的设计需要尽量避免哈希碰撞。
不可变数据类型:int,string,tuple -->可哈希-->字典的key
可变数据类型:set,list,dict
常见的哈希碰撞解决方法:
(1)开放寻址法(open addressing)
当产生哈希冲突时,通过一个探测函数计算出下一个候选位置,如果下一个获选位置还是有冲突,那么不断通过探测函数往下找,直到找个一个空槽来存放待插入元素。
常见的开放地址思想的方法有线性探测再散列,二次探测再散列等
(2)再哈希法
按顺序规定多个哈希函数,每次查询的时候按顺序调用哈希函数,调用到第一个为空的时候返回不存在,调用到此键的时候返回其值。
(3)链地址法
将所有关键字哈希值相同的记录都存在同一线性链表中,这样不需要占用其他的哈希地址,相同的哈希值在一条链表上,按顺序遍历就可以找到。
(4)公共溢出区
一旦发生冲突,都填入溢出表。
(5)装填因子α