转换字符串有多困难?


117

通过将字符散布到新的字符串中,从而使每个字符串的字符保持顺序,从而形成两个字符串的混洗。例如,MISSISSIPPI是一个洗牌MISIPPSSISI。如果我将两个相同的字符串混洗,请说一个字符串平方。例如,ABCABDCDis square是因为它是ABCDand 的混洗ABCD,但是字符串ABCDDCBA不是正方形。

是否有一种快速的算法来确定字符串是方形的还是NP硬的?显而易见的动态编程方法似乎不起作用。

甚至以下特殊情况也似乎很困难:(1)每个字符最多出现四次 六次的字符串,以及(2)只有两个不同字符的字符串。 正如Per Austrin指出的那样,每个字符最多出现四次的特殊情况可以简化为2SAT。


更新: 此问题有另一种说法可以使硬度证明更容易。

考虑图G的顶点为1到n的整数。用端点之间的真实间隔来标识每个边缘。我们说,如果一个间隔适当地包含另一个,则嵌套两个G边。例如,边(1,5)和(2,3)是嵌套的,但(1,3)和(5,6)不是,而(1,5)和(2,8)不是。如果没有嵌套任何一对边,则G中的匹配是非嵌套的。 是否有一种快速的算法来确定G是否具有非嵌套的完美匹配,或者该问题是否难解决?

  • 对字符串进行改组等效于在不相交的团体(边缘之间的字符相等)中找到一个非嵌套的完美匹配。特别地,对二进制字符串进行混排等效于在两个集团的不相交联合中找到非嵌套的完美匹配。但是我什至不知道这个问题对于一般的图形来说是困难的,还是对于任何有趣的图形类来说都不容易。

  • 有一个简单的多项式时间算法可以找到完美的非交叉匹配。


更新(2013年6月24日):问题已解决! 现在有两个独立的证明,证明方串是NP完全的。

还有一个更简单的证据表明,由于Shuai Cheng Li和Ming Li在2009 ,发现非嵌套完美匹配是NP困难的。请参见“ 论2区间模式的两个开放问题 ”,理论计算机科学 410(24–25) ):2410–2423,2009年。


2
序列不只是A000984,“ 2 * n位二进制数的可能值的数量,其中一半的位为开,一半的位为关”吗?
特拉维斯·布朗

5
@Travis,除非我误会了:对于n = 4,10000111是2 * n位二进制数,其中一半的位为开,另一半为OFF,但根据定义,它不是正方形。按照这种逻辑,由于平方是生成A000984的集合的严格子集,因此二进制字母上的平方的值在整个序列的相等索引处应更低-不?
丹尼尔·阿蓬

1
观察:使用图形式主义,令2n为G中的顶点数。令G'为通过将与G的嵌套边对应的顶点之间的边相加而从G的线图获得的图。问题问G'是否具有独立的大小为n的集合。有各种类型的图,其中最大独立集可以计算多项式时间。如果我们走这条路线,问题是:G'有哪些好的性质? (更多)
伊藤刚

2
@Radu:我不认为平方和非平方的分数(以二​​进制字母计)收敛为1/3。我进行了一些蒙特卡洛模拟,这些模拟表明收敛到1/2缓慢。因此,在极限中,基本上所有偶数为0和1的二进制字符串都是正方形。这令我感到惊讶,并且可以在算法中加以利用。对于较大的字母,平方的比例似乎迅速收敛到0。
Martin Berger 2010年

8
由于在今天的博客文章中提到了这个问题,所以让我们看看我们是否对解决这个问题有新的兴趣。提出这个问题已经一年了,自那时以来,我们获得了许多新用户。我为这个问题提出了100 Rep赏金。
亚历克斯(Alex)10 Brink

Answers:


66

Michael Soltys和我已经成功证明确定字符串是否可以写为方形混洗的问题是NP完整的。即使我们的证明是针对具有9个符号的字母编写的,这甚至适用于只有不同符号的有限字母。这个问题仍然适用于较小的字母,例如只有2个符号。我们没有在每个符号仅出现6次(或更常见的是固定次数)的限制下没有考虑这个问题。所以这个问题仍然悬而未决。7926

证明使用的是 Partition 的减少量。在此处发布的时间太长了,但是可以从我们的网页上获得预印本“将字符串解混为NP -hard”:3NP

http://www.math.ucsd.edu/~sbuss/ResearchWeb/Shuffle/

http://www.cas.mcmaster.ca/~soltys/#Papers

该论文已发表在《计算机系统科学杂志》上:

