【问题标题】:Find the smallest set of connected substrings找到最小的连接子串集
【发布时间】:2013-05-22 16:22:22
【问题描述】:

让我们考虑一个查询集 Q 和一个更大的超集 S。Q 的每个元素都存在于 S 中。目标是使用 S 的(连接的)“组件”的最少数量来表示 Q。

这是一个具体的例子: Q={我爱法国和葡萄酒} S={(我住在这里),(我爱你和她),(法国很美),(奶酪和酒)}

Q 的解决方案可能: - “我”来自“我住在这里” - “爱”来自“我爱你和她” ——“法国很美”中的“法国” - “和”来自“我爱你和她” - 来自“奶酪和葡萄酒”的“葡萄酒” 这产生了 5 个“成分”,即“I”、“love”、“France”、“and”、“wine”

更好的解决方案是: -“我爱你和她”中的“我爱” ——“法国很美”中的“法国” -“奶酪和酒”中的“和酒” 这导致了 3 个“组件”,即“我爱”、“法国”、“和葡萄酒” 这可能是此示例的最佳解决方案。我们希望尽量减少“组件”的数量。

有没有人知道这种算法是怎么调用的? 我在文本解析、文本挖掘等方面进行了搜索,但没有找到合适的。

【问题讨论】:

  • 如果 Q=(a b a) 和 S={(a), (b)},唯一解是有两个还是三个分量?
  • Q和S的元素是集合,还是序列?

标签: string algorithm set


【解决方案1】:

您所描述的内容听起来像 set cover problem,其中您有一个主集(在您的情况下为查询)和一系列集(您的组件)可供选择,目标是涵盖主人集。这个问题已经得到很好的研究,但不幸的是它是 NP-hard 并且没有已知的多项式时间算法。此外,集合覆盖的最佳多项式时间逼近算法在最坏情况下只能达到真解的 O(log n) 倍。

如果您正在处理小查询或少量组件,您可以通过列出所有子集并检查哪些子集有效来强制回答。但是,对于大型查询或大量组件,您不应期望有效地获得准确的答案。

希望这会有所帮助!

【讨论】:

  • 它不完全是经典的集合覆盖,因为这相当于找到 S 的子集。OP 所需的解决方案不是这样的子集。
  • @larsmans- 我不确定我是否理解您的评论。你能详细说明一下吗?
  • 对于集合覆盖,解决方案的元素必须是 S 的元素,但 OP 想要 S 的元素的子集。此外,宇宙应该是 S 的并集,所以应该是 {I住在这里爱你和她的法国是美丽的奶酪酒}。
  • @larsmans- 也许我弄错了,但是如果你从每个组件中过滤掉所有不在原句中的单词,这不是减少了原始问题吗?跨度>
  • 是的,我想是的,假设 OP 实际上处理的是集合而不是字符串/序列(参见另一个答案)。
【解决方案2】:

我会将这个问题描述为“最小间隔覆盖”;我不确定这是规范名称,但我不是第一个使用该短语的人。

有一种有效的算法,它有两个阶段。在第一阶段,确定出现在源中的查询的最大子字符串。对于每个这样的子字符串,输出第二阶段的间隔。在第二阶段,通过重复选择覆盖最低未覆盖位置的最高端点的区间来找到最小基数覆盖。

在你的例子中

Q=(I love France and wine)
S={(I live here), (I love you and her), (France is beautiful), (cheese and wine)}

间隔是,从一开始索引,(1, 2)“我爱”,(3, 3)“法国”,(4, 5)“和葡萄酒”。哎呀,现在第二阶段是微不足道的。假设改为

Q=(a b c d)
S={(a b), (b c), (c d)}

那么间隔是 (1, 2) "a b", (2, 3) "b c", (3, 4) "c d"。未覆盖的最低值为 1;我们取 (1, 2)。未覆盖的最低值为 3;我们取 (3, 4) 超过 (2, 3) 因为 4 > 3。

编辑添加:

瓶颈很可能是第一阶段。如果这是一个问题,那么有一个算法:构造一个包含源语句的suffix tree。然后,根据查询字符串遍历树。除非查询逐字出现在源代码中,否则您最终会尝试使用不存在的链接;在这种情况下,当前最大间隔结束,您需要按照后缀链接,直到您可以再次取得进展。 (计算生物学家,我描述的是哪种算法?)

【讨论】:

    猜你喜欢
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多