根据各种来源,例如 Wikipedia 和 Google 发现的各种 .edu 网站,哈希表解决冲突的最常见方法是线性或二次探测和链接。简要提到了随机探测,但没有给予太多关注。我已经实现了一个使用随机探测来解决冲突的哈希表。假设发生碰撞,解决方法如下:
- 对象的完整(32 位)散列用于播种线性同余随机数生成器。
- 生成器生成 32 位数字并取模来确定哈希表中接下来要探测的位置。
这有一个非常好的特性,无论模数空间中有多少哈希冲突,只要完整的 32 位哈希空间中的冲突很少,查找和插入时间预计为 O(1)。因为探测序列是伪随机的,所以与线性探测不同,模空间冲突不会导致聚类行为。因为整个系统是开放寻址的并且不在任何地方使用链表,所以与链接不同,您不需要在每次插入时执行内存分配。
此外,由于散列的大小通常是地址空间的大小(在 32 位机器上为 32 位),因此在地址空间中容纳足够多的项是不可能在完整的 32 位散列中导致大量散列冲突的良好的散列方案下的空间。
那么,为什么要随机探索这种不受欢迎的冲突解决策略呢?