http://www.sciencedirect.com/science/article/pii/S002200001300189X


11
太棒了!! (这是我的最大的慰藉,非常不平凡。)
杰夫斯(Jeffε

15
谢谢。StackExchange是此问题的来源。这是一个巨大的资源!
山姆·巴斯

9
@SamBuss一个小请求:当您引用Jeff的问题时,您仅在文本中提及Per Austrin的解决方案。如果您查看答案,那么也可以使用一种方法来生成对答案的正式引用(单击“共享”按钮,然后单击“引用”链接)。这样,您也可以为Per的答案生成适当的引用。我仅提及这一点,以便在网站上做出正式贡献的人也可以得到正式认可。谢谢 !和开裂这个问题恭喜
苏雷什Venkat

2
@SureshVenkat。感谢您的提示:这很有用。我已将此添加到论文的在线版本中。
山姆·巴斯

识别方洗牌的问题,现在已经证明是很难甚至在二元字母:sciencedirect.com/science/article/pii/S0304397519300258
a3nm

58

对于您提到的特殊情况,当每个字符最多出现四次时,可以简单地简化为2-SAT(除非我遗漏了某些东西...),如下所示:

关键点是,对于每个字符,最多(有)两种匹配字符出现的有效方法(第三个可能性是嵌套)。使用布尔值变量表示选择了两个匹配项中的哪一个。现在,对这些变量的赋值会为嵌套的每对边对(而不是同时选择这对边)对字符串iff进行有效的随机排列。通过与所涉及的两个字符相对应的变量(可能取反)的分离,可以精确地描述这种情况。


真好 相同的想法适用于每个字符最多出现六次的字符串,但是结果是5-SAT的实例。:-(
–Jeffε10年

2
这个答案是赢得赏金的最爱。
杰夫·杰夫

所以这似乎证明了NPC的问题,为什么我们需要长时间的会议和日记证明?
T ....

@Turbo迟到了很多,但是这并不能证明问题是NPC,因为2-SAT 不是 NPC。它在P.
史蒂芬Stadnicki

如果字母大小不受限制,将这种减少到2-SAT是否有效?
Mohammad Al-Turkistany

11

这是一个算法,可能有一定的正确性,尽管要证明它似乎很棘手,但我不会在上面打赌。

让我们说,如果对于每个边e,存在一个使用e且不使用e中包含或包含e的边的G(可能嵌套)完美匹配,则清除GeGee

可以很容易地测试是否清除了,以及是否没有发现弯曲的边缘。显然,这些违规边缘都不能用于G的非嵌套完美匹配,因此可以安全地将它们从考虑中删除。重复此过程,我们获得G的(唯一)清除子图,该子图具有iff G具有的非嵌套完美匹配 。GGGG

现在是信仰的飞跃,这可能是正确的,也可能是不正确的:希望是在清除的图中,如果仍然存在度数顶点 ,我们可以进行贪婪的选择并将第一个这样的顶点与其第一个邻居匹配(或等效地,删除所有其他邻居的边)。>1

经过贪婪的选择之后,我们再次清除图形,依此类推,当图形(希望是)非嵌套的完美匹配时,过程结束。

起初,我认为这有点像贪婪算法中的一个小小的先行步骤,但实际上没有用,但是我发现想出一个反例非常困难。


我对第二个贪婪阶段表示怀疑,但清除图表似乎很有用。在原始字符串上下文中,图是集团的不相交的并集,您能谈谈清除图的结构吗?它仍然是不连贯的集团联盟吗?(换句话说,是否可以对输入字符串中每个字符的出现进行分区,以使不同部分的字符无法匹配?)
Jeffε10年

2
对于第二个问题,请考虑字符串“ aaaa”。清除它会除去1-4和2-3边,产生4个循环。第二个贪婪步骤的两个变体也足够了,我找不到任何反例:1)清除的图具有非嵌套的完美匹配,前提是它具有完美的匹配(这似乎与贪婪步骤无法相比) 。2)在具有非嵌套完美匹配的清除图中,每个边都用于一些非嵌套完美匹配(这比贪婪步骤和第一项都强,因此应该更容易被证明)。
Per Austrin

11

我和Sam Buss在2012年11月提出的解决方案(表明通过减少3分区来减少NP-hard的正方形)现在在《计算机系统科学杂志》上发表了一篇文章:

http://www.sciencedirect.com/science/article/pii/S002200001300189X


2
这确实应该是对Sam Buss先前答案的修改,而不是单独的答案。您可以单击“编辑”来建议对其他人的答案进行编辑,然后您的编辑将被站点的其他用户审阅。
2013年

