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)
创建一个表示组合开头的根,因此它没有任何价值.
计算所有可能的孩子(26个字母,26个孩子......)
为每个根孩子计算可能的孩子(所以:剩余的字母)
使用递归的有限深度搜索来查找您的组合.
如果我只想要一个"简单"的解决方案,我会尝试这个解决方案.我不确定这是多少资源密集,所以我建议你开始尝试一小组字母.
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)