《算法导论》散列表与Go语言中的map

《算法导论》读书笔记:散列表(附-Go语言中的map)

参考书籍:《算法导论》散列表

参考博客:https://mp.weixin.qq.com/s/OJSxIXH87mjCkQn76eNQsQ

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 乘法散列法

乘法散列法包含两个步骤:

  1. 用关键字k 乘常数 A(0<A<1),并提取 kA 小数部分
  2. 用 m 乘以该值,并向下取整

h ( k ) = ⌊ m ( k a − ⌊ k a ⌋ ) ⌋ h(k) = \lfloor m(ka - \lfloor ka\rfloor)\rfloor h(k)=m(kaka)

其中 m 的选择没有除法散列这么苛刻

3.3 全域散列法

随机选择一个作为散列函数,使之独立于要存储的关键字

4. 开放寻址法

线性探查

h ( k , i ) = ( h ′ ( k

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值