String 随机素数与Rabin-Karp子串搜索

String 随机素数与Rabin-Karp子串搜索,string,algorithm,random,primes,rabin-karp,String,Algorithm,Random,Primes,Rabin Karp,我正在阅读Sedgewick的Rabin-Karb算法。书上说: 我们使用一个随机素数Q,取尽可能大的值 避免溢出 第一次阅读时,我没有注意到随机性的重要性,当我看到代码中使用了long时,我的第一个想法是: a) 使用Eratosthene筛找到适合长的的大素数 或 b) 从素数列表中查找任何大于int的足够大的素数,并将其用作常数 但接下来的解释是: 我们将使用大于10^20的long值来计算概率 碰撞发生时间小于10^-20 这部分让我感到困惑,因为long不能容纳10^20更不用说大于该

我正在阅读Sedgewick的Rabin-Karb算法。书上说:

我们使用一个随机素数Q,取尽可能大的值 避免溢出

第一次阅读时,我没有注意到随机性的重要性,当我看到代码中使用了
long
时,我的第一个想法是:
a) 使用Eratosthene筛找到适合
长的

的大素数 或
b) 从素数列表中查找任何大于
int
的足够大的素数,并将其用作常数

但接下来的解释是:

我们将使用大于
10^20
long
值来计算概率 碰撞发生时间小于
10^-20

这部分让我感到困惑,因为
long
不能容纳
10^20
更不用说大于该值的值了。 然后,当我检查素数的计算时,这本书遵循了一个只有以下提示的练习:

随机n位数是素数,概率与1/n成正比

这是什么意思

所以基本上我不明白的是:
a) 使用随机素数的意义是什么?为什么我们不能预先计算它并将其用作常数?
b) 为什么提到
10^20
,因为它超出了
long
的范围 c) 这个暗示有什么帮助?这到底意味着什么?

,塞吉威克试图简化一个算法,但细节略有错误。首先,正如您所观察到的,1020不能用64位表示。即使是接近263的质数− 1,但是,您可能需要一点空间以正常方式进行乘法,而不会溢出,以便后续的模是正确的。答案使用了31位素数,这使得这很容易,但只提供了10位中的碰撞概率−9范围

原始版本使用了一个随机变量,Sedgewick试图简化一个算法,但细节略有错误。首先,正如您所观察到的,1020不能用64位表示。即使是接近263的质数− 1,但是,您可能需要一点空间以正常方式进行乘法,而不会溢出,以便后续的模是正确的。答案使用了31位素数,这使得这很容易,但只提供了10位中的碰撞概率−9范围


原始版本使用了一个随机覆盖。练习是否也要求进行工作量估算?@Henry:练习的解决方案实际上在这里提供,并且似乎与文本的描述不一致,因为它使用了
BigInteger.probablePrime(31,new random())即32位,但不了解它与REST的链接方式练习是否也要求估算工作量?@Henry:练习的解决方案实际上是在这里提供的,并且似乎与文本的描述不一致,因为它使用了
BigInteger.probablePrime(31,new Random())即32位,不了解它与REST的链接方式。代码
Q
仅用于
%
和除法。特别是
txtHash=(txtHash+Q-RM*txt.charAt(i-m)%Q)%Q
xtHash=(txtHash*R+txt.charAt(i))%Q我不确定他如何证明碰撞概率的形式界。
这本书只是说,通过使用大于
10^20
long
值,它使得随机键散列到与模式相同的值的概率小于
10^-20
,并保持不变。然后在搜索是线性时间且极有可能是正确的命题中,书中说
使用非常大的Q值使得发生冲突的可能性非常小..Robin和Karp表明,当Q被正确选择时,我们会得到概率为1/Q的随机字符串的哈希冲突可以从素数定理或多项式环等得到诚实的德克萨斯没有考虑恶意输入的情况。这就解释了为什么应该避免常数素数。谢谢你的解释that@Jim你不必一直到Q~2^31,但是如果没有自定义的乘法运算符,它就不能非常接近字数限制。在代码中,Q
仅用于
%
和除法。特别是
txtHash=(txtHash+Q-RM*txt.charAt(i-m)%Q)%Q
xtHash=(txtHash*R+txt.charAt(i))%Q我不确定他如何证明碰撞概率的形式界。
这本书只是说,通过使用大于
10^20
long
值,它使得随机键散列到与模式相同的值的概率小于
10^-20
,并保持不变。然后在搜索是线性时间且极有可能是正确的命题中,书中说
使用非常大的Q值使得发生冲突的可能性非常小..Robin和Karp表明,当Q被正确选择时,我们会得到概率为1/Q的随机字符串的哈希冲突可以从素数定理或多项式环等得到诚实的德克萨斯没有考虑恶意输入的情况。这就解释了为什么应该避免常数素数。谢谢你的解释that@Jim你不必一直到Q~2^31,但是如果没有一个自定义的乘法运算符,它就不可能非常接近字数限制。