Question

Mon problème principal essaie de trouver une solution adaptée pour tourner automatiquement ce, par exemple:

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

dans ceci:

[d+c+d+f+]4

i.e.. Trouver les doublons à côté de l'autre, puis faire une « boucle » plus courte de ces doublons. Jusqu'à présent, je l'ai trouvé aucune solution adaptée à cela, et je me réjouis d'une réponse. Post-scriptum Pour éviter toute confusion, l'échantillon ci-dessus n'est pas la seule chose qui a besoin « en boucle », il diffère d'un fichier à. Oh, et cela est destiné à un programme C ++ ou C #, que ce soit est très bien, mais je suis ouvert à d'autres suggestions aussi. En outre, l'idée principale est que tout le travail serait fait par le programme lui-même, aucune entrée d'utilisateur, sauf pour le fichier lui-même. Voici le dossier complet, pour référence, mes excuses pour la page Étiré:  # 0 @ 16 V225 Y10 W250 t76

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 + r4 + cg a + c + a + g + + cg R4f + f + g + r4 + cg a + c + a + g + + cg R4f + f + g + r4 + cg a + c + a + g + r4 + cg f + f + g + r4 + cg a + c + a + g + + R4G 16f16c + a + 2 ^ g + f + g + 4 f ff + + + f4 4FD d + c + d + 4c + c C4d + c + d + 4g + 4a + 4 r1 ^ 2 ^ 4 ^ a ^ + 2 g + f + g + 4 f ff + + + f4 4FD d + c + d + 4c + c C4d + c + d + 4g + 4a + 4 r1 ^ 2 ^ 4 ^ r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1

# 4 @ 22 Y10 de 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 de V155

L8 $ ED $ F8 $ 8F O4 r1r1r1 d + 4f4f + 4g + 4 a + 4R1 ^ 4 ^ 2 / d + 4 ^ fr2 f + 4 ^ 4 ^ fr2d + fr2 f + 4 ^ 4 ^ fr2d + fr2 f + 4 ^ 4 ^ fr2d + fr2 f + 4 ^ fr2 > d + 4 ^ fr2 f + 4 ^ 4 ^ fr2d + fr2 f + 4 ^ fr2 < f + g + 4 ^ r2 f + 4 ^ 4 ^ fr2f + g + r2 f + 4 ^ 4 ^ fr2f + g + r2 f + 4 ^ 4 ^ fr2f + g + r2 f + 4 ^ 4 ^ fr2f + g + r2 f + 4 ^ 4 ^ fr2f + g + r2 f + 4 ^ 4 ^ fr2f + g + r2 f + 4 ^ 4 ^ fr2f + g + r2 f + 4 ^ fr2 > a + g + 4 ^ 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 @ 10d16d16 @ 21 c8 @ 10d16d16 @ 21 c8 @ 10d16d16 @ 21 / 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 de 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 de V155

L8 $ ED $ F8 $ 8FO4 R1R1R1R1 d + 4R1 ^ 2 ^ 4 / CR2 c + 4 ^ a2 cr2 c + 4 ^ a2 cr2 c + 4 ^ a2 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

Était-ce utile?

La solution

Je ne sais pas si cela est ce que vous recherchez.

Je pris la chaîne "testtesttesttest4notaduped + c + d + f + d + c + d + f + d + c + d + f + d + c + d + f + testtesttest" et converti en « [Test] 4 4notadupe [d + c + d + f +] 4 [Test] 3 «

Je suis sûr que quelqu'un va trouver une meilleure solution plus efficace car il est un peu lent lors du traitement de votre dossier complet. Je me réjouis d'autres réponses.

        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;
                }
            }
        }

Autres conseils

Vous pouvez utiliser l'algorithme de Smith-Waterman pour faire l'alignement local, comparant la chaîne contre lui-même.

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

EDIT: Pour adapter l'algorithme d'auto-alignement, vous devez forcer des valeurs dans la diagonale à zéro - à savoir, pénaliser la solution triviale d'aligner toute la chaîne exactement avec lui-même. Ensuite, la « deuxième meilleur » alignement ressortira à la place. Ce sera la plus longue de deux sous-chaînes correspondants. Répétez le même genre de chose à trouver des sous-chaînes correspondant plus en plus courts.

LZW peut aider: il utilise préfixes dictionnaire pour rechercher des motifs répétitifs et remplace ces données avec des références aux entrées précédentes. Je pense qu'il ne devrait pas être difficile de l'adapter à vos besoins.

Pourquoi ne pas simplement utiliser System.IO.Compression ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top