【发布时间】:2020-12-06 11:08:51
【问题描述】:
我正在阅读 Sedgewick 的 Rabin-Karb 算法。书上说:
我们使用随机素数 Q 取尽可能大的值,同时 避免溢出
第一次阅读我没有注意到 random 的重要性,当我看到代码中使用了 long 时,我的第一个想法是:
a) 使用 Eratosthene 的筛子找到适合 long
的大素数
或
b) 从素数列表中查找任何大于int 的足够大的素数并将其用作常数。
但是接下来的解释说:
我们将使用大于
10^20的long值来生成概率 碰撞发生少于10^-20
这部分让我感到困惑,因为 long 不能容纳 10^20 更不用说大于此的值了。
然后,当我检查素数的计算时,这本书遵循了一个只有以下提示的练习:
一个随机的 n 位数是质数,概率与 1/n 成正比
这是什么意思?
所以基本上我没有得到的是:
a) 使用 random 素数是什么意思?为什么我们不能只预先计算它并将其用作常数?
b) 为什么提到10^20,因为它超出了long 的范围?
c) 这个提示有什么帮助?具体是什么意思?
【问题讨论】:
-
练习是否还要求进行工作量估算?
-
@Henry:这里实际上提供了练习的解决方案algs4.cs.princeton.edu/53substring/RabinKarp.java.html,并且似乎与文本描述不一致,因为它使用
BigInteger.probablePrime(31, new Random());,即32 位,不知道它是如何与其余部分链接的
标签: string algorithm random primes rabin-karp