哈希表】为什么哈希表的长度应该是质数?

2022-04-02 16:41发布

6条回答
小光光321
2楼 · 2022-04-06 11:27

哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%)。而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上。所以这里最后采用了质数做模的除数。 因为用质数做了模的除数,自然存储空间的大小也用质数了,因为模完之后,数据是在[0-所选质数)之间。

不吃鱼的猫
3楼 · 2022-04-07 11:12

因为在hash函数中,你要用这些质数来做模运算

猫的想法不敢猜
4楼 · 2022-04-12 15:18

image.png

源于网络,仅供参考

靓猴一枚
5楼 · 2022-04-14 13:41

通常,哈希函数从键中计算一个整数值。 为确保此整数值在哈希表的长度之内,一个方便的技巧是计算整数和表长度的模。 结果范围从0到length-1。

function hash(key, length=15) {    let total = 0    for(let char of key) {        // map "a" to 1, "b" to 2, "c" to 3, etc.        let value = char.charCodeAt(0) - 96        total = (total + value) % length    }return total}// => 13

在上述情况下,默认长度设置为15,则3的倍数或5的倍数(而不是15的倍数)的整数将分别散列为3和5的索引。 例如,产生整数0、15、30等的键将被分配索引0,产生整数3、18、33等的键将被分配索引3,而产生整数5、20的键将被分配索引3。 ,35等将被分配索引5。碰撞中心

换句话说,每个与长度共享一个公因子的整数都将被散列到该因子倍数的索引中。

对于非随机数据,素数长度的哈希表将产生最广泛的整数分布到索引。 在上述情况下,长度的每个因数都出现了模式15。因此,选择长度最少的因数对我们有益。 输入素数。 众所周知,它们只能被1整除。 因此,选择将哈希表的长度设置为较大的质数将大大减少冲突的发生。

三岁奶猫
6楼 · 2022-04-21 10:43

用这些质数来做模运算,不能缺少

“哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%)。而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上。所以这里最后采用了质数做模的除数。 因为用质数做了模的除数,自然存储空间的大小也用质数了,因为模完之后,数据是在[0-所选质数)之间。”

相关问题推荐

  • 回答 3

    这个主要是看你数组的长度是多少, 比如之前写过的一个程序有个数组存的是各个客户端的ip地址:string clientIp[4]={XXX, xxx, xxx, xxx};这个时候如果想把hash值对应到上面四个地址的话,就应该对4取余,这个时候p就应该为4...

  • 回答 5

     哈希表的大小 · 关键字的分布情况 · 记录的查找频率 1.直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。...

  • 回答 2

    是啊,哈希函数的设计至关重要,好的哈希函数会尽可能地保证计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间

  • 回答 3

     解码查表优化算法,seo优化

  • 回答 5

    就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。(或者:把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度...

  • 回答 2

    一般情况确实不应该用地址来作为删除的参数,但如果你已经事先搜索到了一个元素但之后不用了不就可以

  • 回答 2

    哈希表是散列的一种。散列是一种用以常数平均时间执行插入、删除和查找的技术。 为了得到更快的执行速度,当查询某个元素多于遍历时可使用。但是数组无法确定准确的位置

  • 回答 3

    跟加载因子设置的大小有关

  • 回答 2

    虽然哈希表和数组在 lua 里都表示为一个 table,但是其底层实现还是有所区别的,理想情况下哈希表的内存占用是数组的两倍,主要区别在于哈希节点比数组节点多了一个 TKey 的内存占用。在数据量大的情况下考虑使用数组可以有效减少内存...

  • 回答 5

    我们知道,数据结构的物理存储结构只有两种:顺序存储结构和链式存储结构(像栈,队列,树,图等是从逻辑结构去抽象的,映射到内存中,也这两种物理组织形式),在数组中根据下标查找某个元素,一次定位就可以达到,哈希表利用了这种特性,哈希表的主干就是数...

  • 回答 4

    哈希表可以理解为一维数组。因为只是单一的坐标。当然如果考虑到哈希碰撞,理解为二维数组也无不可。至于下标1跟10001,这个问题很好。你观察到了,这样的数组会有大量的空洞。这是一种常见的现象。一维的这种数组叫做稀疏数组,二维的这种数组叫做稀疏矩阵。...

  • 回答 3

    在数据结构哈希表中不成功平均查找长度和成功平均查找长度之间并没有什么直接的关系。他们都是对于特定的哈希表和特定的查找序列,才有意义的。

  • 回答 3

    查找不成功的次数表如下表所示 Key 7 8 30 11 18 9 14 Count 3 2 1 2 1 5  所以ASLunsuccess= (3+2+1+2+1+5+4)/ 7 = 18/7。 下面看下2010年2010年全国硕士研究生入学统一考试计算机科学与技术学科联考计算机学科专业基础综合试题中一个考...

  • 回答 9

    A--->function()---> B源数据A经过function()的运算得到B.这里的function()就是哈希函数,它是某一种hash算法的实现。得到的数据B就是hashCode,它是源数据A的哈希体现。如果我们将A->B这样的的关系保存下来,存储这个对应关系的我们称为哈希表。补充:还是正...

  • 回答 3

    哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希表的做法其实很简单,就是...

没有解决我的问题,去提问