关于二次探测哈希表:字符串Banana%13为何对应位置8和9?
为什么"Banana"会被哈希到位置8和9?
哈希位置不是随便选的,得先计算"Banana"的整体哈希值再对13取余,不是单个字符单独取模。
常见的字符串哈希逻辑是把所有字符的ASCII值通过累加或加权方式算出一个大整数,再对哈希表大小(13)取余得到初始位置。举两个例子:- 简单累加的话,"Banana"的ASCII总和是66+97+110+97+110+97=577,577%13=5,初始位置就是5。
- 要是用加权哈希(比如基数31这类常用规则),算出来的初始位置可能是其他数值,但核心都是基于整个字符串的哈希值取模。
出现8和9这两个位置,肯定是因为初始计算的位置已经被占用,哈希表启用了冲突解决策略:
比如最常用的线性探测——如果初始位置被占,就依次往后找下一个空闲位置。假设初始位置是6,被占了就试7,还被占就试8;要是8也被占,就接着试9。这就导致最终落到8或9的位置。你觉得“可放入任意位置”是误解:
哈希表插入有严格规则:先通过哈希函数算出初始位置,有冲突就按预设的冲突解决逻辑找下一个空位,绝对不能随便选任意位置放入。只有哈希表全空时,初始位置才是最终位置;有冲突时就按规则往后递推。
内容的提问来源于stack exchange,提问作者Jordan Uhrmann
相关产品推荐
相关产品推荐