11

Romeo Rizzi和StéphaneVialette 通过减少最长的二进制子序列问题,证明了他们在2013年的论文《关于识别随机混排的平方的单词》中对方串的识别是NP完全的。他们指出,解组二进制字符串的复杂性仍然存在。

Shuai Cheng Li和Ming Li在2009年的论文“ 关于2区间模式的两个开放问题 ”中给出了一个更简单的证明,即找到非嵌套的完美匹配是NP完全。但是,他们使用从生物信息学继承的术语。他们称其为“ DIS-2-IP- {<,}问题” 而不是“完美的非嵌套匹配”。Blin,Fertin和Vialette描述了两个问题之间的对等关系

2-IP-解散{<,}问题已在一般图约束匹配数方面立即制剂:给定一个图G具有线性排序一起π的顶点的G,2-IP-解散{<,}问题等价于查找最大基数匹配MG与属性是,对于任何两个不同的边缘{u,v}{u,v}M既不min{π(u),π(v)}<min{π(u),π(v)}max{π(u),π(v)<max{π(u),π(v)}也不min{π(u),π(v)}<min{π(u),π(v)}max{π(u),π(v)}<max{π(u),π(v)}

更新(2019年2月25日): Bulteau和Vialette表明在他们的论文中对二进制字符串进行混洗的决策问题是NP完全的,识别二进制混洗平方是NP-hard的


我没有看到连接,也没有看到作者声称将字符串改组等同于他们的问题。
Suresh Venkat

2
他们不说这等同于改组。这是一个更普遍的问题。
Jeffε

@SureshVenkat我编辑了答案,希望它更清晰。基本上,他们在脚注中所说的是匹配()中的任何两个边都是非嵌套的。M
Mohammad Al-Turkistany

在实际发布的版本中,等效内容在第320页中进行了说明。books.google.com/…
Mohammad Al-Turkistany

进行编辑以消除埋葬
Jeffε

9

7
很好的参考。很难看出结果如何适用于我的问题,但也许这些技术会有所帮助。容易确定一个给定的字符串X是否是另一个给定字符串Y的两个副本的混洗。所附论文证明,确定给定的字符串X是否是另一个给定字符串Y 的任意数量的混洗是NP难的。我想知道给定的字符串X是否是某些未知字符串Y的两个副本的混洗。
Jeffε2010年

5

永远不要介意,这个答案很糟糕。在输入“ AABAAB”时失败:贪婪地将前两个A相互匹配使得无法匹配其余符号。我将其保留而不是删除它以帮助其他人避免犯同样的错误。

在我看来,将假定正方形的每个连续字符贪婪地匹配到另一个处于较早位置的相等字符始终是安全的。也就是说,我认为以下线性时间算法应该有效:

循环遍历输入字符串中的每个位置i,i = 0、1、2,... n。对于每个位置i,检查该位置是否已经与字符串中的某个较早位置匹配。如果不是,则将其与等号匹配,该等号位于最后一个已匹配位置之后,否则应尽早出现在字符串中。如果找不到某个字符的匹配项,则声明输入不是正方形;否则,它是每个匹配项的第一对字符集。

在Python中:

def sqrt(S):
    匹配= []
    i,j = 0,0
    而我<len(S):
        如果j <len(matches)并匹配[j] [1] == i:
            我+ = 1
            j + = 1
            继续
        如果匹配:
            k =符合[-1] [1] + 1
        其他:
            k = 1
        而k <len(S)且S [k]!= S [i]:
            k + = 1
        如果k> = len(S):
            引发Exception(“非正方形”)
        matchs.append((i,k))
        我+ = 1
    返回“” .join(S [a]中匹配的a,b)

打印sqrt(“ ABCABDCD”)

在这里,i是主循环变量(我们尝试匹配的位置),j是指向匹配对数组的指针,可加快对位置i是否已匹配的检查,k是用于搜索的索引与位置i上的字符匹配的字符。这是线性时间,因为i,j和k在字符串中单调增加,并且每个内部循环迭代都会增加其中之一。


4
到过那里。做到了。:-)
Jeffε

5

更新:当标签从1到n时,谈论找到非嵌套非交叉的完美匹配的困难是没有意义的,因为只有这样一个。(是的,正在踢自己。)但是,考虑到标签的范围更大,这是有道理的……所以我仍然看到了一些希望,但毕竟可能毫无意义。我当然必须再跟进一些。


