哈希表出现主次聚类怎么办

问题描述

我知道主要和次要聚类是什么,但如何摆脱正确最小化它们的方法

解决方法

如何摆脱什么方法可以适当地最小化它们

您可以使用更高质量的散列函数以不太容易发生冲突的方式分发密钥。对于某些场景,可实现的最佳实用哈希函数具有一种伪随机但可重复的放置属性。在其他情况下,您可能了解一些有关可让您创建不太容易发生冲突的哈希函数的键的知识 - 例如,您可能知道键往往是递增的数字,可能有一些小间隙:在这种情况下,身份哈希函数 h(n) = n 将倾向于将值放置在相邻的桶中,与放置更随机的情况相比,冲突的机会更少。

在某些情况下,使用桶的素数有助于在桶中更好地分配元素,而不是使用 2 的幂次桶计数。基本上,当映射到桶时,桶计数是 2 的幂有效地屏蔽了哈希值的高阶位:高阶位中的任何随机性都将被丢弃,而不是帮助创建跨桶的更均匀分布。尽管如此,在大多数硬件/CPU 上,按位掩码还是比 mod 计算更快。

您还可以降低负载因子:元素与桶的比率。随着负载因子接近 1(即每个桶都已满),使用封闭哈希的哈希表的聚类效果呈指数级恶化。

您也可以停止使用封闭散列并使用单独的链接(维护在每个存储桶发生碰撞的元素的容器),这不会受到主集群的影响,但间接会导致更多的内存使用开销、间接和更少优化使用 CPU 缓存,从而降低运行时性能 - 特别是当元素很小(每个几个字节)时。

您还可以使用多个散列函数来识别可以存储元素的连续桶,而不是像线性或二次探测那样简单的提议,这会减少聚类。当您有替代存储桶时,您可以使用技术来移动元素以减少聚类的不良区域 - 例如搜索 robin hood 哈希。