可先科普下质数的概念:质数,也就是素数,就是指一个大于1的自然数,约数(因数)只有1和它自己,否则叫合数。

除留取余,就是哈希函数将关键字被某个不大于哈希表长m的数p除后所得余数为哈希地址。这是最常用、也最简单的构造哈希函数的方法。当然,也可以对关键字直接取模,也可以折叠、平方取中等运算后取模。那么问题来了,这个p取多大呢?p的取值不好,会不会造成哈希函数的不均匀?先看一个简单的例子:

有一个数组: 1, 3,5,7,9,11,13, 15,17,19,21, 23,25   我们选取p为4(=2*2,含有约数2),即有四个桶,经过哈希函数后,

很明显求余结果都为1或者3,:都落在哈希地址为1的桶里,很明显这是不合理的。

为什么会出现这种情况呢,那么p应该怎么选取呢?

我们发现,上面数组求余后的哈希地址都为1,3,1,3,哈希地址的值不是1,就是3,所有哈希地址的差值不是2就是0,即3-3=0,1-1=0,3-1=2,恰好p=4的约数也是2,这个是不是巧合呢?

我们换一个数组来试一试:

数组b:     28,35,63,77,105,我们取p=21(3*7)

哈希地址: 7 ,14,  0, 14, 0

我们的数组差值都是7的倍数,哈希地址也是7的倍数,即哈希地址的差值也是0,7或者7的倍数,巧合的是我们的p也包含因数7。是不是只要p包含一个因数,这个因数对数组差值为这个因数的倍数整除的结果差值也是这个因数的倍数呢?

下面我们假设,p=tq,t为常数,q为某个质数,关键词的差值是q的倍数,那么h(x)-h(y)=q*n,

哈希地址 (h(x)-h(y))%p= q*n%(t*q)=(q*n-t*q*r)=q*(n-tr);  t位整除的值。

因此,均散列在差值为q的地址上。

这样,如果散列值的因数越多,可能导致的散列分布越不均匀,所以p的选择需要选择约数少的数值,什么数值的约数最少呢?当然是只有1和它自己的质数了。所以往往将桶个数设置为质数或不包含小于20的质因数的合数。

哈希表除留取余法的桶个数为什么是质数相关推荐

  1. 哈希--直接定值法和除留取余法

    1. 哈希是一种算法,哈希表是用哈希算法构造出来的一种数据结构 2. 哈希算方法的几种方法 直接定值法 这里有一个例题,就是我们想判断某一字符串中,某一个字符出现的个数,我们可以使用哈希的思想,就是可 ...

  2. 哈希表的实现(取余法)

    哈希表,又叫散列表,它可以提供快速的插入查找操作,对于大规模数据的查找时间空间效率会很高.哈希表构造方式有多种,其中取余法在比赛中最常用. 如果读入很多值非常大的数,让你判断一些数是否出现过.如果用桶 ...

  3. 【数据结构】人名查询哈希表设计(链地址法)

    文章目录 核心代码 链表节点定义 链地址法处理冲突 查询函数 完整代码下载 核心代码 哈希表使用「链地址法」解决地址冲突的方式,其数据结构就采用 数组+链表 ,数组的每一个元素都是一个链表节点,当地址 ...

  4. (C++)1022 D进制的A+B 除基取余法将10进制数换成给定进制数

    #include<cstdio> //除基取余法 const int M = 30;int main(){long long a,b,c;int D,ans[M+2];scanf(&quo ...

  5. 进制转换之十进制转换为D进制——整数部分除基取余法

    将十进制x转换为D进制的y: [方法]:整数采用"除基取余法",小数采用"乘基取整法" [推导]:以三位D进制为例,假设y的各位是a1a2a3 y = a 1 ...

  6. (C++)除基取余法:将十进制数转化为Q进制数

    所谓基,就是指将要转换成的进制Q. 除基取余的意思就是:每次将待转换数除以Q,然后将得到的余数作为低位存储,而商则继续除以Q并重复上面的操作,直至商0时,将所有位从高到低输出就可以得到Q进制数. 代码 ...

  7. 十进制转二进制(除2取余法)

    转载链接: https://baike.baidu.com/item/%E5%8D%81%E8%BF%9B%E5%88%B6%E8%BD%AC%E4%BA%8C%E8%BF%9B%E5%88%B6

  8. 哈希表(闭散列、拉链法--哈希桶)

    哈希表,也称散列表,是一种通过key值来直接访问在内存中的存储的数据结构.它通过一个关键值的函数(被称为散列函数)将所需的数据映射到表中的位置来访问数据. 关于哈希表,主要为以下几个方面: 一.哈希表 ...

  9. SWUST OJ 1012: 哈希表(链地址法处理冲突)

    1012: 哈希表(链地址法处理冲突) 题目描述 采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用链地址法.建立链表的时候采用尾插法. 输入 第一行为哈西表的长度m: 第二 ...

最新文章

  1. 资深程序员感叹:表妹成绩好却无奈辍学开理发店,月入6万,上大学没用!网友:那是你没用!...
  2. 前端开发模式--MV*
  3. 【iOS 开发】Objective - C 语法 之 类型转换
  4. 关于Hibernate中的Configuration
  5. Code Review的重要性
  6. 让我们回顾一下如何通过JDBC插入Clob或Blob
  7. JS组件系列——两种bootstrap multiselect组件大比拼
  8. 2022年中国商业十大热点展望:共同富裕、碳达峰碳中和、创新、数字化、新国货.........
  9. 服务器上使用 git 更新 wordpress 内核方案
  10. 采用RedisLive监控Redis服务
  11. 帆软函数TOIMAGE应用
  12. C++ 类型转换操作与操作符重载 operator type() 与 type operator()
  13. 台达DVP-PLC编程资料
  14. 分数加减乘除混合运算带答案_分数加减乘除混合运算专项训练
  15. 杭电2079-选课时间(题目已修改,注意读题)
  16. 市场份额持续下滑,博世面向中国市场“低头”了?
  17. 【UE4 C++】角色拾取、替换武器(下)
  18. Connectionist Text Proposal Network
  19. POI导出word表格 office打开没问题 wps打开列有问题
  20. css安卓手机位置偏差,完美解决移动端使用rem单位时CSSSprites错位问题_html/css_WEB-ITnose...

热门文章

  1. 08简单推导:手机尾号评分
  2. iOS 16.2 的7个惊人变化
  3. 茶学领域如何用的上计算机,优秀茶学论文参考文献 茶学专著类参考文献哪里找...
  4. 【深度学习图像识别课程】毕业项目:狗狗种类识别(3)代码实现
  5. Windows10下安装Git
  6. IT工作人员颈椎自我疗法-推荐
  7. VS2015 C++ 海鼎MPOS更新程序
  8. XSS闯关——第五关:level5
  9. 死锁问题的出现和解决
  10. 设备管理器上不显示集成显卡(核显)问题解决