生成所有n个字母的排列

Nic*_*one -4 c++ performance permutation

我试图计算所有可能的3个字母排列,使用26个字母(仅相当于26*25*24 = 15,600).字母的顺序很重要,我不想重复字母.(我希望按字典顺序生成排列,但这不是必需的)

到目前为止,我试图嵌套for循环,但我最终迭代了每一个可能的组合.所以有重复的字母,我不想要,for如果我想要超过3个字母,循环可能变得难以管理.

我可以通过字母翻转,直到我尚未使用的信,但它不是在字典顺序,这是很多比使用慢next_permutation(我不能使用这种std方法,因为我离开了计算所有的子集26个字母).

有没有更有效的方法来做到这一点?从低效率的角度来看,next_permutation即时迭代前6位数字.但是,使用这种方法获取所有三个字母的排列需要几秒钟,而且next_permutation我必须计算的2 ^ n个子集仍然很快变得低效.

这是我对嵌套for循环的看法:

char key[] = {'a','b','c','d','e','f','g','h','i','j','k',
'l','m','n','o','p','r','s','t','u','v','w','x','y','z'};
bool used[25];
ZeroMemory( used, sizeof(bool)*25 );

for( int i = 0; i < 25; i++ )
{
     while( used[i] == true )
          i++;
     if( i >= 25 )
          break;
     used[i] = true;
     for( int j = 0; j < 25; j++ )
     {
          while( used[j] == true )
               j++;
          if( j >= 25 )
               break;
          used[j] = true;
          for( int k = 0; k < 25; k++ )
          {
               while( used[k] == true )
                    k++;
               if( k >= 25 )
                    break;
               used[k] = true;

               cout << key[i] << key[j] << key[k] << endl;

               used[k] = false;
          }
          used[j] = false;
     }
     used[i] = false;
}
Run Code Online (Sandbox Code Playgroud)

DaM*_*chk 5

  1. 创建一个表示组合开头的根,因此它没有任何价值.

  2. 计算所有可能的孩子(26个字母,26个孩子......)

  3. 为每个根孩子计算可能的孩子(所以:剩余的字母)

  4. 使用递归的有限深度搜索来查找您的组合.


Mat*_*ijs 5

如果我只想要一个"简单"的解决方案,我会尝试这个解决方案.我不确定这是多少资源密集,所以我建议你开始尝试一小组字母.

a = {a...z}
b = {a...z}
c = {a...z}

for each(a)
{
  for each(b)
  {
    for each(c)
    {
     echo a + b + c;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)