He visto este algoritmo de concordancia de cadenas Rabin Karp en los foros del sitio web y estoy interesado en intentar implementarlo, pero me preguntaba si alguien podría decirme por qué las variables ulong Q y ulong D son 100007 y 256 respectivamente: S? ¿Qué importancia tienen estos valores con ellos?Algoritmo de coincidencia de cadenas Rabin Karp
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!");
}
No estoy familiarizado con este algoritmo. Llegué tan lejos como el primer bucle 'for() {}' que contiene un error. ¿Qué pasa si B.Length> A.Length? 'IndexOutOfRangeException' – Tergiver
Después de leer el artículo de Wikipedia (http://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm), puedo ver que Q es un" gran número primo "que se utiliza para cifrar las subcadenas. D parece ser un factor de escala que considera que cada nueva posición de personaje es un múltiplo de 256, pero parece suponer que ningún valor de carácter será> = 256. Sin embargo, no soy un experto en absoluto. – Tergiver
D siendo 256 es esencialmente cambiar 8 bits a la izquierda, para hacer espacio para el siguiente char (aunque, eso es una vista centrada en ascii) – payo