题
我想计算尺寸y的集合大小X的即如果我有(1,2,3)的所有排列和要尺寸2的所有排列,3P2,这将是(1, 2)(1,3)(2,1)(2,3)(3,1)(3,2)。
两者GSL和C ++ STL只提供xPx,我可以看到。可能有人点我在C / C ++库,它可以做到这一点或拼出一个快速和内存高效的算法?
我试图解决一个很短的密码。我已经想通了两封信,并已决定做一个强力攻击。我有“ouglg ouyakl”和我核对了很好的字典每种排列。我已经消除了2个英文字母所以其24P7或1744364160可能性是没有那么糟糕。我现在已经在运行一个Perl程序,所以这将是编程时间+运行时间,总有效率的一个有趣的测试。 :)
(不,我不只是要回答的密码。)
解决方案
我使用此库之前(注意这是C ++ )在需要做类似的东西代码。它的排列组合,有和没有重复。对于您的问题,这应该足够了(未经测试...):
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
std::vector<int>::iterator first = v.begin(), middle = v.begin() + 2, last = v.end();
do {
// do stuff with elements in range first...middle (but dont change them)
} while(next_partial_permutation(first, middle, last));
其他提示
您可以通过使用标志的std::next_permutation()
vector<bool>
获得组合。以采摘从(1,2,3)
2个元素你的榜样,开始你的矢量(false, true, true)
。在此重复next_permutation()
会给那么你(true, false, true)
(true, true, false)
,重新开始了。
由于要排列不组合,每个组合映射到组实际元件(例如(true, false, true)
变为(1,3)),然后再次生成这些使用next_permutation()
的所有排列。
我不exacly让你对密码的问题。但是,如果你想找到的这句话在你的字典里,你可以试试他的方法。最长的置换(字谜)
- 创建您的Word位掩码。你大概可以使用64位的算术这样你就可以装进近3 alpahbets。 醇>
A->第一比特,B->第二位,依此类推。 如果您在“ouglg ouyakl”案有字这意味着
abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyzabcdefghijklmnop
100000100011001000001001000000010000100100000100000000000000000000
(希望我没有错过的东西) 现在,您创建相同的位掩码为你的词汇。
当你对赤词汇你只需要做的就是
vocabulary & ( ouglg_ouyakl ^ vocabulary)
和此trows 0,如果你的词汇字是从ouglg_ouyakl。
关于排列
for each permutation of numbers fom 1-n // that is 1,2 and 2,1
for(i=0;i<end;i++)
for(j=i+1;j<end;j++)
SET[permutation[i]],SET[permutation[j]]
编辑:prevous soluton是inapropriate为24P7
。