我开始从CLRS学习有关哈希的方法(Cormen等人)。我能够理解数学过程以及如何执行计算机。这本书只是简单地将数学过程表述为-
-> multiply the key k with a constant A (0<A<1), results into kA;
-> extract the fractional part of kA by doing (kA mod 1);
-> multiply the result with m (usually taken to be a power of 2 for easy
implementation on computers);
-> take the floor of this result and that is the hashed value;
-> therefore, this is the hashing function, h(k) = floor[m*(kA mod 1)]
这本书进一步说明了如何在大多数计算机上实现它,它比除法的优势以及Knuth对“ A”值的建议。
我无法理解的是,为什么我们要遵循以下过程:将键与范围在0到1之间的数字(A)专门相乘,然后取小数部分,然后乘以m,然后取地板?
这是否产生“近似于” SUHA(简单统一哈希的假设)的散列值,即理想情况下每个键应独立地散列到m个时隙中的任何一个,所以此方法产生的结果是否“更接近”此理想? / p>
答案 0 :(得分:0)
理想的哈希应该满足简单统一哈希的假设。
例如在哈希函数h(k): U--> {0...m-1}
中,其中U
是可能的键的范围,而m
是表的大小
这意味着每次您对哈希世界中的任何密钥进行散列时,密钥中的任何一个都应该同样有可能最终出现在同一位置,并且密钥的分布均匀地分布在所有位置上吗?
嗯,在实践中并不是那么容易,我们不知道提前分配密钥的可能性,即使我们这样做,我们仍然不知道哪个密钥将从该宇宙中抽出。
>因此,我们需要根据对键的了解来实践,以在k
上创建一些性能良好的计算并将键在整个表中分配得很好。
这就是我们在方法之间进行交易的地方,
采用除法:只需h(k) = k mod m
键即可对表的大小取模。
简单,快速且仅产生法律价值,但您必须非常小心地选择m
!例如,如果表是2的幂,则实际上是在使用k
的最低有效位,并且这些键可能显示特定的结构。因此,为m
选择一个质数可能接近2的精确乘方。
让我们继续进行乘法方法的对比:h(k) = floor[m*(kA mod 1)]
其中(0<A<1)
我们将密钥与小数相乘,因此mod 1
可以将小数部分取出。本质上,您将不断地将m
与0之间的一个数字乘以,但不包括1,最后,我们以该结果的下限为底来获取一个整数。
这比除法要慢,但是无论您为m
选择什么都没有关系m
的值并不重要!
回到您的问题,这完全取决于您采用的是哪种类型的实现,以及相应地如何使用哈希表。有很多。