2012-03-01 6 views
2

Существует линейный алгоритм времени (или алгоритм квадратного времени от Knuth & Plass) для равномерного разбиения текста на линии максимальной ширины. Он использует SMAWK и «равномерно» означает:
http://en.wikipedia.org/wiki/Word_wrap#Minimum_raggednessРазбить текст равномерно на определенное количество строк

Есть ли алгоритм или вогнутая функция затрат для алгоритма, выше которого будет принимать во внимание количество строк, я хотел бы текст перерыва в, вместо максимальной линии ширина?

Другими словами, я ищу алгоритм прерывания строки (или формирования абзаца или словосочетания), где ввод - это необходимое количество строк, а не желаемая ширина линии.

Просто для описания практически непригодного подхода: между каждой парой слов имеется N слов и пробелов N-1, M - искомое количество строк (M < = N). После каждого пробела может быть не более одного (возможно, нулевого) разрыва строки. Теперь алгоритм попытается поместить разрывы в каждую возможную комбинацию, вычисляя «оборванность» и возвращая лучшую. Как это сделать намного быстрее?

+0

Можете ли вы объяснить о «рваной»? Как вы решаете, какой результат лучше, чем другой? Без оценки - вы могли бы просто вернуть случайную вставку разрывов строк, но я предполагаю, что это не так. – amit

+0

Текст выровнен по левому краю - то есть, вероятно, слева пробел справа, назовем его пустой. Другими словами, отходы представляют собой разницу между максимальной (оптимальной, желаемой) шириной линии и фактической шириной линии. Теперь мы вычисляем квадратный корень отходов, поэтому мы наказываем действительно неправильные, суммируем все квадраты отходов вместе, и это «оборванность». Мы просто стараемся избегать пробелов, т. Е. Мы хотим, чтобы линии имели как можно более широкую ширину. Кстати, это все в ссылке Википедии выше. –

ответ

0

Вы могли бы просто уменьшить проблему достижения заданного числа строк к проблеме разрыва линий после максимальной длины, вычислив максимальную длину как общую длину строки, деленную на количество нужных строк. Поскольку во многих случаях фактическая длина линии будет меньше максимальной длины, вам, вероятно, потребуется вычесть 1 из числа требуемых строк.

+0

Проблема заключается в том, что такой подход гарантирует, что не будет меньше строк, что фактор, т. Е. Может случиться, будет несколько больше. Например: я хочу 6 строк, а текст «aaaaaa aaaaa aaaaaaaaa aaaaa aaaaaaaaaaa aaaaaaa aa a a a a aaaaaa aaaaaa aaaaaaa aaaaaaa», но он создает 8 линий. –

+0

Да, поэтому мое предложение вычесть 1. Если у вас не очень короткие строки (или очень длинные слова), вы, вероятно, будете на практике. –

+0

Моя точка зрения заключается в том, что вычитание представляется довольно произвольным: оно не работает на 3 строки и 'aaaaa aaaaa aaaaaaaaa aaaaaaaaa aaaaaaaaa a a aaaa aaaaaaaaa aaa aaaaaa' –

Смежные вопросы