< 1>如果键是w位整数,我们可以将它们转换为 浮点数除以2得到2的幂,得到 浮点数在0和1之间,然后乘以M.
< 3>如果浮点运算是昂贵的而且数字不是 如此大以至于导致< 4>溢出,我们可以完成相同的结果 使用整数算术运算:将密钥< 5>乘以M,然后 右移w位除以2为w的幂(或者,如果乘以 将溢出,然后移位然后乘以)。这些功能没用 对于散列,除非键均匀分布在该范围内, 因为哈希值只由。的前导数字决定 < 8是氢;键
我正在阅读罗伯特·塞德威克(Robert Sedwick)在“C ++中的算法”(Algorithms in C ++)一书中提到的
这里M是例如容器[M]
的散列容器的大小我在上面的文字中提出的问题是,在这种情况下,作者正在讨论第4行的溢出和下溢?在这里,作者正在讨论乘法是否会过多,然后乘以?什么转移和什么繁殖
请求用简单的例子来理解第3到第8行?
由于
答案 0 :(得分:0)
整数乘法有可能溢出并丢失信息,例如:执行32位无符号算术时溢出的示例:
2 ^ 31 = 0x80000000
(2 ^ 31 * 2 ^ 31) = 2 ^ 62 = 0x4000000000000000
由于32位中可表示的最大数字是0xFFFFFFFF = 2 ^ 32 - 1
,因此上述计算的结果将为0,因为32位以上的位丢失。