【问题标题】:Random primes and Rabin Karp substring search随机素数和 Rabin Karp 子串搜索
【发布时间】:2020-12-06 11:08:51
【问题描述】:

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

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

第一次阅读我没有注意到 random 的重要性,当我看到代码中使用了 long 时,我的第一个想法是:
a) 使用 Eratosthene 的筛子找到适合 long
的大素数 或
b) 从素数列表中查找任何大于int 的足够大的素数并将其用作常数。

但是接下来的解释说:

我们将使用大于10^20long 值来生成概率 碰撞发生少于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


【解决方案1】:

Once again,Sedgewick 试图简化算法,但在细节上略有错误。首先,正如您所观察到的,1020 不能用 64 位表示。然而,即使取一个接近 263 − 1 的素数,您可能还需要一点空间以正常方式相乘而不会溢出,以便随后的模数是正确的。答案使用 31 位素数,这使得这很容易,但仅提供 10-9 范围内的碰撞概率。

原始版本在 ?2[x] 上使用 Rabin fingerprints 和随机 irreducible polynomial,从代数数论的角度来看,它的行为很像整数上的随机素数。如果我们选择多项式为 32 或 64 次,那么指纹完全适合一个适当长度的计算机字,并且多项式加法和减法都可以按位异或,所以不会溢出。

现在,Sedgewick 大概不想解释多项式环的工作原理。美好的。如果我必须在实践中实施这种方法,我会选择一个接近最大值的素数 p 很容易用廉价的指令修改(我偏爱 2 31 - 227 + 1; EDIT 实际上 231 - 1 效果更好,因为我们在这里不需要平滑素数)和然后在 [1, p−1] 中选择一个随机数来评估多项式(这是维基百科的解释)。我们需要一些随机性的原因是,否则不经意的对手可能会选择一个保证会有很多哈希冲突的输入,这会严重降低运行时间。

Sedgewick 希望更接近原始版本,但是,它实质上是在 x 的固定值处评估多项式(在使用多项式环的原始版本中字面意思是 x)。他需要一个随机素数,这样不经意间的对手就无法设计碰撞。筛选足够大的数字效率很低,所以他求助于素数定理(这是他暗示背后的数学,但它只是渐近地成立,这在理论上会造成很大的混乱)和快速素数测试(可以是概率性的;失败的情况不会影响算法的正确性,而且很少见,不会影响预期的运行时间)。

我不确定他如何证明碰撞概率的正式界限。我的粗略想法基本上是,证明感兴趣的窗口中有足够的素数,使用中国剩余定理证明一次不可能有太多素数发生碰撞,得出碰撞概率由选择坏素数的概率很低。但是素数定理只是渐近成立的,所以我们必须依靠计算机实验来确定机器字范围内素数的密度。不太好。

【讨论】:

  • 在代码中Q仅用于%和除法。特别是txtHash = (txtHash + Q - RM*txt.charAt(i-m) % Q) % Q; xtHash = (txtHash*R + txt.charAt(i)) % Q; 所以尽管 M
  • I'm not sure how he proves a formal bound on the collision probability. 这本书只是说,通过使用大于10^20long 值,它使随机密钥散列到与模式相同的值的概率小于10^-20 和就这样吧。然后在搜索是线性时间并且极有可能是正确的命题中,这本书说the use of the very large value of Q makes it extremely unlikely that a collision will occur..Robin and Karp showed that when Q is properly chosen we get a hash collision for random string with probability 1/Q
  • 老实说,我不知道如何从文本中推导出素数定理或多项式环等
  • 我没有考虑恶意输入的情况。这就解释了为什么应该避免使用恒定素数。谢谢你解释
  • @Jim 你不必一直到 Q ~ 2^31,但如果没有自定义乘法运算符,它就不能非常接近字数限制。
猜你喜欢
  • 1970-01-01
  • 2018-11-18
  • 2010-11-22
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 2014-02-21
相关资源
最近更新 更多