Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 查找最小的连接子字符串集 让我们考虑一个查询集Q和一个较大的超集S。Q中的每个元素都存在于S.中。目标是用S/< P>的最小数量的(连接的)“分量”来表示Q。_String_Algorithm_Set - Fatal编程技术网

String 查找最小的连接子字符串集 让我们考虑一个查询集Q和一个较大的超集S。Q中的每个元素都存在于S.中。目标是用S/< P>的最小数量的(连接的)“分量”来表示Q。

String 查找最小的连接子字符串集 让我们考虑一个查询集Q和一个较大的超集S。Q中的每个元素都存在于S.中。目标是用S/< P>的最小数量的(连接的)“分量”来表示Q。,string,algorithm,set,String,Algorithm,Set,以下是一个具体的例子: Q={我爱法国和葡萄酒} S={(我住在这里),(我爱你和她),(法国很美丽),(奶酪和葡萄酒)} Q的解决方案可能是: -“我”来自“我住在这里” -“爱”来自“我爱你和她” -“法国”来自“法国是美丽的” -还有“我爱你和她” -“奶酪和葡萄酒”中的“葡萄酒” 这就产生了5个“成分”,即“我”、“爱”、“法国”、“葡萄酒” 更好的解决方案是: -“我爱”来自“我爱你和她” -“法国”来自“法国是美丽的” -“奶酪和葡萄酒”中的“和葡萄酒” 这导致了3个“成分”,即“我

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

Q的解决方案可能是: -“我”来自“我住在这里” -“爱”来自“我爱你和她” -“法国”来自“法国是美丽的” -还有“我爱你和她” -“奶酪和葡萄酒”中的“葡萄酒” 这就产生了5个“成分”,即“我”、“爱”、“法国”、“葡萄酒”

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

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

您所描述的内容听起来像,您有一个主集合(在您的例子中是查询)和一系列集合(您的组件)可供选择,目标是覆盖主集合的每个元素。这个问题已经得到了很好的研究,但不幸的是,它是NP难的,并且没有已知的多项式时间算法。此外,在最坏的情况下,集覆盖的最佳多项式时间近似算法仅在真解的因子O(logn)以内

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


希望这有帮助

我将这个问题描述为“最小间隔覆盖”;我不确定这是不是一个标准的名字,但我不是第一个使用这个短语的人

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

在你的例子中

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)“ab”,“2,3”bc”,“3,4”cd“。最低覆盖率为1;我们采取(1,2)。最低覆盖率为3;我们接受(3,4)而不是(2,3),因为4>3

编辑以添加:


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

这不完全是经典的集合覆盖,因为这等于找到了s的子集。OP的所需解不是这样的子集。@larsmans-我不确定我是否理解你的评论。你能详细说明一下吗?对于集合封面,解决方案的元素必须是S元素,但OP需要S元素的子集。而且,宇宙应该是S的联合体,所以应该是{我住在这里,爱你,她的法国是美丽的奶酪酒。@larsmans-也许我错了,但是如果你过滤掉所有不在原始句子中的单词,这不就是原始问题吗?是的,我想是这样,假设OP实际上处理的是集合而不是字符串/序列(参见另一个答案)。如果Q=(a b a)和S={(a),(b)},唯一解有两个或三个分量吗?是Q和S集合的元素,还是序列?