字符串 Rabin-Karp 基本数字符号

Posted

技术标签:

【中文标题】字符串 Rabin-Karp 基本数字符号【英文标题】:string Rabin-Karp elementary number notations 【发布时间】:2011-12-29 08:51:40 【问题描述】:

我正在阅读 Cormen 等人的算法简介中的字符串算法

以下是关于一些基本数论符号的文本。

注意:在下面的文本中,将 == 引用为模等价。

给定一个整数除以另一个整数的余数的定义明确的概念,提供特殊符号来表示余数相等是很方便的。如果 (a mod n) = (b mod n),我们写 a == b (mod n) 并说 a 等价于 b,模 n。换句话说,如果 a 和 b 除以 n 时具有相同的余数,则 a == b (mod n)。等效地,a == b (mod n) 当且仅当 n | (b-a)。 例如,61 == 6(模 11)。此外,-13 == 22 == 2 == (mod 5)。

整数可以根据余数模n分为n个等价类。包含整数a的等价类模n是

[a]n = a + kn : k Z .

例如,[3]7 = 。 . . , -11, -4, 3, 10, 17, . . .;该集合的其他表示是 [-4]7 和 [10]7。

写 a 属于 [b]n 与写 a == b (mod n) 相同。所有这些等价类的集合是

Zn = [a]n : 0 方程 1

我在上面的文本中的问题是在等式 1 中提到“a”应该介于 0 和 n-1 之间,但在示例中它被给出为 -4 而不是介于 0 和 6 之间,为什么?

除了上面提到的,对于 Rabin-Karp 算法,我们使用两个数模第三个数的等价性?这是什么意思?

【问题讨论】:

这与字符串或算法无关,与数学有很大关系。 -4 == 3 (mod 7)。有时将其视为 3 有时会很方便,有时将其视为 -4。而“a 等价于 b mod c”仅仅意味着 c 除以 a-b。 【参考方案1】:

我会尽量把你推向正确的方向,即使这不是关于编程的。

其中带-4的例子是一个等价类的例子,它是一个由所有数字组成的集合,与给定的数字等价。因此,在 [3]7 中,所有数字都与 3 等价(模 7),其中包括 -4 以及 17 和 710 以及无穷多个其他数字。

您也可以将同一个类命名为 [10]7,因为与 3 等效(模 7)的每个数字同时与 10 等效(模 7)。

最后一个定义给出了一组所有 不同 等价类,并指出对于模 7,正好有 7 个,并且可以由 0 到 6 的数字产生。你也可以说

Zn = [a]n : n <= a < 2 * n

并且含义将保持不变,因为 [0]7 与 [7]7 相同,而 [6]7 与 [13]7 相同。

【讨论】:

【参考方案2】:

这不是编程问题,但没关系...

上面提到“a”应该在0到n-1之间,但是在例子中它被给出为-4而不是在0到6之间,为什么?

因为 [-4]n 是与 [x]n 相同的等价类,对于某些 x 使得 0

除了上面提到的,对于 Rabin-Karp 算法,我们使用两个数模第三个数的等价性?这是什么意思?

Rabin-Karp 算法要求您计算要搜索的子字符串的哈希值。在散列时,使用一个使用整个可用域的散列函数很重要,即使是非常小的字符串也是如此。如果您的散列是一个 32 位整数,并且您只是将连续的 unicode 值相加,那么您的散列通常会非常小,从而导致大量冲突。

因此,您需要一个可以为您提供大量答案的函数。不幸的是,这也使您面临整数溢出的可能性。因此,您使用模算术来防止比较被溢出弄乱。

【讨论】:

以上是关于字符串 Rabin-Karp 基本数字符号的主要内容,如果未能解决你的问题,请参考以下文章

字符串字符串查找 ( Rabin-Karp 算法 )

Rabin-Karp指纹字符串查找算法

Rabin-Karp 字符串搜索算法

Rabin-Karp 字符串匹配不匹配

使用 Rabin-Karp 搜索字符串中的多个模式

字符串哈希之Rabin-Karp,poj1200