我正在阅读Cormen等算法导论中的字符串算法
以下是关于一些基本数字理论符号的文本。
注意:在下面的文字refere == as modulo equivalence。
给定一个明确定义的一个整数的余数除以另一个整数的概念,提供特殊符号来表示余数的相等是很方便的。如果(a mod n)=(b mod n),我们写一个== b(mod n)并说a等于b,modulo n。换句话说,如果a和b在除以n时具有相同的余数,则a == b(mod n)。等效地,当且仅当n |时,a == b(mod n) (b - a)。 例如,61 == 6(mod 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。
写一个属于[b] n与写一个== b(mod n)相同。所有这些等价类的集合是
Zn = {[a] n:0< = a< = n - 1} .---------->方程1
我在上面的文字中的问题是在等式1中提到“a”应该在0和n-1之间,但是在例子中给出的是-4,它不在0和6之间,为什么?
除了上述内容之外,还提到对于Rabin-Karp算法,我们使用两个数的等价来模数为第三个数?这是什么意思?
答案 0 :(得分:1)
我会尽力向你推动正确的方向,即使它不是关于编程的。
其中包含-4的示例是等价类的示例,它是一组等于给定数字的所有数字。因此,在[3] 7中,所有数字都是等价的(模7)到3,包括-4以及17和710以及其他的无穷大。
你也可以命名相同的类[10] 7,因为每个等价(模7)到3的数字在同一时间(模7)到10。
最后一个定义给出了一组所有不同的等价类,并指出对于模7,正好有7个,并且可以由0到6的数字生成。你也可以说
Zn = {[a]n : n <= a < 2 * n}
并且含义将保持不变,因为[0] 7与[7] 7相同,[6] 7与[13] 7相同。
答案 1 :(得分:0)
这不是编程问题,但不要介意......
提到“a”应该在0和n-1之间,但在例子中它是-4,它不在0和6之间,为什么?
因为[-4] n与某些x的[x] n是相同的等价类,所以0 <= x <1。 ñ。因此,等式1利用了这个事实来“消除”定义并使所有可能性变得明显。
除了上述内容之外,还提到对于Rabin-Karp算法,我们使用两个数的等价来模数为第三个数?这是什么意思?
Rabin-Karp算法要求您计算要搜索的子字符串的哈希值。散列时,使用散列函数非常重要,即使对于非常小的字符串,也使用整个可用域。如果你的哈希是一个32位整数,并且你只是将连续的unicode值加在一起,那么你的哈希值通常很小,导致很多冲突。
所以你需要一个可以给你大答案的功能。不幸的是,这也暴露了整数溢出的可能性。因此,您使用模运算来防止比较被溢出搞乱。