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
String O(n^2)(或O(n^2lg(n))?)算法,用于计算两个'的最长公共子序列(LCS);环&x27;一串_String_Algorithm_Dynamic Programming - Fatal编程技术网

String O(n^2)(或O(n^2lg(n))?)算法,用于计算两个'的最长公共子序列(LCS);环&x27;一串

String O(n^2)(或O(n^2lg(n))?)算法,用于计算两个'的最长公共子序列(LCS);环&x27;一串,string,algorithm,dynamic-programming,String,Algorithm,Dynamic Programming,这是在今天的太平洋西北地区编程竞赛中出现的一个问题,在比赛中没有人解决它。这是问题B,完整的问题集在这里:。有一个著名的O(n^2)算法使用动态规划求解两个字符串的LCS。但是当这些弦延伸到环的时候我不知道 注意,它是子序列而不是子字符串,因此元素不需要彼此相邻 另外,它可能不是O(n^2),而是O(n^2lgn)或者可以在普通计算机上在5秒钟内给出结果的东西。您可以将第一个和第二个字符串加倍,然后使用普通方法,然后将位置环绕。搜索web,这似乎在论文的第4.3节“增量字符串比较”中有所介绍,由

这是在今天的太平洋西北地区编程竞赛中出现的一个问题,在比赛中没有人解决它。这是问题B,完整的问题集在这里:。有一个著名的O(n^2)算法使用动态规划求解两个字符串的LCS。但是当这些弦延伸到环的时候我不知道

注意,它是子序列而不是子字符串,因此元素不需要彼此相邻


另外,它可能不是O(n^2),而是O(n^2lgn)或者可以在普通计算机上在5秒钟内给出结果的东西。

您可以将第一个和第二个字符串加倍,然后使用普通方法,然后将位置环绕。

搜索web,这似乎在论文的第4.3节“增量字符串比较”中有所介绍,由Landau,Myers和Schmidt以O(ne)最好将字符串“加倍”,并应用标准的动态编程算法。问题在于,要获得最佳循环LCS,必须“从多个初始条件开始算法”。通常,仅一个初始条件(例如,在边界处将所有Lij变量设置为0)不起作用。实际上,需要的初始状态数是O(N)(它们跨越一条对角线),所以我们回到O(N^3)算法。 然而,该方法确实有一些优点,因为它可以用于为CLC设计有效的O(N^2)启发式(不是精确的,而是接近精确的)

我不知道是否存在一个真正的O(N^2),如果有人知道,我会非常感兴趣。 CLCS问题具有非常有趣的“周期性”特性:CLCS的长度为 p倍重复字符串是字符串的CLC的p倍。这可以通过采用问题的几何视图来证明

此外,这个问题还有一些额外的好处:可以证明,如果Lc(N)表示长度为N的两个随机字符串的CLCS长度的平均值,那么 |Lc(N)-CN|是O(\sqrt{N}),其中C是Chvatal-Sankoff常数。对于标准LCS的平均长度L(N),我知道的唯一速率结果是| L(N)-CN是O(sqrt(Nlog N))。有一个比较Lc(N)和L(N)的好方法,但我不知道

另一个问题:很明显,与LCS长度相反,CLCS长度不是超加的。我的意思是,CLCS(X1X2,Y1Y2)并不总是大于CLCS(X1,Y1)+CLCS(X2,Y2)(用计算机很容易找到反例)。 但平均长度Lc(N)似乎可能是超加的(Lc(N1+N2)大于Lc(N1)+Lc(N2))——尽管如果有证据我不知道。
对这个问题有一点兴趣的是,N的前几个值的值Lc(N)/N将为Chvatal-Sankoff常数提供良好的界限(比L(N)/N好得多)。

继麦克道拉的回答之后,我想指出O(N^2 lg N)Maes论文中提出的解决方案是竞赛问题的预期解决方案(检查)。Landau等人论文中的O(ne)解不适用于此问题,因为该论文针对的是编辑距离,而不是LCS。特别是,仅当编辑操作(添加、删除、替换)都具有单位(1、1、1)成本时,循环编辑距离的解决方案才适用。另一方面,LCS相当于使用(添加、删除、替换)成本(1、1、2)编辑距离。这两者并不等同;例如,考虑输入字符串“ABC”和“CXY”(对于非循环情况,同样可以构造循环反例)。两个字符串的LCS为“C”,但最小单位成本编辑是依次替换每个字符

在110行但没有复杂数据结构的情况下,Maes的解决方案朝着在竞赛环境中合理实现的高端方向发展。即使Landau等人的解决方案可以适用于处理循环LCS,但数据结构的复杂性使其在竞赛环境中不可行


最后但并非最不重要的一点是,我想指出,对于CLC确实存在一个O(n^2)解决方案,如下所述:60行,没有复杂的数据结构,只有2个数组,这个解决方案在竞赛设置中实现是非常合理的。不过,找到解决方案可能是另一回事。

我起初尝试过,但如果原始字符串重叠,那么当您将它们加倍时,LCS也会加倍。这可能会变得复杂。。。。我还尝试计算一个字符串的LCS和另一个字符串的双精度LCS,但它具有相似的特性problem@dementrock:我不明白,您能显示示例字符串吗?例如(如问题中所示),“megamind”和“mindmega”,当您简单地将其加倍时,您将得到“megamindmegamind”和“mindmegamindmega”,在这种情况下,LCS的长度为l2!(“megamindmega”)(我没有仔细计算它,但它仍然是一个反例)对于我尝试的方法,使用“metrocity”和“kryptonite”(我忘了提到字符串也可以还原,但这对算法没有多大影响)。将其中一个值加倍,例如“metrocity”和“etinotpyrk”,在这种情况下,LCS的长度大于或等于6(“etroty”),但原始LCS是“etoty”@Dani。这是一个子序列,而不是子串。所以它是B[A]CD[B]A[CD]你确定存在O(n^2)算法吗?他们说“大”箱子只有1500个字母。1500^3大约只有33亿美元,在一台速度很快的机器上不需要太长时间。。。但是O(n^3)是一种trivial@Nemo嗯