很多小伙伴分不清在哈希表查找时,m的值。实际上,在构造哈希时,m值就是小于等于表长的质数(一般取最大质数),在查找,第一次计算时,m值就是该质数,在发生冲突后的每一次计算m的值变为表长。
那为什么第二次冲突时变成表长呢?是因为在构造哈希表时,当遇见同义词时(用线性探测)会造成顺延现象,如下图
而在查找某一数值时,第一次计算时m值为构造时计算使用的质数,得到哈希地址,当遇见冲突之后,计算时使用m的值为表长,方便查找该关键值的哈希位置,个人认为这样有便于查询整个表中是否有该关键值,类似于循环队列时。如果不太清楚的话,可以看一下循环队列的知识。下图是查找的例题,可以看到遇见冲突前后m的值不同。
总的来说,在构造哈希表时,m的值为小于等于表长的质数(一般取最大),且遇见冲突后计算时m的值不变;在进行哈希查找时,第一次计算m的值使用构造哈希表时使用的质数,得到哈希地址,在遇见冲突后的每一次计算,m的值为表长。目的是为了方便哈希查找。如果有不准确的地方,还请指导。