我可以想到为什么为什么很难找到一个非嵌套非交叉的匹配。让我称这种匹配为不相交的匹配。不知道这在多大程度上有帮助,但是无论如何,让我介绍一下推理过程。(我应该指出,我的论点目前还不完整,我遗漏的细节可能至关重要。但是,我认为这可能只是个开始。)

Gk1n

kk

a1,,akk

nn1nuvai(u,v)i

kkk

为了消除颜色并使匹配完美,尽管可能范围更大但对这样创建的图形进行以下修改:

UaaUaA(A2)Ua

Ua

[1] 关于没有多项式内核的问题,Hans Bodlaender,Rodney G. Downey,Michael R. Fellows和Danny Hermelin,J。Comput 。Syst。科学


3
我糊涂了。(1,2),(3,4),(5,6),...,(n-1,n)不是唯一的完美不相交匹配吗?
杰夫斯

一旦转到“完美匹配”方案,就修改结构并添加许多新顶点(请注意,我为字母表中的每个a添加了| U_a | -2个新顶点)。因此,对于一个k大小的字母,n将相应地爆炸-大约为2n-2k。我希望我确实明确表示减少是不完全的,因为我没有指定分配给新顶点的数字,但是我希望可以轻松扩展它。但是,我当然必须三思而后行。
Neeldhara

1
我认为JeffE的评论的重点是,因为只有一种可能性,所以很容易找到不嵌套且不相交的完美匹配(或报告不相交)。
伊藤刚(Tsuyoshi Ito)2010年

2
我不是在谈论您的证明想法的内容,而是在谈论您答案的第一句话:“我能想到为什么很难找到一个非嵌套且非交叉的完美匹配。”由于JeffE编写的原因,此任务很容易。
伊藤刚(Tsuyoshi Ito)2010年

2
在没有不相交因子问题(每种颜色最多一个边缘)施加的着色约束的情况下,找到最大的不相交匹配也很容易。
杰夫斯

1

该方法不起作用:通过取出两个匹配的字母来分解混洗的正方形不会导致混洗的正方形...请参阅下面的Radu的评论。


Σ

S(XY)A(X,Y)(1)A(aX1,aX2Y1Y2)A(X1,Y1)A(X2,Y2)(2)A(ε,ε)ε(3)
aΣε

X1Y1Y1X2Y2Y1Y2X1X2

abcabdcd

S(abcabdcd)A(abc,abdcd)(by 1,X=abc,Y=abdcd)A(bc,bdcd)A(ε,ε)(by 2,X1=bc,Y1=bdcd,X2=Y2=ε)A(c,c)A(d,d)A(ε,ε)(by 2)A(ε,ε)A(ε,ε)A(d,d)A(ε,ε)(by 2)A(ε,ε)A(d,d)A(ε,ε)(by 3)A(d,d)A(ε,ε)(by 3)A(ε,ε)A(ε,ε)A(ε,ε)(by 2)3εi.e. success

0011

S(0011)A(0,011)A(ε,ε)A(1,1)A(1,1)ε

现在,Boullier在先前链接的论文中显示了一种针对RCG的动态编程多项式时间算法,该算法可以回答上述语法是否正确的问题。这个想法是,尽管我在上面介绍了变量的实例化XY


ϵ

我不这么认为。
Serge Gaspers 2010年

ϵ

感谢您的回报;我对语法进行了一些更改,甚至对它可能起作用的方法都有一点直觉。
西尔万

3
ϵ

1

更新: 正如伊藤刚(Tsuyoshi Ito)在评论中指出的那样,该算法具有指数运行时间。

原始帖子:

这是我在真实世界中如何编程的方法。

给定一个字符串S =(S [1],...,S [n])。对于每个前缀S_r =(S [1],...,S [r]),都有一组{{T_i,U_i)}对字符串,这样S_r是(T_i,U_i)的混洗, T_i是U_i的前缀(即U_i'以'T_i开头)。当且仅当该集合包含T_i = U_i的一对(T_i,U_i)时,S_r本身才是正方形。

现在,我们不需要生成所有这些对。我们只需要生成每个字符串U_i的后缀V_i,即可通过删除其副本T_i获得。这将消除(可能呈指数形式)数量不相关的重复项。现在,并且仅当这组后缀包含空字符串时,S_r是一个正方形。因此该算法变为:

Initialise: SuffixSet = {<empty string>} ; r = 0
Loop: while (r < n) {
  r = r + 1
  NextSuffixSet = {}
  for each V in SuffixSet {
    if (V[1] == S[r]) Add V[2...] to NextSuffixSet // Remove first character of V
    Add V||S[r] to NextSuffixSet // Append character S[r] to V
    }
  SuffixSet = NextSuffixSet
  }
