Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/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
Algorithm 的士及的士;子序列_Algorithm - Fatal编程技术网

Algorithm 的士及的士;子序列

Algorithm 的士及的士;子序列,algorithm,Algorithm,我们有两套,A和B。每一套都包括字符串。 例如:A-{“abwcd”、“dwas”、“www”}和B-{“opqr”、“tops”、“ibmd”} 如何计算集合A中所有字符串中出现的子序列,但集合B中没有一个字符串出现的子序列?对于上面的例子,答案是1(子序列“w”) 所有这些都以最佳方式进行。我考虑过使用两次尝试,第一次我将B中所有字符串的所有子序列放在trie t_B中,然后,我开始将A中所有字符串的所有子序列放在trie t_A中,如果之前在同一字符串中发现了相同的子序列,则不更新trie

我们有两套,A和B。每一套都包括字符串。 例如:A-{“abwcd”、“dwas”、“www”}和B-{“opqr”、“tops”、“ibmd”} 如何计算集合A中所有字符串中出现的子序列,但集合B中没有一个字符串出现的子序列?对于上面的例子,答案是1(子序列“w”)

所有这些都以最佳方式进行。我考虑过使用两次尝试,第一次我将B中所有字符串的所有子序列放在trie t_B中,然后,我开始将A中所有字符串的所有子序列放在trie t_A中,如果之前在同一字符串中发现了相同的子序列,则不更新trie(例如:如果我有字符串“aba”,则不计算子序列“A”两次)。这样,如果我发现一个子序列在t_a中出现n个(a的大小),我检查它是否在t_B中,如果不是,我计算它。但这是非常缓慢的,如果A和B的大小为15,字符串长度约为100个字符,我的程序运行时间超过1秒


编辑:由于任何子序列都以字符串的最后一个字符或其前面的一个字符结尾,因此我们不必生成所有子序列,而是生成以字符串的最后一个字符结尾的子序列。当我将它们推入trie时,我注意到每个节点都有1。因此,如果我有字符串“abcd”,我只会按“abcd”、“bcd”、“cd”和“d”,因为这应该是trie的“骨架”。但这不是一个很大的优化,我仍然在寻找更好的方法。

您不应该将a中所有字符串的所有子序列都放入trie中。 只输入有效的。在添加序列之前测试序列是否有效。我假设会员资格测试比添加新项目更快。较小的trie会更快地通过成员资格测试,因此此策略旨在尽可能快地缩减trie

具体而言: 将A中第一个字符串的所有子序列放入trie。(为了提高效率,请使用最短的字符串作为第一个字符串)。保留对所有叶节点的一组引用。 接下来,对于B中的所有字符串,测试每个子序列以查看它是否存在于A中。如果存在,则删除该序列及其引用。(从B中最长的字符串开始,以尽可能快地修剪trie)

现在您有了测试的最小可能性集。 对于中的所有剩余字符串,测试每个子序列以查看它是否存在于trie中。如果有效,则将节点标记为有效,否则移动到下一个子序列。
在每个字符串之后,从trie中删除所有无效节点,并将其余节点上的标志重置为无效。

我并不奇怪您的解决方案有点慢,您描述的算法的运行时间为n^2。经常遇到这样的问题,动态规划是一种很好的方法。但是从算法的角度来看,子序列问题是出了名的困难,所以n^2可能是你能期望的最好的。是的,n^2是我能想到的最好的,然后我考虑了一个优化,因为任何子序列都以字符串的最后一个字符或之前的一个字符结尾,所以现在我不生成所有的子序列,但是那些以字符串的最后一个字符结尾的节点,当我把它们放入trie时,我注意到每个节点都是新的,如果它已经存在,则增加它。因此,如果我有字符串“abcd”,我只会按“abcd”、“bcd”、“cd”和“d”,因为这应该是trie的“骨架”。但这不是一个很大的优化,我仍然在寻找更好的方法。我认为最好调用那些子字符串而不是子序列。子序列是唯一一个可以通过删除某些元素而不改变其余元素顺序的方式从另一个序列派生出来的序列。