Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算使用链接的哈希映射的哈希函数的扩展 我在C++中编写了一个通用的哈希映射,它使用链接来处理冲突。p>_C++_Math_Performance - Fatal编程技术网

计算使用链接的哈希映射的哈希函数的扩展 我在C++中编写了一个通用的哈希映射,它使用链接来处理冲突。p>

计算使用链接的哈希映射的哈希函数的扩展 我在C++中编写了一个通用的哈希映射,它使用链接来处理冲突。p>,c++,math,performance,C++,Math,Performance,假设我有一个包含11个bucket的哈希映射,我插入了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 b

假设我有一个包含11个bucket的哈希映射,我插入了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,但这显然是不正确的!(当然,表会调整大小以避免出现这种情况,但我希望能够显示排列)我希望使用此信息来调整哈希函数


提前谢谢

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


在第二个例子中,你已经插入了20个项目,平方和是130,所以你的优点是6.5。我认为第一个可能是一个更好的散列函数(尽管我通常更喜欢比较相同输入的结果)。

如果你只是用它来调整散列函数本身,你可以计算一个真正的散列函数,比如基尼系数。另一方面,如果你想让它成为散列映射本身的一个特性,我建议你不要这样做——计算一个复杂的基准,作为“需要调整大小”逻辑的一部分,有它自己的性能代价;有些天真的东西可能会更好。

你可能关心答案,因为你想知道你在链接方面做了多少工作。因此,您可能应该对哈希映射进行检测,以输出它正在做的工作(一些在键方法中增加计数器的ifdef可能会起作用)。然后,您可以使用工作量(#比较、#后续节点等)作为散列函数的度量,并且作为奖励,您可以获得一个用于性能调优的漂亮工具。一旦你解决了问题,你可以删除插装。

谢谢,这很有意义,我会尝试比较和改进散列函数,但它不会给我一个“百分比”的排列。坦斯克,我会研究一下。我使用它只是为了调整hashfunctions,为了调整大小,我使用了一个可配置的loadfactor(比如.80)和resizestrategy(2.0)。