我有一个任意长度的字符串数组(比如30-45),我想重新格式化以适应一定数量的页面(比方说15)。
我希望尽可能均匀地在页面之间分配字符串,以便所有页面尽可能接近彼此的总字符长度,而不管每页的字符串总数。我还需要保留字符串顺序(所以我不能重新排列数组)。
您是否建议使用任何特定算法来解决此问题?或者你采取的模糊方法?谢谢!
答案 0 :(得分:2)
一种方法是使用http://en.wikipedia.org/wiki/TeX格式化文本 - 它的断行算法是最佳的,并且基于动态编程。不幸的是,它的分页算法不是最佳的,尽管我认为它很容易找到。
如果您可以将每个页面建模为具有固定数量字符的空间,那么确实存在动态编程解决方案。您需要找到一种方法将14个分页符放在最佳位置。从左到右工作,并在每个可能的地方进行分页处理,计算出在前一个文本中插入k-1分页符的最佳可能方式的总不均衡惩罚,终止于第k页分页的可能位置。为k = 1..14执行此操作。您可以使用之前计算的左侧信息计算出新地点的总罚款。
当你到达文本末尾时,你可以使用到目前为止的计算来计算出不均衡的惩罚,以便在左边插入14个分页符的最佳方式。如果您已将计算记录保存在左侧,则还可以确定14个分页符中最右边的位置。你可以回到那里找出第13页休息的地方,依此类推,直到你找到所有分页符的位置。
答案 1 :(得分:1)
我接近这是两个阶段,首先建立一个近似解决方案,然后改进该解决方案。
首先浏览字符串列表,然后依次将每个字符串分配给剩余空间最多的页面。您可能想要检查是否有足够的空间将最后的页面字符串重新分配到较早的页面,因此减少了所需的页面数。
其次,选择剩余空间最多和最少的页面。将一个较短的字符串与另一个较长的字符串交换为另一个字符串,这样两个页面上留下的空间就更接近了。重复(确保不要进入无限循环),直到你在所有页面上有一些合理平衡的东西。
这是一个近似的解决方案,而不是一个确切的解决方案,但它应该能够相当快地产生合理的结果。
答案 2 :(得分:0)
这不是简单到将总字符数除以总页数并添加句子,直到您接近每页的目标字符数为止?最终你会得到一个句子,如果它可以在中间打破,它将跨越页面。如果该句子的大部分符合当前页面,请将其放置,否则将其推迟到下一页。
chars_left = 0
chars_per_page = total_chars / total_pages
for i = 0 .. total_pages
chars_left += chars_per_page
while (chars_left > 0)
s = get_next_sentence
if s.length/2 > chars_left then break
page.add( s)
chars_left -= s.length
endwhile
endfor
答案 3 :(得分:0)
您可以使用该算法生成euclidian rythms。欧几里德节奏是节奏,它们在许多节拍上尽可能均匀地展开。因此,如果你有四个节拍,你想要分散超过10个位置,你会得到:
..x.x..x.x
现在,如果您有10个字符串,并且您希望将它们分散在四个页面上,则只需在每个标有x的字符串后添加分页符:
string1
string2
string3
string4
string5
string6
string7
string8
string9
string10
通过这种方式,您可以在每页中获得几乎恒定数量的字符串,并且较短的页面也可以在所有页面中均匀分布。
该算法相当简单,基于欧几里德算法计算gcd,可以在几行中实现。即使有大量的页面和元素,它也应该相当快。