Existe un algoritmo de tiempo lineal para dividir el texto de manera uniforme en líneas de ancho máximo. Utiliza SMAWK (o Knuth & Plass) y "uniformemente" significa: http://en.wikipedia.org/wiki/Word_wrap#Minimum_raggedness
¿Existe un algoritmo o una función de costo cóncava para el algoritmo anterior que tenga en cuenta la cantidad de líneas en las que me gustaría que se divida el texto, en lugar del ancho máximo de línea? También en tiempo lineal?
En otras palabras, estoy buscando un algoritmo de salto de línea (o formación de párrafo o ajuste de palabras) donde la entrada es el número deseado de líneas, no el ancho de línea deseado.
Solo para describir un enfoque prácticamente inutilizable: hay N palabras y N-1 espacios entre cada par de palabras, M es el número deseado de líneas (M <= N). Después de cada espacio puede haber como máximo un salto de línea (posiblemente cero). Ahora, el algoritmo intentaría colocar los descansos en cada combinación posible, calculando la "irregularidad" y devolviendo la mejor. ¿Cómo hacerlo mucho más rápido?
Además, ¿ese problema tiene un nombre? ¿A qué "familia" de problemas pertenece? (Por ejemplo, "embalaje de contenedores"). Si no necesitara la solución perfectamente óptima, solo una muy buena, ¿es posible resolverla mucho más rápido? (alguna forma de heurística podría ser utilizable, si para una entrada dada siempre hubiera la misma solución, posiblemente subóptima).
Actualizar
Chandra Chekuri sugirió a continuación "un problema en el capítulo de Kleinberg y Tardos sobre programación dinámica". Fue una buena lectura, pero se trata del salto de línea basado en el ancho en lugar del recuento de líneas. Podría ser adaptable a este problema, que es algo que estoy tratando de resolver ahora. Aquí hay un buen enlace a la solución, incluso afirman resolverlo en tiempo lineal: http://web.media.mit.edu/~dlanman/courses/cs157/HW5.pdf
Además, hay un capítulo "8.5 El problema de la partición" en el Manual de diseño de algoritmos de Skiena que parece estar exactamente en el tema, todavía lo estoy leyendo, difícil. (Desafortunadamente, por lo que entendí, tiene una complejidad de tiempo cuadrática)
fuente
Respuestas:
fuente
No sé si esto ayuda, pero hacia el final de este comentario alguien implementa lo que quieres en PHP; tal vez puedas descifrar el algoritmo.
fuente
wordwrap()
, que a su vez utiliza el algoritmo codicioso (es decir, no "uniformemente") para envolver. Incluso entonces, la pregunta sigue siendo cómo "adivinar" el$width
argumento dewordwrap()
. Pero gracias por la respuesta, de todos modos!