如何获得xPy的所有排列?

时间:2009-11-02 21:51:14

标签: c++ c permutation

我想计算一组大小为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程序在运行,所以这将是一个有趣的测试编程时间+运行时间的总效率。 :)

(不,我不只是想要密码的答案。)

3 个答案:

答案 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),你可以试试他的方式。

  1. 创建单词的位掩码。你可以使用64位算术,这样你就可以在里面装上近3个alpahbets。
  2. 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>