我想计算尺寸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让你对密码的问题。但是,如果你想找到的这句话在你的字典里,你可以试试他的方法。最长的置换(字谜)

  1. 创建您的Word位掩码。你大概可以使用64位的算术这样你就可以装进近3 alpahbets。
  2. 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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top