散列思想
-
基本概念:基于数组的扩展,支持根据下标的随机访问
-
核心思想:将原始值 通过散列函数 转换成散列值(数组下标)
-
目标:将无规律的数据实现O(1)的特性
-
装载因子:表示当前散列表的空闲度
- 散列表的装载因子=填入表中的元素个数/散列表的长度
散列函数
-
将原始数据hash(key)得到散列值
-
散列函数的特点
-
非负整数
-
如果 key1 = key2,那 hash(key1) == hash(key2)\
-
如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2)\
- 无法避免散列冲突
-
-
散列函数:MD5,SHA,CRC
散列冲突
开放寻址法
-
线性探测法
- 插入:当发生hash冲突,重新探测一个空闲位置(重新探测,直到找到具体位置)
- 查询:找到元素,或者探测到空地址(元素不存在)
- 删除:不能直接删除,置为delete删除位,避免查询失败
-
二次探测法
- 探测的下标序列就是 hash(key)+0,hash(key)+12,hash(key)+22\
-
双重散列
- 如果计算得到的存储位置已经被占用,再用第二个散列函数,依次类推,直到找到空闲的存储位置\
链表法
- 更常用的hash冲突解决办法
- 利用链表解决hash冲突
- 查找、删除和插入时间复杂度O(1)
\
总结
-
散列表是一种特殊的数组
-
核心问题
- 散列函数的选择
- 散列冲突的解决