散列表的英文叫“Hash Table”,平时也叫它“哈希表”或“Hash表”。散列表是用数组支持按照下标随机访问数据的特性。
将键(key)转化为数组下标的映射方法就叫作散列函数,而散列函数计算得到的值就叫作散列值。
散列函数
定义为hash(key),其中key表示元素的键值,hash(key)的值表示经过散列函数计算得到的散列值。
散列函数设计的基本要求:
1 散列函数计算得到的散列值是一个非负整数。
2 如果key1 = key2,那hash( key1 ) == hash( key2 )。
3 如果key1 ≠ key2,那hash( key1 ) ≠ hash( key2 )。
散列冲突
在真实情况下要想找到一个不同的key对应的散列值都不一样的散列函数,几乎是不可能的,无法完全避免散列冲突,常用的散列冲突的解决方法有两类,开放寻址法(open addressing)和链表法(chaining)。
1 开放寻址法
核心思想:如果出现了散列冲突,就重新探测一个空闲位置,将其插入。
探测方法:线性探测(Linear probing)、二次探测(Quadratic probing)、双重探测(Double hashing)
1)线性探测:往散列表中插入数据时,如果某个数据经过散列函数散列之后,存储位置已经被占用了,我们就从当前位置开始,依次往后查找