【问题标题】:Text Grouping Algorithm文本分组算法
【发布时间】:2012-03-14 19:31:26
【问题描述】:

给定任意文本字符串,任务是将文本分组到模板的不同部分。每个部分都有不同的最小长度和最大长度参数。只要解决方案在这些范围内,就可以认为该解决方案对于某个部分是最佳的。贪婪的解决方案可能会导致某些部分未达到其最小值,这意味着整个解决方案是不可接受的。

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

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.

例如,让我们定义一个字符串 str,它等于“这是一个测试”。我们还有一个模板tt 由几个部分组成。每个部分 s 都有允许的最小和最大字符数。假设这个例子只有两个部分:s1s2s1 最少 1 个字符,最多 100 个字符。s2 最少 10 个字符,最多 15 个字符。我们传递我们的字符串 str em> 和我们的模板 t 到一个函数 groupTextgroupText 必须返回一个数组,每个元素 i 对应一个部分。例如,元素 0 将对应于 s1。元素的值将是已分配给该部分的文本。

在这个例子中,一个解决方案可能是。

s1text = "这个"

s2text = "是一个测试。"

【问题讨论】:

  • 您想要做的一个示例将帮助我们更好地理解您的问题。尤其是输入和期望输出的示例。
  • 这听起来像是一个线性规划问题。
  • @HighPerformanceMark - 我添加了一个示例。让我知道这是否有帮助。感谢您的反馈。
  • 这不是一个例子,它是对原始问题的一种伪代码重述。
  • @mdkess - 感谢您的提示。我对线性规划不太熟悉,但我会拿出我的 CLRS 副本,看看我能找到什么。

标签: javascript algorithm coffeescript dynamic-programming


【解决方案1】:

如果我正确理解了问题,则无需进行任何搜索...只需从总长度中减去最小长度的总和,剩下的就是要分配的数量。然后将这个数量分配给每个元素直到它的最大值,直到什么都没有留下......在代码中

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;

【讨论】:

    【解决方案2】:

    好的,这是一个临时的、未经测试的算法。如果它不好,也许它足以促使其他人得到更好的答案;

    让我们有一些试验数据。假设您的模板包含 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 个字符。以此类推。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-23
      • 2011-04-22
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      相关资源
      最近更新 更多