Algorithm “的复杂性是什么?”;地穴踢者;?

Algorithm “的复杂性是什么?”;地穴踢者;?,algorithm,complexity-theory,Algorithm,Complexity Theory,我在考虑这个问题。我想我可以用蛮力尝试所有字母的排列来解决这个问题(也许需要一些优化)。然而,这种解决方案的最坏情况复杂性看起来像O(字母排列*字数) 对吗?在最坏的情况下,有没有复杂度更低的解决方案?你可以用蛮力解决任何加密问题,问题是解决所需的时间。因此,对于多字母密码,您需要依赖于该方法,它本质上是一种除法并合法。您需要做的是将密文转换为X个单字母密码。根据您问题中的链接,这是重要部分: Sample Input 6 and dick jane puff spot yertle bjvg

我在考虑这个问题。我想我可以用蛮力尝试所有字母的排列来解决这个问题(也许需要一些优化)。然而,这种解决方案的最坏情况复杂性看起来像
O(字母排列*字数)


对吗?在最坏的情况下,有没有复杂度更低的解决方案?

你可以用蛮力解决任何加密问题,问题是解决所需的时间。因此,对于多字母密码,您需要依赖于该方法,它本质上是一种除法并合法。您需要做的是将密文转换为X个单字母密码。根据您问题中的链接,这是重要部分:

Sample Input 6
and
dick
jane
puff
spot
yertle

bjvg xsb hxsn xsb qymm xsb rqat xsb pnetfn
如果是这种情况,则最多为26个排列。 如果看不到更多的排列,就很难提供任何其他信息。您是否知道有其他示例输入/输出对

为了回答你关于复杂性的实际问题,我将作为参考

首先,我们来看一下加密方法:

function encrypt(Text textToEncrypt, Alphabet substitutionAlphabet)  
{  
     Alphabet textAlphabet = textToEncrypt.getAlphabet(); //O(1) should be a constant look up to get your own property  
      for(character current : textToEncrypt) //O(N) must touch all elements
      {  
         current = substitutionAlphabet.lookupChange(current, textAlphabet); //O(N) worst case map lookup
      }        
}

因此,似乎加密函数是O(N)最坏的情况,我的实现相当做作。解密应该是相同的,正好相反,这样也会产生O(N)

你可以用蛮力解决任何加密问题,问题是解决所需的时间。因此,对于多字母密码,您需要依赖于该方法,它本质上是一种除法并合法。您需要做的是将密文转换为X个单字母密码。根据您问题中的链接,这是重要部分:

Sample Input 6
and
dick
jane
puff
spot
yertle

bjvg xsb hxsn xsb qymm xsb rqat xsb pnetfn
如果是这种情况,则最多为26个排列。 如果看不到更多的排列,就很难提供任何其他信息。您是否知道有其他示例输入/输出对

为了回答你关于复杂性的实际问题,我将作为参考

首先,我们来看一下加密方法:

function encrypt(Text textToEncrypt, Alphabet substitutionAlphabet)  
{  
     Alphabet textAlphabet = textToEncrypt.getAlphabet(); //O(1) should be a constant look up to get your own property  
      for(character current : textToEncrypt) //O(N) must touch all elements
      {  
         current = substitutionAlphabet.lookupChange(current, textAlphabet); //O(N) worst case map lookup
      }        
}

因此,似乎加密函数是O(N)最坏的情况,我的实现相当做作。解密应该是相同的,正好相反,这样也会产生O(N)

我认为总会有一些病理病例需要回溯

这里有一种技术,一开始似乎让事情变得更简单:在单词中寻找重复字母的模式。如果你知道“香蕉”这个词,那么“xzyz”表示x=b,z=a,y=n。但这项技术还允许您构建一个字典,对具有香蕉状后缀的单词进行标记,从而允许您强制为前缀提供特定的可能解决方案。例如,字典条目ADFbanana、BCFbanana、BDEbanana以及单词PRSbanana要求用户选择P=A或B、R=C或D、S=E或F,以便这些映射中的一个恰好是两种可能性中的第一种


考虑到这些构造块,我认为可以采用如下形式的布尔方程(a | B | ~C)&(D | ~E | F)&。。。并将其编码为替换问题,这样,替代问题的解决方案将产生一个T/F的变量赋值,使方程产生真=>如果你能解决替代问题,你能解决SAT=>它是NP完全的。

我认为总会有一些病理病例需要回溯

这里有一种技术,一开始似乎让事情变得更简单:在单词中寻找重复字母的模式。如果你知道“香蕉”这个词,那么“xzyz”表示x=b,z=a,y=n。但这项技术还允许您构建一个字典,对具有香蕉状后缀的单词进行标记,从而允许您强制为前缀提供特定的可能解决方案。例如,字典条目ADFbanana、BCFbanana、BDEbanana以及单词PRSbanana要求用户选择P=A或B、R=C或D、S=E或F,以便这些映射中的一个恰好是两种可能性中的第一种


考虑到这些构造块,我认为可以采用如下形式的布尔方程(a | B | ~C)&(D | ~E | F)&。。。并将其编码为一个替换问题,这样替换问题的解决方案将产生一个T/F赋值给变量,使方程产生真=>如果你能解决替换问题,你能解决SAT=>它是NP完全的。

这里有一个正式的证明,证明了密码Kicker的NP硬度,使用k字母表,通过减少从


对于每个输入三元组(x、y、z),将单词xyz放入字典中。要确定是否存在大小为n的匹配,请请求对n字密文abc def ghi…进行解密。很明显,这种减少是浪费时间。如果存在三维匹配(x1,y1,z1),…,(xn,yn,zn),则置换x1→a、 y1→b、 z1→c、 x2→d、 …证明存在有效的解密。相反,如果存在一个有效的解密置换π,那么我们恢复一个3-d匹配(π(a),π(b),π(c)),(π(d),π(e),π(f)),…

这里有一个正式的证明,证明了使用k字母表的密码Kicker的NP硬度

对于每个输入三元组(x、y、z),将单词xyz放入字典中。要确定是否存在大小为n的匹配,请请求对n字密文abc def ghi…进行解密。很明显,这种减少是浪费时间。如果存在三维匹配(x1,y1,z1),…,(xn,yn,zn),则置换x1→a、 y1→b、 z1→c、 x2→d、 …证明存在有效的解密。相反,如果存在有效的解密置换π,则我们恢复三维匹配(π(a),π(b),π(c)),(π(d),π(e),π(f))