《算法导论》读书笔记:散列表(附-Go语言中的map)
参考书籍:《算法导论》散列表
1. 直接寻址表
全域 U 直接到槽 K
但当全域 U 很大时,不可取
2. 散列表
装载因子
表示哈希表中元素的填满程度。它的计算公式:装载因子=填入哈希表中的元素个数/哈希表的长度。装载因子越大,填入的元素越多,空间利用率就越高,但发生哈希冲突的几率就变大。反之,装载因子越小,填入的元素越少,冲突发生的几率减小,但空间浪费也会变得更多,而且还会提高扩容操作的次数。装载因子也是决定哈希表是否进行扩容的关键指标
3. 散列函数
优秀的散列函数应包含以下特性:
- 均匀性:一个好的哈希函数应该在其输出范围内尽可能均匀地映射,也就是说,应以大致相同的概率生成输出范围内的每个哈希值。
- 效率高:哈希效率要高,即使很长的输入参数也能快速计算出哈希值。
- 可确定性:哈希过程必须是确定性的,这意味着对于给定的输入值,它必须始终生成相同的哈希值。
- 雪崩效应:微小的输入值变化也会让输出值发生巨大的变化。
- 不可逆:从哈希函数的输出值不可反向推导出原始的数据。
3.1 除法散列法
用关键字 k 除以 m,选择其余数
h ( k ) = k m o d m h(k) = k\mod m h(k)=kmodm
在 m 的选择上,应尽量避免选择 2 的幂,如此则 h(k) 就是 k 的 p 个最低位数,可能会造成分布不均
m 的较好选择是一个不太接近 2 的整数幂的素数
3.2 乘法散列法
乘法散列法包含两个步骤:
- 用关键字k 乘常数 A(0<A<1),并提取 kA 小数部分
- 用 m 乘以该值,并向下取整
h ( k ) = ⌊ m ( k a − ⌊ k a ⌋ ) ⌋ h(k) = \lfloor m(ka - \lfloor ka\rfloor)\rfloor h(k)=⌊m(ka−⌊ka⌋)⌋
其中 m 的选择没有除法散列这么苛刻
3.3 全域散列法
随机选择一个作为散列函数,使之独立于要存储的关键字
4. 开放寻址法
线性探查
h ( k , i ) = ( h ′ ( k