Je cherche un algorithme efficace pour faire pavage. , Vous êtes essentiellement donné une liste de chaînes, dites BCD
, CDE
, ABC
, A
, et la résultante carrelée chaîne doit être ABCDE
, parce que BCD
aligne avec CDE
Cédant BCDE
, qui est puis aligné avec ABC
, ce qui donne la finale ABCDE
.Algorithme de pavage de chaînes
Actuellement, j'utilise un algorithme légèrement naïf, qui fonctionne comme suit. En commençant par une paire aléatoire de chaînes, par exemple BCD
et CDE
, j'utilise les éléments suivants (en Java):
public static String tile(String first, String second) {
for (int i = 0; i < first.length() || i < second.length(); i++) {
// "right" tile (e.g., "BCD" and "CDE")
String firstTile = first.substring(i);
// "left" tile (e.g., "CDE" and "BCD")
String secondTile = second.substring(i);
if (second.contains(firstTile)) {
return first.substring(0, i) + second;
} else if (first.contains(secondTile)) {
return second.substring(0, i) + first;
}
}
return EMPTY;
}
System.out.println(tile("CDE", "ABCDEF")); // ABCDEF
System.out.println(tile("BCD", "CDE")); // BCDE
System.out.println(tile("CDE", "ABC")); // ABCDE
System.out.println(tile("ABC", tile("BCX", "XYZ"))); // ABCXYZ
Bien que cela fonctionne, il est pas très efficace, car il itère sur les mêmes personnages encore et encore. Donc, quelqu'un connaît-il un meilleur algorithme (plus efficace) pour le faire? Ce problème est similaire à un problème d'alignement de séquence d'ADN, donc tout conseil de quelqu'un dans ce domaine (et d'autres, bien sûr) sont les bienvenus. Notez également que je ne cherche pas un alignement, mais un carrelage, car j'ai besoin d'un chevauchement complet de l'une des chaînes sur l'autre.
Je suis actuellement à la recherche d'une adaptation du Rabin-Karp algorithm, afin d'améliorer la complexité asymptotique de l'algorithme, mais j'aimerais avoir quelques conseils avant d'approfondir cette question.
Merci d'avance.
Pour les situations où il y a une ambiguïté - par exemple, {ABC, CBA}
ce qui pourrait entraîner ABCBA
ou CBABC
-, tout carrelage peut être retourné. Cependant, cette situation se produit rarement, parce que je suis des mots de carrelage, par exemple. {This is, is me} => {This is me}
, qui sont manipulés pour que l'algorithme susmentionné fonctionne.
question similaires: Efficient Algorithm for String Concatenation with Overlap
+1 pour une question bien écrite (mais vraiment pour trouver la clé 'ï' 8-) – RichieHindle
La touche ï dans OS X est' Alt + u' pour obtenir le tréma suivi par le 'i' auquel il est appliqué. –
Très proche de http://stackoverflow.com/questions/1285434/efficient-algorithm-for-string-concatenation-with-overlap. –