Pregunta

Mi problema principal es tratar de encontrar una solución adecuada para desconectar automáticamente esto, por ejemplo:

d+c+d+f+d+c+d+f+d+c+d+f+d+c+d+f+

en esto:

[d+c+d+f+]4

es decir. duplicados para encontrar uno junto al otro, y luego hacer un "bucle" más corto de estos duplicados. Hasta el momento no he encontrado ninguna solución adecuada a este, y espero una respuesta. PD Para evitar confusiones, la muestra antes mencionada no es la única cosa que necesita "bucle", se diferencia de un archivo a otro. Oh, y esto está destinado a un programa de C ++ o C #, o bien está bien, aunque estoy abierto a otras sugerencias también. Además, la idea principal es que todo el trabajo se llevaría a cabo por el propio programa, sin intervención del usuario excepto para el propio archivo. Aquí está el archivo completo, para referencia, mis disculpas por la página de estirado:  # 0 @ 16 y10 T76 V225 W250

l16 $ ED $ EF $ A9 p20,20 > Ecegb> d D + d + f + a +> c + f + d + C cegbgegec ec d + c + d + f + d + c + d + f + d + c + d + f + d + c + d + f + r1 ^ 1

/ L8 R1R1R1R1 f + f + g + cg + r4 a + c + a + g + cg + R4F + f + g + cg + r4 a + c + a + g + cg + R4F + f + g + cg + r4 a + c + a + g + cg + r4 f + f + g + cg + r4 a + c + a + g + r4g + 16f16c + a + 2 ^ g + f + g + 4 f + FF + 4FD + f4 d + c + d + 4c + c C4d + c + d + 4g + 4a + 4 r1 ^ 2 ^ 4 ^ a + 2 ^ g + f + g + 4 f + FF + 4FD + f4 d + c + d + 4c + c C4d + c + d + 4g + 4a + 4 r1 ^ 2 ^ 4 ^ r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1

# 4 @ 22 y10 V250

L8 o3 rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + / r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1

# 2 @ 4 y10 V155

L8 ED $ $ $ F8 8F O4 r1r1r1 d + 4f4f + 4g + 4 a + 4r1 ^ 4 ^ 2 / d + 4 ^ FR2 f + 4 ^ fr2d + 4 ^ FR2 f + 4 ^ fr2d + 4 ^ FR2 f + 4 ^ fr2d + 4 ^ FR2 f + 4 ^ FR2 > d + 4 ^ FR2 f + 4 ^ fr2d + 4 ^ FR2 f + 4 ^ FR2 < f + 4 ^ g + r2 f + 4 ^ fr2f + 4 ^ g + r2 f + 4 ^ fr2f + 4 ^ g + r2 f + 4 ^ fr2f + 4 ^ g + r2 f + 4 ^ fr2f + 4 ^ g + r2 f + 4 ^ fr2f + 4 ^ g + r2 f + 4 ^ fr2f + 4 ^ g + r2 f + 4 ^ fr2f + 4 ^ g + r2 f + 4 ^ FR2 > a + 4 ^ g + r2 f + 1a + 4 ^ g + r2 f + 1 f + 4 ^ FR2 d + 1 f + 4 ^ FR2 d + 2 ^ d + 4 ^ r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1

# 3 @ 10 y10 V210

r1 ^ 1 o3 c8r8d8r8 c8r8c8r8c8r8c8r8c8r8c8r8c8r8c8r8c8r8c8r8c8r8 c8 @ @ 21 10d16d16 c8 @ @ 21 10d16d16 c8 @ @ 21 10d16d16 / c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ @ 10d8 21c8c4 @ @ 10d8 21c8 c8 @ @ 10d8 21c8c4 @ @ 10d8 21c8 c8 @ @ 10d8 21c8 c4 @ @ 10d8 21c8 @ 10d16d16d16d16d16r16 c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 < b8> c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ 10d8 @ 21c8 c8 @ 10d8 @ 21c8c4 @ @ 10d8 21c8 c8 @ @ 10d8 21c8c4 @ @ 10d8 21c8 c8 @ @ 10d8 21c8 c4 @ @ 10d8 21c8 @ 10b16b16> c16c16

# 7 @ 16 y10 V230

l16 $ ED $ EF $ A9 cceeggbbggeeccee d + d + f + f + a + a + f + f + d + d + d + d + cceeggeecc cc d + d + ffd + d +

# 5 @ 4 y10 V155

L8 ED $ $ $ F8 8FO4 R1R1R1R1 d + 4r1 ^ 2 ^ 4 / CR2 c + 4 ^ CR2 CR2 c + 4 ^ CR2 CR2 c + 4 ^ CR2 CR2 c + 4 ^ CR2 a + 4 ^> CR2 c + 4 ^ CR2 CR2 c + 4 ^ c r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1 r2 f + 4 ^ FR2 d + 1f + 4 ^ FR2 d + 1 c + 4 ^ CR2 C + 4 ^ CR2

¿Fue útil?

Solución

No estoy seguro si esto es lo que busca.

Tomé la cadena "testtesttesttest4notaduped + c + d + + + f + d + c + d f + d + c + d f + d + c + d + f + testtesttest" y se convierte en "[test] 4 4notadupe [d + c + d + f +] 4 [test] 3 "

Estoy seguro de que alguien va a llegar a una mejor solución más eficiente, ya que es un poco lento al procesar su archivo completo. Miro adelante a otras respuestas.

        string stringValue = "testtesttesttest4notaduped+c+d+f+d+c+d+f+d+c+d+f+d+c+d+f+testtesttest";

        for(int i = 0; i < stringValue.Length; i++)
        {
            for (int k = 1; (k*2) + i <= stringValue.Length; k++)
            {
                int count = 1;

                string compare1 = stringValue.Substring(i,k);
                string compare2 = stringValue.Substring(i + k, k);

                //Count if and how many duplicates
                while (compare1 == compare2) 
                {
                    count++;
                    k += compare1.Length;
                    if (i + k + compare1.Length > stringValue.Length)
                        break;

                    compare2 = stringValue.Substring(i + k, compare1.Length);
                } 

                if (count > 1)
                {
                    //New code.  Added a space to the end to avoid [test]4 
                    //turning using an invalid number ie: [test]44.
                    string addString = "[" + compare1 + "]" + count + " ";

                    //Only add code if we are saving space
                    if (addString.Length < compare1.Length * count)
                    {
                        stringValue = stringValue.Remove(i, count * compare1.Length);
                        stringValue = stringValue.Insert(i, addString);
                        i = i + addString.Length - 1;
                    }
                    break;
                }
            }
        }

Otros consejos

Puede utilizar el algoritmo de Smith-Waterman hacer alineamiento local, comparando la cadena contra sí misma.

http://en.wikipedia.org/wiki/Smith-Waterman_algorithm

EDIT: Para adaptar el algoritmo de alineación de auto, es necesario obligar a los valores en la diagonal a cero - es decir, penalizar la solución trivial de la alineación de toda la cadena tal y consigo mismo. A continuación, el "segundo mejor" alineación saldrá en su lugar. Esto será más largas las dos subcadenas coincidentes. Repita el mismo tipo de cosas para encontrar progresivamente más cortos subcadenas coincidentes.

LZW pueden ayudar: utiliza prefijos diccionario para buscar patrones repetitivos y sustituye a dichos datos con referencias a entradas anteriores. Creo que no debería ser difícil para adaptarlo a sus necesidades.

¿Por qué no usar System.IO.Compression ?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top