摘要:有没有办法做到这一点?这就是我的意思:假设我有一个无符号整数。然后我将它乘以几次(并且有溢出,这是预期的)。那么是否可以“恢复”原始值呢?
详细说明:
这都是关于Rabin-Karp rolling hash 的。我需要做的是:我有一个长字符串的散列 - 例如:“abcd”。然后我有一个较短的子字符串的哈希 - 例如“cd”。如何使用两个给定的哈希计算 O(1) 的“ab”哈希?
我现在拥有的算法:
- 从“abcd”哈希中减去“cd”哈希(从多项式中删除最后一个元素)
- 将“abcd”哈希除以
p ^ len( "cd" )
,其中p
是基数(质数)。
所以这是:
a * p ^ 3 + b * p ^ 2 + c * p ^ 1 + d * p ^ 0
-ABCD _
c * p ^ 1 + d * p ^ 0
-光盘
ab得到:
( (a * p ^ 3 + b * p ^ 2 + c * p ^ 1 + d * p ^ 0 ) - ( c * p ^ 1 + d * p ^ 0 ) ) / ( p ^ 2 ) = a * p ^ 1 + b * p ^ 0
这有效,如果我没有溢出(如果p
是小数字)。但如果不是 - 它不起作用。
有什么诀窍之类的吗?
PSc++
标签是因为数字的溢出,因为它是特定的(并且不同于python,scheme或sth)