Es gibt einen linearen Zeitalgorithmus zum gleichmäßigen Aufteilen von Text in Zeilen maximaler Breite. Es verwendet SMAWK (oder Knuth & Plass) und bedeutet "gleichmäßig": http://en.wikipedia.org/wiki/Word_wrap#Minimum_raggedness
Gibt es einen Algorithmus oder eine Konkavkostenfunktion für den obigen Algorithmus, die anstelle der maximalen Zeilenbreite die Anzahl der Zeilen berücksichtigt, in die der Text eingebrochen werden soll? Auch in linearer Zeit?
Mit anderen Worten, ich suche nach einem Algorithmus zum Brechen von Zeilen (oder zum Bilden von Absätzen oder zum Umbrechen von Wörtern), bei dem die Eingabe die gewünschte Anzahl von Zeilen und nicht die gewünschte Linienbreite ist.
Nur um einen praktisch unbrauchbaren Ansatz zu beschreiben: Es gibt N Wörter und N-1 Leerzeichen zwischen jedem Wortpaar, M ist die gewünschte Anzahl von Zeilen (M <= N). Nach jedem Leerzeichen darf es höchstens einen (möglicherweise null) Zeilenumbruch geben. Nun würde der Algorithmus versuchen, die Pausen in jede mögliche Kombination zu setzen, die "Unregelmäßigkeit" zu berechnen und die beste zurückzugeben. Wie geht das viel schneller?
Hat ein solches Problem auch einen Namen? Zu welcher "Familie" von Problemen gehört es? (ZB "Mülleimer packen") Wenn ich nicht die perfekt optimale Lösung brauche, nur eine sehr gute, ist es möglich, sie viel schneller zu lösen? (Eine Art von Heuristik könnte verwendet werden, wenn es für eine bestimmte Eingabe immer die gleiche, möglicherweise nicht optimale Lösung gäbe.)
Aktualisieren
Chandra Chekuri schlug unten "ein Problem in Kleinberg und Tardos Kapitel über dynamische Programmierung" vor. Es war eine gute Lektüre, befasst sich aber mit Zeilenumbrüchen basierend auf der Breite und nicht der Zeilenanzahl. Es könnte an dieses Problem anpassbar sein, was ich jetzt herauszufinden versuche. Hier ist ein guter Link zu der Lösung, sie behauptet sogar, sie in linearer Zeit zu lösen: http://web.media.mit.edu/~dlanman/courses/cs157/HW5.pdf
Außerdem gibt es ein Kapitel "8.5 Das Partitionsproblem" im Algorithm Design Manual von Skiena, das genau zum Thema zu gehören scheint. Ich lese es immer noch. (Leider hat es nach meinem Verständnis eine quadratische zeitliche Komplexität.)
quelle
Antworten:
quelle
Ich weiß nicht, ob das hilft, aber gegen Ende dieses Kommentars implementiert jemand, was Sie in PHP wollen. Vielleicht können Sie den Algorithmus herausfinden.
quelle
wordwrap()
, die wiederum den gierigen (dh keinen "gleichmäßigen") Algorithmus für das Wrapping verwenden. Auch dann bleibt die Frage, wie das$width
Argument von "erraten" werden kannwordwrap()
. Aber trotzdem danke für die Antwort!