【发布时间】:2013-07-30 14:36:17
【问题描述】:
我正在尝试使用 26 个字母(仅相当于 26*25*24=15,600)来计算所有可能的 3 个字母排列。字母的顺序很重要,我不想重复字母。 (我希望按字典顺序生成排列,但这不是必需的)
到目前为止,我尝试嵌套for 循环,但最终我迭代了所有可能的组合。所以有重复的字母,这是我不想要的,如果我想要超过 3 个字母,for 循环可能会变得难以管理。
我可以翻阅这些字母,直到我得到一个没有使用过的字母,但它不是按字典顺序排列的,而且它比使用 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;
}
【问题讨论】:
标签: c++ performance permutation