【问题标题】:Rabin-Karp string matching algorithm by rolling hash滚动哈希的Rabin-Karp字符串匹配算法
【发布时间】:2012-01-18 15:18:12
【问题描述】:

这是Rabin-Karp字符串匹配算法在C#中的一个实现...

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!");

}

但是如果我改变第二个字符串的位置而不是显示结果不是复制但它有一个问题

 string A = "String that contains a pattern.";
 string B = "pattern";

这里显示没有复制

 string A = "String that contains a pattern.";
 string B = "Matches contains a pattern ";

我想检查它是否是从第一个字符串复制的,甚至我会在其中添加一些内容或更改位置,但它不应该有区别,所以如何更改它,它只会比较每个单词的哈希值在字符串中比实现它............

【问题讨论】:

标签: c# .net data-structures hash rabin-karp


【解决方案1】:

改变

string B = "Matches contains a pattern ";

string B = "contains a pattern ";

它会起作用的

【讨论】:

  • 但这不是一个解决方案,如果我使用两个输入文件并想要检查它们并且第二个文件正在通过更改其位置进行编辑,并且所有内容都在那里但它被复制了,那么我们将如何检查这个???????????????
  • 在这种情况下,您所拥有的还不够。检查en.wikipedia.org/wiki/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 2023-03-09
  • 2017-07-27
  • 1970-01-01
  • 2011-05-20
  • 2021-12-25
  • 2016-09-06
相关资源
最近更新 更多