将文本均匀分成几行


12

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

是否有一种算法或该算法的凹成本函数可以在其中考虑我希望文本插入的行数,而不是最大行宽?也是线性时间?

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

仅描述一种实际上不可用的方法:每个单词对之间有N个单词和N-1个空格,M是所需的行数(M <= N)。每个空格之后最多可能有一个(可能为零)换行符。现在,该算法将尝试将中断放置在每个可能的组合中,计算“参差不齐”并返回最佳组合。如何更快地做到呢?

另外,这样的问题有名字吗?问题属于什么“家庭”?(例如“装箱”)如果我不需要一个完美的最佳解决方案,那只是一个非常好的解决方案,是否可以更快地解决呢?(如果对于给定的输入总是有相同的,可能不是最优的解决方案,则可以使用某种形式的试探法)。

更新资料

钱德拉·切库里(Chandra Chekuri)提出了“在动态编程的Kleinberg和Tardos一章中的一个问题”。这是一本不错的书,但它基于宽度而不是行数来处理换行。我现在正在尝试解决这个问题,它可能适用于此问题。这是解决方案的一个很好的链接,他们甚至声称可以在线性时间内解决它:http : //web.media.mit.edu/~dlanman/courses/cs157/HW5.pdf

而且,Skiena的《算法设计手册》中有一章“ 8.5分区问题”,这似乎正好是主题,我仍然很难读。(不幸的是,据我了解,它具有二次时间复杂度)


5
不错的动态编程问题!下学期我可能会把它作为家庭作业。
Jeffε

3
@Jɛff E如果您想将其用于作业问题,最好在答案发布到网络上之前关闭该问题。

1
@Joe:作为对答案真正感兴趣的人,我宁愿回答问题,而不是封闭问题。
Ecir Hana

2
@乔:这不是功课,我什至不学习CS。所谓“作业级别”,我发现非常有趣的是,有些人甚至无法想象如何解决问题,而其他人则将其视为“作业级别”。就是说,答案可能会在一周内被删除或例如发送到我的电子邮件中。我也很感谢没有这么“完整的答案”。
Ecir Hana

3
在Kleinberg和Tardos关于动态编程的章节中存在一个问题,该问题的格式应为使行中的松弛量之和最小。
Chandra Chekuri 2012年

Answers:


4

MO(NlogU)UN2O(logMloglogN)M=Ω(logN)

MM


非常抱歉,但我不认为我会遵循。“边缘重量”是一个单词的长度吗?“图形”看起来如何?它只是一个线性图,其中节点是断点,边是单词的长度?而这个“ M链接路径”将其分解,从而使最终的片段具有最小的边总和?但最重要的是,在第一句话中-我不确定是否可以独立计算衣衫ness。最长的线和实际的线之间大约有差异,因此我需要了解其他线,不是吗?有关最后一行的更多信息,请参见上面的第15条评论。
Ecir Hana'3

M1N+1(i,j)ij1

@Ecir:本质上,所有基于动态编程的算法都要求您可以独立计算线的参差不齐。如果不是这种情况,您可能想使用类似我的第二个想法的方法:猜测线宽,根据该宽度计算解决方案,然后迭代以找到更好的解决方案。
朱尼·瑟伦(JuuniSirén)2012年

谢谢你的解释。请再问两个问题:使用“二进制搜索”选项时,我可以做些什么来保证行数M?如果我在每条线宽上添加较小的随机epsilon,这样就不会有相同宽度的线,那么我可以在中断处获得更高的分辨率。
Ecir Hana'3

并且在“ M链接路径”的情况下,两篇论文都提到“很容易证明最小的K链接路径可以在O(nK)时间内计算出来” –您也许知道它们的含义吗?我找不到任何进一步的信息。问题是,这些文件对于我的小脑袋来说有点太复杂了,所以我试图寻找更多的信息,也许是一种实现,...
Ecir Hana 2012年

-3

我不知道这是否有帮助,但是在本评论的结尾,有人在PHP中实现了您想要的功能。也许您可以找出算法。


4
在注释中,他们只是在希望的行数之后截断了其余的行。他们使用PHP的PHP wordwrap(),后者又使用贪婪(即没有“均匀”)算法进行包装。即使这样,问题仍然在于如何“猜测”的$width论点wordwrap()。但是无论如何,感谢您的答复!
Ecir Hana'3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.