文本分组算法

时间:2012-03-14 19:31:26

标签: javascript algorithm coffeescript dynamic-programming

给定任意文本字符串,任务是将文本分组到模板的单独部分。每个部分具有不同的最小长度和最大长度参数。只要一个部分落在这些边界内,就可以认为该部分是最佳的。贪婪的解决方案可能会导致某些部分达不到最低要求,这意味着整个解决方案是不可接受的。

我无法有效地构建算法来执行此操作。似乎动态编程方法可能有所帮助,但到目前为止,我还没有能够用动态编程术语来解决它。有没有人有解决这个问题的线索?

function groupText(str, template)
Inputs:
 str: a string of text
 template: array of JavaScript objects. 
           One object per section that describes the min/max amount of text allowed
Output:
 array: each element corresponds to one section. 
        The value of the element is the text that is in the section.

例如,让我们定义一个等于“This is a test”的字符串str。我们还有一个模板 t t 由几个部分组成。每个 s 部分都允许使用最小和最大字符数。让我们说这个例子只有两个部分: s1 s2 s1 至少包含1个字符,最多100个字符。 s2 至少包含10个字符,最多为15个字符。我们传递字符串 str 和我们的模板 t 到函数 groupText groupText 必须返回一个数组,每个元素 i 对应一个部分。例如,元素0将对应于 s1 。元素的值将是已分配给该部分的文本。

在此示例中,解决方案可能是。

s1text =“这个”

s2text =“是一个测试。”

2 个答案:

答案 0 :(得分:2)

如果我正确地理解了问题,则不需要任何搜索......只需从总长度中减去最小长度的总和,剩下的就是要分配的数量。然后将此金额分配给每个元素,直至其最大值,直到代码

为止
var minsum = 0;
for (vsr i=0; i < sections.length; i++)
    minsum += sections[i].min_size;
var extra = text.length - minsum;
if (extra < 0) return null; // no solution
var solution = [];
for (var i=0; i < sections.length; i++)
{
    var x = sections[i].min_size + extra;
    if (x > sections[i].max_size)
        x = sections[i].max_size;
    solution.push(x);
    extra -= x - sections[i].min_size;
}
if (extra > 0) return null; // no solution
return solution;

答案 1 :(得分:0)

好的,所以这是一个特殊的,未经测试的算法。如果没有好处,或许可以让别人找到更好的答案;

我们有一些试验数据。假设您的模板包含6个部分,其最小,最大限制为:

1 - 12
13 - 25
5 - 7
6 - 7
5 - 5
10 - 25

这意味着您将需要一个至少40个字符,最多81个字符的字符串来满足您的约束。其中就是解决方案。首先,计算一个这样的表:

40 - 81
39 - 69
26 - 34
21 - 37
15 - 30
10 - 25

其中每一行都给出了仍然可以在模板中的“插槽”之间进行分区的字符串总长度。在插槽1中放置文本,使剩余的插槽剩余39到69个字符。在插槽2中放置文本,使您仍然有26到34个字符。等等。