我想计算一组大小为X的大小Y的所有排列。即如果我有(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或1,744,364,160种可能性并不是那么糟糕。我现在有一个Perl程序在运行,所以这将是一个有趣的测试编程时间+运行时间的总效率。 :)
(不,我不只是想要密码的答案。)
答案 0 :(得分:2)
我之前使用this库(注意它是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));
答案 1 :(得分:0)
我没有得到关于密码的问题。但是如果你想在你的词典中找到这个单词的最长排列(anagram),你可以试试他的方式。
A-&GT;第一位,b->第二位等等。 如果你的“ouglg ouyakl”案件中有词,那就意味着
abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyzabcdefghijklmnop
100000100011001000001001000000010000100100000100000000000000000000
(希望我没有错过任何东西) 现在,您为词汇创建相同的位掩码。
当你反对词汇时,你只需要做的就是
vocabulary & ( ouglg_ouyakl ^ vocabulary)
如果您的词汇单词来自ouglg_ouyakl,则会显示0。
关于排列
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]]
编辑:普遍的解决方案不适合24P7。
答案 2 :(得分:0)
您可以在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()
生成这些排列的所有排列。 / p>