鉴于字符串列表,查找每对$(x,y)$ why $ x $是$ y $的子序列。可以做得好比$ O(n ^ 2)$做好?

cs.stackexchange https://cs.stackexchange.com/questions/121670

考虑以下算法问题:给定字符串 $ l= [s_1,s_2,\ dots,s_n] $ ,我们想知道所有对<跨越类=“math-container”> $(x,y)$ 其中 $ x $ $ y $ 。我们可以假设所有字符串在最大值 $ m $ ,其中 $ m << n $ 和全部通过有限的字母 $ \ sigma $ ,其中 $ | \ sigma | << $ 。我们也可能假设对 $(x,y)$ 其中 $ x $ 是一个 $ y $ 的子序列远小于 $ n $

琐碎的算法是:

1. foreach x in L:
2.   foreach y in L:
3.      if x is subsequence of y:
4.         OUTPUT x,y
. 但是,这具有复杂性 $ o(n ^ 2 \ cdot m)$ - 我很想知道是否有更快的算法(给出的速度更快对 $(x,y)$ 远小于 $ n $ ,因此复杂性的算法根据输出对的数量)。

请注意,此问题是关注这个问题,这大概是同一个问题,但是对于子字符串(不是随后)。在那里,AHO-corasick算法完美解决了我的问题 - 也许是这样的,但是对于子序列来说是这样的,而是为了术语?

有帮助吗?

解决方案

否,除非强大的指数时间假设(SETH)失败,否则不可能做得更好。如果我们可以在 $ O(n ^ 2)$ 我们将立即获得更快的算法,以解决NP完全解决问题的最佳算法。即使对于 $ m $ 略高于 $ \ log(n)$ 和案例,也是如此我们想要决定这种对 $(x,y)$ 存在。

参见,例如,这些讲义笔记在第3节“紧正交向量下限“。证据类似于这些讲义中的定理2的证明。

首先,我们考虑给定的两组字符串 $ x,y $ ,查找是否在 $ x $ $ y $ 中的字符串的子序列。

给定SAT公式,将其 $ n $ 变量分成两个相等的 $ n / 2 $ < / span>变量。在 $ \ sigma $ 中,我们采取与每个子句相对应的字符。在 $ x $ 中,我们将每个可能的分配添加到变量的前半部分的字符串,其中一个字符对应于每个子句不满意由那些变量。同时,在 $ y $ 中,我们将每个分配的字符串添加到变量的后半部分,每个子句都有一个满足这些变量的字符。显然,如果 $ x $ 中的某些字符串,则该公式是满意的

如果此问题可以基本上可以求速度快,而不是 $ o(n ^ 2)$ ,那么这为比 $ 2 ^ n $ 。假设问题可以在 $ o(n ^ {1.99})中解决问题,然后在 $中可以解决满足性(2 ^ {n / 2})^ {1.99}= o(2 ^ {0.996n})$ 与seth相矛盾。

在你的问题中,只有一组字符串,所有这些都可以是彼此的子序列。然而,这不是问题,因为我们可以简单地修改我们的实例中的字符串,使得没有字符串 $ y $ 是任何其他字符串的子序列(例如通过填充 $ y $ 的所有字符串都具有相同的长度),并类似地填充 $ x $ 中的每个字符串与 $ x $ (但在 $ y $ 中的字符串大致短的相同长度。

这也可能用恒定大小(可能偶数二进制)字母表来完成,但这需要更聪明的编码。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top