【发布时间】:2012-04-26 17:26:04
【问题描述】:
我在网站上的论坛中看到了这个 Rabin Karp 字符串匹配算法,我有兴趣尝试实现它,但我想知道是否有人能告诉我为什么变量 ulong Q 和 ulong D 是 100007 和 256分别:S? 这些价值观有什么意义?
static void Main(string[] args)
{
string A = "String that contains a pattern.";
string B = "pattern";
ulong siga = 0;
ulong sigb = 0;
ulong Q = 100007;
ulong D = 256;
for (int i = 0; i < B.Length; i++)
{
siga = (siga * D + (ulong)A[i]) % Q;
sigb = (sigb * D + (ulong)B[i]) % Q;
}
if (siga == sigb)
{
Console.WriteLine(string.Format(">>{0}<<{1}", A.Substring(0, B.Length), A.Substring(B.Length)));
return;
}
ulong pow = 1;
for (int k = 1; k <= B.Length - 1; k++)
pow = (pow * D) % Q;
for (int j = 1; j <= A.Length - B.Length; j++)
{
siga = (siga + Q - pow * (ulong)A[j - 1] % Q) % Q;
siga = (siga * D + (ulong)A[j + B.Length - 1]) % Q;
if (siga == sigb)
{
if (A.Substring(j, B.Length) == B)
{
Console.WriteLine(string.Format("{0}>>{1}<<{2}", A.Substring(0, j),
A.Substring(j, B.Length),
A.Substring(j + B.Length)));
return;
}
}
}
Console.WriteLine("Not copied!");
}
【问题讨论】:
-
我不熟悉这个算法。我得到了第一个包含错误的
for () {}循环。如果 B.Length > A.Length 怎么办?IndexOutOfRangeException -
在阅读了维基百科的文章 (en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm) 后,我可以看到 Q 是一个用于散列子字符串的“大素数”。 D 似乎是一个比例因子,它认为每个新字符位置都是 256 的倍数,但这似乎假设没有字符值 >= 256。不过,我在这里根本不是专家。
-
D 为 256 本质上是向左移动 8 位,为下一个字符腾出空间(不过,这是一个以 ascii 为中心的视图)
标签: c# string algorithm rabin-karp