java mod 函数的使用方法_帮助在Java中使用Horner的规则和哈希函数?

这本书说你应该利用这些数学等价:

(a * b) mod m = ((a mod m) * (b mod m)) mod m

(a + b) mod m = ((a mod m) + (b mod m)) mod m

从而,

h = (((x*c) + y)*c + z) mod m

相当于

_ _ _ _

h = (((x*c) + y)*c + z)

哪里

_

a * b = ((a mod m) * (b mod m)) mod m

_

a + b = ((a mod m) + (b mod m)) mod m

基本上,对于每个基本加法和基本减法,您可以用修改操作数的“高级”版本替换它,并修改结果.由于基本乘法的操作数现在在0..m-1的范围内,所以你得到的最大数字是(m-1)^ 2,如果m足够小,可以减轻溢出.

也可以看看

> -1 mod 2 = 1数学,但Java中的-1%2为-1.

顺便说一句,应该指出的是32是这个类的哈希函数的乘数的一个可怕的选择(因为它不是素数),特别是对于计算(因为它是2的幂).更好的是31,因为:

>这是主要的(在数学上很重要!)

>它比一个2的幂小一个,所以它可以优化到更便宜的移位和减法

> 31 * i ==(i << 5) - i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值