【发布时间】:2021-05-17 10:39:39
【问题描述】:
我知道主集群和辅助集群是什么,但是如何摆脱正确最小化它们的方法
【问题讨论】:
标签: hash cluster-analysis hashtable collision hash-collision
我知道主集群和辅助集群是什么,但是如何摆脱正确最小化它们的方法
【问题讨论】:
标签: hash cluster-analysis hashtable collision hash-collision
如何摆脱什么方法可以正确地最小化它们
您可以使用更高质量的散列函数以不太容易发生冲突的方式分配密钥。对于某些场景,可实现的最佳实用哈希函数具有一种伪随机但可重复的放置属性。在其他情况下,您可能对键有所了解,从而可以创建不易发生冲突的散列函数 - 例如,您可能知道键往往是递增的数字,可能有一些小的间隙:在这种情况下,一个恒等哈希函数 h(n) = n 将倾向于将值放置在相邻的桶中,与放置更随机的情况相比,碰撞的可能性更小。
在某些情况下,与使用二的幂次方计数相比,使用存储桶的素数有助于更好地在存储桶中分配元素。基本上,作为 2 次方的存储桶计数在映射到存储桶时有效地掩盖了哈希值的高位:丢弃高位中的任何随机性,而不是帮助在存储桶之间创建更均匀的分布。尽管如此,在大多数硬件/CPU 上,按位掩码比模计算要快。
您还可以降低负载因子:元素与桶的比率。随着负载因子接近 1(即每个桶都已满),使用封闭哈希的哈希表的聚类效果会呈指数级恶化。
您也可以停止使用封闭散列并改用单独的链接(维护在每个存储桶处碰撞的元素的容器),这不会受到主集群的影响,但间接会导致更多的内存使用开销、间接和更少优化使用 CPU 缓存,从而降低运行时性能 - 特别是当元素很小(每个元素只有几个字节)时。
您还可以使用多个哈希函数来识别可以存储元素的连续存储桶,而不是像线性或二次探测那样的简单报价,这会减少聚类。当您有替代存储桶时,您可以使用技术来移动元素以减少更糟糕的集群区域 - 例如搜索 robin hood hashing。
【讨论】: