Алгоритм сопоставления строк Рабина-Карпа по скользящему хешу - PullRequest
2 голосов
/ 12 декабря 2011

Вот реализация алгоритма сопоставления строк Рабина-Карпа в 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 ";

я хочу проверить, является ли это копией из первой строки или нет, даже я бы добавил что-то в нееизменить положение, но это не должно иметь значения, так как изменить его так, чтобы он просто сравнивал хэши каждого слова в строке, а не реализовывал его ............

1 Ответ

0 голосов
/ 12 декабря 2011

Изменение

string B = "Matches contains a pattern ";

до

string B = "contains a pattern ";

и будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...