计算使用链接的散列映射的散列函数的扩展

时间:2010-10-16 19:10:32

标签: c++ math performance

我在C ++中编写一个泛型哈希映射,它使用链接来处理冲突。

假如我有一个包含11个桶的哈希映射,并且我插入了8个项目。哈希函数将按如下方式分发它:

bucket[0] = empty
bucket[1] = 2 elements
bucket[2] = empty
bucket[3] = 1 element
bucket[4] = 1 element
bucket[5] = 3 elements
bucket[6] = empty
bucket[7] = 1 element
bucket[8] = empty
bucket[9] = empty
bucket[10] = empty

计算桶上的分布是5/8 = 0.625。 但是如何计算考虑到水桶深度的传播?

我想知道这个,因为: 假设我添加了20个元素,每个桶有1个元素,最后一个桶有11个元素。

如果我以简单的方式计算它,那么差价将为1,但这显然是不正确的! (该表调整大小以避免这种情况,但我希望能够显示传播)我想使用此信息来调整哈希函数。

提前致谢!

3 个答案:

答案 0 :(得分:3)

如果您只是使用它来调整哈希函数本身,则可以计算真正的measure of statistical dispersion,例如基尼系数。另一方面,如果你试图将其作为哈希映射本身的一个特性,我会建议不要这样做 - 计算一个复杂的基准测试作为“调整大小必要”逻辑的一部分有其自身的性能成本;天真的东西可能更好。

答案 1 :(得分:1)

当我致力于改进哈希函数时,我使用长度的正方形的总和除以插入的项目数(并尝试最小化结果)。在您的第一个示例中,您插入了8个项目,长度的平方和为16,因此您的“品质因数”为2。

在第二个中,你插入了20个项目,方块的总和是130,所以你的品质因数是6.5。我会说第一个很可能一般来说是一个更好的哈希函数(虽然我通常更喜欢比较来自相同输入的结果)。

答案 2 :(得分:1)

你可能关心答案,因为你想知道你用链接做了多少工作。因此,您可能应该检测您的哈希映射以输出它正在做多少工作(在密钥方法中增加计数器的一些#ifdef可能会起作用)。然后,您可以使用工作量(#comparison,#nodes follow等)作为哈希函数的度量标准,作为奖励,您可以获得性能调整的漂亮工具。一旦解决了问题,就可以删除仪器。