Il existe un algorithme de temps linéaire pour diviser le texte uniformément en lignes de largeur maximale. Il utilise SMAWK (ou Knuth & Plass) et signifie "uniformément": http://en.wikipedia.org/wiki/Word_wrap#Minimum_raggedness
Existe-t-il un algorithme ou une fonction de coût concave pour l'algorithme ci-dessus qui prendrait en compte le nombre de lignes dans lesquelles je souhaiterais que le texte pénètre, au lieu de la largeur de ligne maximale? Toujours en temps linéaire?
En d'autres termes, je recherche un algorithme de coupure de ligne (ou de formation de paragraphe ou d'habillage de mot) où l'entrée est le nombre de lignes souhaité, pas la largeur de ligne souhaitée.
Juste pour décrire une approche pratiquement inutilisable: il y a N mots et N-1 espaces entre chaque paire de mots, M est le nombre de lignes souhaité (M <= N). Après chaque espace, il peut y avoir au plus un (éventuellement zéro) saut de ligne. Maintenant, l'algorithme essaierait de placer les ruptures dans chaque combinaison possible, en calculant le "raggedness" et en retournant la meilleure. Comment le faire beaucoup plus rapidement?
De plus, un tel problème a-t-il un nom? À quelle «famille» de problèmes appartient-elle? (Par exemple "bin bin") Si je n'avais pas besoin de la solution parfaitement optimale, juste une très bonne, est-il possible de la résoudre beaucoup plus rapidement? (une certaine forme d'heuristique pourrait être utilisable si, pour une entrée donnée, il y avait toujours la même solution, éventuellement sous-optimale).
Mise à jour
Chandra Chekuri a suggéré ci-dessous "un problème dans le chapitre de Kleinberg et Tardos sur la programmation dynamique". C'était une bonne lecture, mais elle traite du saut de ligne en fonction de la largeur plutôt que du nombre de lignes. Il pourrait être adaptable à ce problème, ce que j'essaie de comprendre maintenant. Voici un bon lien vers la solution, ils prétendent même la résoudre en temps linéaire: http://web.media.mit.edu/~dlanman/courses/cs157/HW5.pdf
En outre, il y a un chapitre "8.5 Le problème de partition" dans le manuel de conception d'algorithmes de Skiena qui semble être exactement sur le sujet, je le lis toujours, dur. (Malheureusement, d'après ce que j'ai compris, il a une complexité temporelle quadratique)
la source
Réponses:
la source
Je ne sais pas si cela aide, mais vers la fin de ce commentaire, quelqu'un implémente ce que vous voulez en PHP; vous pouvez peut-être comprendre l'algorithme.
la source
wordwrap()
, qui à son tour utilise l'algorithme gourmand (c'est-à-dire pas "uniformément") pour l'emballage. Même alors, la question reste de savoir comment "deviner" l'$width
argument dewordwrap()
. Mais merci pour la réponse, de toute façon!