Estoy buscando un algoritmo eficiente para hacer cadena de embaldosado. Básicamente, se le da una lista de cadenas, dice BCD
, CDE
, ABC
, A
, y la consiguiente baldosas cadena debe ser ABCDE
, porque BCD
se alinea con CDE
cediendo BCDE
, que es luego alineado con ABC
obteniéndose el ABCDE
final.Algoritmo de encadenamiento de cadena
Actualmente, estoy usando un algoritmo ligeramente ingenuo, que funciona de la siguiente manera. A partir de un par aleatoria de cadenas, por ejemplo BCD
y CDE
, utilizo el siguiente (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
Aunque esto funciona, no es muy eficiente, ya que itera sobre los mismos personajes una y otra vez.
Entonces, ¿alguien sabe mejor (más eficiente) algoritmo para hacer esto? Este problema es similar a un problema de alineación de secuencia de ADN, por lo que cualquier consejo de alguien en este campo (y otros, por supuesto) son bienvenidos. También tenga en cuenta que no estoy buscando una alineación , sino un mosaico, porque necesito una superposición completa de una de las cadenas sobre la otra.
Actualmente estoy buscando una adaptación del Rabin-Karp algorithm, para mejorar la complejidad asintótica del algoritmo, pero me gustaría escuchar algunos consejos antes de profundizar más en este asunto.
Gracias de antemano.
Para situaciones donde hay ambigüedad - por ejemplo, {ABC, CBA}
que podría resultar en ABCBA
o CBABC
-, pueden ser devueltos cualquier suelo de baldosas. Sin embargo, esta situación rara vez ocurre, porque estoy embaldosando palabras, p. {This is, is me} => {This is me}
, que se manipulan para que el algoritmo mencionado funcione.
Pregunta similar: Efficient Algorithm for String Concatenation with Overlap
+1 para una pregunta bien escrita (pero realmente para encontrar la tecla 'ï' 8-) – RichieHindle
La tecla ï en OS X es' Alt + u' para obtener la diéresis seguida de la 'i' a la que Está aplicado. –
Muy cerca de http://stackoverflow.com/questions/1285434/efficient-algorithm-for-string-concatenation-with-overlap. –