Now S is a square if and only if SuffixSet contains the empty string.

例如,如果S为AABAAB:

r=0: SuffixSet = {<empty string>}
r=1: S[r] = A; SuffixSet = {A}
r=2: S[r] = A; SuffixSet = {<empty string>, AA}
r=3: S[r] = B; SuffixSet = {B, AAB}
r=4: S[r] = A; SuffixSet = {BA, AB, AABA}
r=5: S[r] = A; SuffixSet = {BAA, B, ABA, AABAA}
r=6: S[r] = B; SuffixSet = {AA, BAAB, <empty string>, BB, ABAB, AABAAB}

我们可以舍弃所有长度超过输入字符串一半的后缀,因此可以简化为:

r=0: SuffixSet = {<empty string>}
r=1: S[r] = A; SuffixSet = {A}
r=2: S[r] = A; SuffixSet = {<empty string>, AA}
r=3: S[r] = B; SuffixSet = {B, AAB}
r=4: S[r] = A; SuffixSet = {BA, AB}
r=5: S[r] = A; SuffixSet = {BAA, B, ABA}
r=6: S[r] = B; SuffixSet = {AA, <empty string>, BB}

我已经用C ++编写了此程序,它适用于此处给出的所有示例。如果有人感兴趣,我可以发布代码。问题是:SuffixSet的大小可以比多项式增长得更快吗?


3
我也尝试过此方法,但实验表明,如果原始字符串为(AB)^ n,则SuffixSet的大小似乎在n中呈指数增长。
伊藤刚(Tsuyoshi Ito)2010年

1

编辑:这是一个不正确的答案。


Sylvain建议使用RCG,不幸的是,RCG不适合这些“混洗方块”。但是,我认为有一个(编辑:不是RCG,请参见下面的Kurt注释!),其外观如下:

S(Y)A(ϵ,Y)(1)A(X,ZY)A(XZ,Y)(2)A(aX,aY)A(X,Y) for every aΣ(3)A(ϵ,ϵ)ϵ(4)

aabbabab(1,2)(3)(2)

100110101010

S(100110101010)A(ϵ,100110101010)(1)A(1001,10101010)(2)A(01,101010)(3)A(011,01010)(2)A(1,010)(3)A(10,10)(2)A(ϵ,ϵ)(3)ϵ(4)

我还没有得出正式的证明,证明这种语法确实可以准确地捕捉到“混搭方块”,但是应该不会太难。Sylvain已经提到RCG的决策问题是多项式。


A(x,ϵ)23

5
@DaniCL,再三考虑...生产规则的RHS中的参数是否需要是输入的连续范围?我没有在Boullier论文的定义中明确指出这一点,但这似乎就是它的使用方式。在分析解析算法的运行时间时,它说这些子句的可能参数个数为O(n ^ 2h),其中h是子句的最大似然性,n是输入长度。在您的语法中,XZ通常不会在原始输入中是连续的。
Kurt 2010年

3
@库尔特,我想您已经找到了缺陷。在另一篇论文(“中文数字,MIX,扰码和范围并置语法”中),Boullier明确指出:“当然,只有连续范围可以并入新范围。在任何PRCG中,子句中的终端,变量和参数都是应该通过替换机制绑定到范围。” 这可能意味着我的语法不是有效的RCG,Radu的怀疑是合理的,并且这种方法也不起作用。
DaniCL 2010年

2
@库尔特是正确的。没有连续性限制,我很确定我可以创建一组生产规则来识别NP完整语言UNARY 3PARTITION。可以用(1 * 0)^ *语言的字符串对任何一组非负整数进行一元编码。UNARY 3PARTITION是所有这样的字符串的集合,这些字符串的编码集可以划分为3个元素的子集,所有子集的总和都相同。(参见en.wikipedia.org/wiki/3-partition_problem。)
Jeffε

1
一元三进制语法:S(X0Y0Z)-> A(e,X0,Y0,Z); A(W,1X,Y,Z),A(W,X,1Y,Z),A(W,X,Y,1Z)-> A(W1,X,Y,Z); A(W,0X,0Y,0Z)-> B(W,XYZ); B(W,e)-> e; B(W,X0Y0Z)-> C(W,W,X0,Y0,Z); C(W,1V,1X,Y,Z),C(W,1V,X,1Y,Z),C(W,1V,X,Y,1Z)-> C(W,V,X,Y, Z); C(W,e,X,Y,Z)-> B(W,XYZ)
Radu GRIGore 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.