代码之家  ›  专栏  ›  技术社区  ›  Schwern

如何获得xPy的所有排列?

  •  4
  • Schwern  · 技术社区  · 15 年前

    我想计算一组X的大小Y的所有排列。也就是说,如果我有(1,2,3),并且想要所有大小为2,3P2的排列,它将是(1,2)(1,3)(2,1)(2,3)(3,1)(3,2)。

    我正试图破解一个很短的密码。我找出了两封信,决定进行暴力攻击。我有“ouglg ouyakl”,我正在对照一本很好的字典检查每一个排列。我已经删除了两个字母,所以它的24P7或1744364160的可能性并没有那么糟糕。我现在正在运行一个Perl程序,因此这将是一个有趣的测试,测试编程时间+运行时间的总效率

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

    3 回复  |  直到 14 年前
        1
  •  2
  •   Greg Rogers    15 年前

    我用过 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));
    
        2
  •  0
  •   Sumudu Fernando    15 年前

    您可以使用 std::next_permutation() vector<bool> 国旗。以从中拾取2个元素为例 (1,2,3) ,以 (false, true, true) . 重复 next_permutation() 在这上面我会给你 (true, false, true) (true, true, false)

    由于您希望排列而不是组合,请将每个组合映射到实际元素集(例如。 (真、假、真) 变成(1,3)),然后使用 下一个置换() 再一次。

        3
  •  0
  •   Luka Rahne    15 年前

    我不太明白你关于密码的问题。但是,如果你想在字典里找到这些单词最长的排列方式,你可以试试他的方法。

    a->第一位,b->第二位等等。 如果你在“ouglg ouyakl”一词中有这个词

     abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyzabcdefghijklmnop
     100000100011001000001001000000010000100100000100000000000000000000
    

    (希望我没有错过什么) 现在为词汇表创建相同的位掩码。

    当你检查词汇表时,你只需要做的是

     vocabulary & ( ouglg_ouyakl ^ vocabulary)
    

    如果你的词汇来自Ouglu 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页。