【问题标题】:Break text evenly into certain number of lines将文本均匀地分成一定数量的行
【发布时间】:2012-03-01 12:03:52
【问题描述】:

有一种线性时间算法(或 Knuth & Plass 的二次时间算法)可以将文本均匀地分成最大宽度的行。它使用 SMAWK,“均匀”表示:
http://en.wikipedia.org/wiki/Word_wrap#Minimum_raggedness

上述算法是否有算法或凹成本函数会考虑我希望文本插入的行数,而不是最大行宽?

换句话说,我正在寻找一种换行(或段落形成,或换行)算法,其中输入是所需的行数,而不是所需的行宽。

仅描述一种实际上无法使用的方法:每个单词对之间有 N 个单词和 N-1 个空格,M 是所需的行数(M

【问题讨论】:

  • 你能解释一下“衣衫褴褛”吗?你如何决定哪个结果比另一个更好?如果没有评估 - 您可以只返回随机插入的换行符,但我认为情况并非如此。
  • 文本是左对齐的——也就是说,右边可能有剩余的空白,我们称之为浪费。换句话说,浪费是最大(最佳、期望的)线宽和实际线宽之间的差异。现在我们计算浪费的平方根,所以我们惩罚真正错误的,把所有的浪费平方加起来,这就是“不规则”。我们只是尽量避免间隙,即我们希望线条具有尽可能相似的宽度。顺便说一句,这一切都在上面的维基百科链接中。

标签: algorithm computer-science line-breaks


【解决方案1】:

通过将最大长度计算为字符串的总长度除以所需的行数,您可以简单地将实现给定行数的问题简化为在最大长度后断开行的问题。由于在许多情况下,行的实际长度会小于最大长度,因此您可能需要从所需的行数中减去 1。

【讨论】:

  • 问题是这样的方法保证不会有比商少的行,即它可能会发生比商更多的行。例如:我想要 6 行,文本是 a aaaaaa aaaaa aaaaaaaaa aaaaa aaaaaaaaaaa aaaaaaa aa a a a a a aaaaaa aaaaaa aaaaaaa aaaaaaa,但它创建了 8 行。
  • 是的,因此我建议减去 1。除非你的行很短(或很长的单词),否则你在实践中可能没问题。
  • 我的意思是,减法似乎相当随意:它不适用于 3 行和aaaaa aaaaa aaaaaaaaa aaaaaaaaa aaaaaaaaa a a aaaa aaaaaaaaa aaa aaaaaa
  • 我同意;这是一种启发式方法,您可能需要针对您的特定目的进行调整。
猜你喜欢
  • 2012-04-10
  • 2012-04-11
  • 1970-01-01
  • 2018-01-13
  • 2020-09-07
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 2012-07-02
相关资源
最近更新 更多