【问题标题】:How do I get all permutations of xPy?如何获得 xPy 的所有排列?
【发布时间】:2011-01-10 11:39:14
【问题描述】:

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

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

【问题讨论】:

    标签: c++ c permutation


    【解决方案1】:

    我之前在需要执行类似操作的代码中使用过 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));
    

    【讨论】:

    • 谢谢,这样就可以了!幸运的是,我已经将问题优化到 21P4 * 100,这是 Perl 可以在大约 10 分钟内解决的问题。
    【解决方案2】:

    您可以通过在 vector&lt;bool&gt; 的标志上使用 std::next_permutation() 来获得组合。以从(1,2,3) 中选取 2 个元素为例,将向量开头为(false, true, true)。在此重复next_permutation() 将给你(true, false, true) 然后(true, true, false),然后重新开始。

    由于您想要排列而不是组合,请将每个组合映射到一组实际元素(例如,(true, false, true) 变为 (1, 3)),然后再次使用 next_permutation() 生成这些元素的所有排列。

    【讨论】:

      【解决方案3】:

      我不明白你关于密码的问题。但是如果你想在你的字典中找到这个词的最长排列(字谜),你可以试试他的方法。

      1. 为您的单词创建位掩码。您可能可以使用 64 位算术,因此您可以在其中容纳近 3 个字母。

      a-> 第一位,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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-18
        • 2012-12-03
        相关资源
        最近更新 更多