求模运算为什么推荐用素数

结论

  • 如果哈希数据是均匀随机分布的,那么用质数和合数是没区别的。
  • 但实际上哈希数据往往不是均匀分布的,比如存在很多等差数列(例如1,4,8,9,12,16,17这组数中就包含等差数列4,8,12,16)。
  • 而这种情况使用合数会增加冲突概率,下面我会详细阐述原因。

先验知识

  • 合数:指大于 1 的自然数,除了 1 和它本身以外,还有其他的正因数。
  • 素数/质数:指大于 1 的自然数,除了 1 和它本身以外,没有其他的正因数。
  • 哈希函数: H( c ) = c % N。

实验

  • 这部分我们举例实际开发中可能存在的几组数据,然后将其分别映射到一个大小为素数7,一个大小为合数8的哈希表中,哈希函数采用上面提到的。
  • 数据选择从1开始,一共十个元素的的等差数列,通过映射到不同大小的哈希表的冲突数量,体现效果。

数据1

(1,2,3,4,5,6,7,8,9,10)这组等差数据的差为1,从1开始。

哈希表大小为7(冲突数为3)

余数0123456
123456
78910

哈希表大小为8(冲突数为2)

余数01234567
1234567
8910

数据2

(1,3,5,7,9,11,13,15,17,19)这组等差数据的差为2,从1开始。

哈希表大小为7(冲突数为3)

余数0123456
135
791113
151719

哈希表大小为8(冲突数为4)

余数01234567
1357
9111315
1719

结论分析

由上面的实验可以看到,哈希表的大小选择为偶数的时候,一旦数据中存在有规律的数据,其冲突的可能性将大大增加,数据分布不均匀。而素数大小的哈希表其冲突的情况比较均匀,即使数据有规律。因此很多用到哈希表的数据结构中为了保证程序的鲁棒性会选择用素数作为哈希表的大小。

原因分析

假设哈希表的大小为M,是一个偶数。当用M取模时,M的任意一个因子k, 都存在等差数列,其模空间会缩小为M/k, 从而增加冲突概率。 例如用8取模时,其因子4存在等差数列4, 8, 12,16…,这个数列的余数空间是(4,0,4,0,…) 。因此,取质数是最安全的选择,因为它的因子最少。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值