为什么一般hashtable的桶数会取一个素数
为什么一般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的桶数会取一个素数相关推荐
- [原创] 为什么模除的时候一般建议选择素数来除?比如说hashtable的桶数会取一个素数...
设有一个哈希函数 H( c ) = c % N; 当N取一个合数时,最简单的例子是取2^n,比如说取2^3=8,这时候 H( 11100(二进制) ) = H( 28 ) = 4 H( 10100(二 ...
- 【C语言习题】统计君君提水的桶数(不使用ceil函数与floor函数)
题目内容:一只大象一天要喝20升水,而君君每次都会用一个深h厘米,底面半径为r厘米的圆桶(h和r都是整数,Pi=3.14159)为大象提水,请问君君要提多少桶水才能保证大象一天的喝水量. (提示:1L ...
- hive 修改分桶数 分桶表_hive 学习之路(五)、Hive的分区表与分桶表
Hive将表划分为分区(partition)表和分桶(bucket)表. 分区可以让数据的部分查询变得更快,也就是说,在加载数据的时候可以指定加载某一部分数据,并不是全量的数据. 分桶表通常是在原始数 ...
- hive 修改分桶数 分桶表_Hive中的分桶
对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分.Hive也是针对某一列进行桶的组织.Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记 ...
- 51Nod-1002 数塔取数问题【DP】
1002 数塔取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值. 每次只能走到下一层相 ...
- 算法.动态规划 导航/数塔取数字问题
目录 前言 从1+1开始 总结下概念 地图到图 回头看 代码 动态规划经典问题 前言 下面的概念和公式可能会吓到你,看不懂没关系,就是让你恶心的.反正我看着也挺恶心,专业就是让你看不懂,看懂了怎么能叫 ...
- 【Excel函数】隔行取数并取最大值
Excel数据处理 1 隔行取数 1.1 隔行取数后取最大值 1 隔行取数 问题:Excel中每隔10个数取一个值. 方法:OFFSET或INDEX函数. OFFSET(reference;rows; ...
- C语言各数据类型所占字节数和取值范围
C语言中各数据类型所占字节数和取值范围 注:每种数据类型的取值范围都是与编译器相关的,以下为数据Visual C++32位环境下的参数,如想清楚了解自己所用编译器对各数据类型所占字节,可以用sizeo ...
- 1.3. 一只大象口渴了,要喝20升水才能解渴,但现在只有一个深h厘米,底面半径为r厘米的小圆桶(h和r都是整数)。问大象至少要喝多少桶水才会解渴。编写程序输入半径和高度,输出需要的桶数(一定是整数)
1.3. 一只大象口渴了,要喝20升水才能解渴,但现在只有一个深h厘米,底面半径为r厘米的小圆桶(h和r都是整数).问大象至少要喝多少桶水才会解渴.编写程序输入半径和高度,输出需要的桶数(一定是 ...
最新文章
- 九、linux设备节点注册
- Javaweb学习笔记——(三)——————JavaScript基础DOM基础
- mysql vba日期空值_使用SQL(VBA/ADO)命令填充来自重复记录的相应非空值的NULL字段...
- face-recognition库(人脸识别库)安装,使用
- python数据可视化代码_Python实现简单的数据可视化
- 魅族17系列邀请函来了:防爆盾外观实锤 或4月15日亮相
- totalspider爬虫批量重启报错Connection Error
- Windows XP 系统中内置的AT命令
- 计算机页面里的坚果云删不了怎么回事,坚果云 常见问题
- 用于创建此对象的程序是 Equation。您的计算机尚未安装此程序或此程序无响应。 若要编辑此对象,请安装 Equation或确保 Equation中的任何对话框都已关闭
- ERP服务商核心竞争力
- java specification_java规范(Java specification).doc
- 磊科路由器dns服务器老要修复,路由器dns异常解决方法
- python 埋点_网站js埋点
- win10家庭组(win10家庭组共享打印机)
- 解析几何:第四章 空间中的直线与平面(1)空间直线的方向、平面方程、空间直线方程
- SCP 从Linux下载文件到Windows本地
- Scrapy ip代理池
- Python定时任务库schedule的使用
- huggingface调用一些细节记录
热门文章
- 从Graalvm性能测试结果看选择JVM和native-image的策略
- 从.NET Core 3.1项目生成本地可执行文件
- 高级Blazor:从Edge共享程序集和调试
- .Net开发人员通过WCF使用Node.js
- SQL 使用总结二 ( 不同库的日期总结)
- pandas 替换 某列大于_Pandas使用总结
- python程序异常实例_Python werkzeug.exceptions方法代码示例
- java代码解决的问题_java代码规范问题及解决方案
- element table表格里的多选按钮,根据条件判断是否可以被选中
- 怎样手动给无线网设置一个DNS服务器地址,无线网的dns怎样设置.docx