为什么一般hashtable的桶数会取一个素数

设有一个哈希函数
H( c ) = c % N;
当N取一个合数时,最简单的例子是取2^n,比如说取2^3=8,这时候
H( 11100(二进制) ) = H( 28 ) = 4
H( 10100(二进制) ) = H( 20 )= 4

这时候c的二进制第4位(从右向左数)就”失效”了,也就是说,无论第c的4位取什么值,都会导致H( c )的值一样.这时候c的第四位就根本不参与H( c )的运算,这样H( c )就无法完整地反映c的特性,增大了导致冲突的几率.

取其他合数时,都会不同程度的导致c的某些位”失效”,从而在一些常见应用中导致冲突.
但是取质数,基本可以保证c的每一位都参与H( c )的运算,从而在常见应用中减小冲突几率..

(个人意见:有时候不取质数效率也不会太差..但是无疑取质数之比较保险的..)

以上就是我的理解

补充一点,这里是说在常见应用中,往往有些数据会比较相近,这时候用质数比较好,比如要存放的数据是压缩的状态,比如存储一个描述当前搜索状态的表,的这时候哈希不用质数冲突机率就比较大。

如果是随机分布的整数,那么哈希模数只要取到足够大,在概率上来说都是一样的,但是这显然脱离实际应用。

你说的情况 是比较特殊的,因为选取了比较小的一个质数,当选去大质数N时,就可以仅在N进制的某一位失效,结合计算机系统的特性,N进制位表示法往往是不关键的,而常用的2^N进制比较关键,所以可以避免冲突。

其实,偶用一些大数做过测试,用来存放一个压缩为二进制的邻接矩阵,当模数足够大时,即便是合数也能有很接近质数的效果,但在某些(几十个)合数上会造成效率严重下降,所以质数是比较保险的。

你不妨自己做实验,不要去选随机整数,而要考虑一些常见应用,用质数和合数进行测试,主要考察平均装载因子,你得到的结论可能和我一样:合数绝大多数时候效果也不错,但在一部分合数上效果差得出奇,而质数几乎全部都有很好的效果。
 
我个人认为更普遍意义的理解,如果不取素数的话是会有一定危险的,危险出现在当假设所选非素数m=x*y,如果需要hash的key正好跟这个约数x存在关系就惨了,最坏情况假设都为x的倍数,那么可以想象hash的结果为:1~y,而不是1~m。但是如果选桶的大小为素数是不会有这个问题。

转载于:https://www.cnblogs.com/jxldjsn/p/10834430.html

为什么一般hashtable的桶数会取一个素数相关推荐

  1. [原创] 为什么模除的时候一般建议选择素数来除?比如说hashtable的桶数会取一个素数...

    设有一个哈希函数 H( c ) = c % N; 当N取一个合数时,最简单的例子是取2^n,比如说取2^3=8,这时候 H( 11100(二进制) ) = H( 28 ) = 4 H( 10100(二 ...

  2. 【C语言习题】统计君君提水的桶数(不使用ceil函数与floor函数)

    题目内容:一只大象一天要喝20升水,而君君每次都会用一个深h厘米,底面半径为r厘米的圆桶(h和r都是整数,Pi=3.14159)为大象提水,请问君君要提多少桶水才能保证大象一天的喝水量. (提示:1L ...

  3. hive 修改分桶数 分桶表_hive 学习之路(五)、Hive的分区表与分桶表

    Hive将表划分为分区(partition)表和分桶(bucket)表. 分区可以让数据的部分查询变得更快,也就是说,在加载数据的时候可以指定加载某一部分数据,并不是全量的数据. 分桶表通常是在原始数 ...

  4. hive 修改分桶数 分桶表_Hive中的分桶

    对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分.Hive也是针对某一列进行桶的组织.Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记 ...

  5. 51Nod-1002 数塔取数问题【DP】

    1002 数塔取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值. 每次只能走到下一层相 ...

  6. 算法.动态规划 导航/数塔取数字问题

    目录 前言 从1+1开始 总结下概念 地图到图 回头看 代码 动态规划经典问题 前言 下面的概念和公式可能会吓到你,看不懂没关系,就是让你恶心的.反正我看着也挺恶心,专业就是让你看不懂,看懂了怎么能叫 ...

  7. 【Excel函数】隔行取数并取最大值

    Excel数据处理 1 隔行取数 1.1 隔行取数后取最大值 1 隔行取数 问题:Excel中每隔10个数取一个值. 方法:OFFSET或INDEX函数. OFFSET(reference;rows; ...

  8. C语言各数据类型所占字节数和取值范围

    C语言中各数据类型所占字节数和取值范围 注:每种数据类型的取值范围都是与编译器相关的,以下为数据Visual C++32位环境下的参数,如想清楚了解自己所用编译器对各数据类型所占字节,可以用sizeo ...

  9. 1.3. 一只大象口渴了,要喝20升水才能解渴,但现在只有一个深h厘米,底面半径为r厘米的小圆桶(h和r都是整数)。问大象至少要喝多少桶水才会解渴。编写程序输入半径和高度,输出需要的桶数(一定是整数)

    1.3.    一只大象口渴了,要喝20升水才能解渴,但现在只有一个深h厘米,底面半径为r厘米的小圆桶(h和r都是整数).问大象至少要喝多少桶水才会解渴.编写程序输入半径和高度,输出需要的桶数(一定是 ...

最新文章

  1. 九、linux设备节点注册
  2. Javaweb学习笔记——(三)——————JavaScript基础DOM基础
  3. mysql vba日期空值_使用SQL(VBA/ADO)命令填充来自重复记录的相应非空值的NULL字段...
  4. face-recognition库(人脸识别库)安装,使用
  5. python数据可视化代码_Python实现简单的数据可视化
  6. 魅族17系列邀请函来了:防爆盾外观实锤 或4月15日亮相
  7. totalspider爬虫批量重启报错Connection Error
  8. Windows XP 系统中内置的AT命令
  9. 计算机页面里的坚果云删不了怎么回事,坚果云 常见问题
  10. 用于创建此对象的程序是 Equation。您的计算机尚未安装此程序或此程序无响应。 若要编辑此对象,请安装 Equation或确保 Equation中的任何对话框都已关闭
  11. ERP服务商核心竞争力
  12. java specification_java规范(Java specification).doc
  13. 磊科路由器dns服务器老要修复,路由器dns异常解决方法
  14. python 埋点_网站js埋点
  15. win10家庭组(win10家庭组共享打印机)
  16. 解析几何:第四章 空间中的直线与平面(1)空间直线的方向、平面方程、空间直线方程
  17. SCP 从Linux下载文件到Windows本地
  18. Scrapy ip代理池
  19. Python定时任务库schedule的使用
  20. huggingface调用一些细节记录

热门文章

  1. 从Graalvm性能测试结果看选择JVM和native-image的策略
  2. 从.NET Core 3.1项目生成本地可执行文件
  3. 高级Blazor:从Edge共享程序集和调试
  4. .Net开发人员通过WCF使用Node.js
  5. SQL 使用总结二 ( 不同库的日期总结)
  6. pandas 替换 某列大于_Pandas使用总结
  7. python程序异常实例_Python werkzeug.exceptions方法代码示例
  8. java代码解决的问题_java代码规范问题及解决方案
  9. element table表格里的多选按钮,根据条件判断是否可以被选中
  10. 怎样手动给无线网设置一个DNS服务器地址,无线网的dns怎样设置.docx