具有特定数值的重复的Kth置换

时间:2017-03-12 00:12:49

标签: c++ algorithm boolean permutation repeat

我正在寻找一种算法,该算法将返回包含特定数量的真值和假值的bool向量的第k个排列。并且这样做不会产生所有先前的排列,例如使用c ++ next_permutation(...)。 例如,我有00011并想要第5个词典排列(01010)。

有没有办法这样做?

包含2x true和3x false的排列的完整列表:

  1. 00011
  2. 00101
  3. 00110
  4. 01001
  5. 01010
  6. 01100
  7. 10001
  8. 10010
  9. 10100
  10. 11000
  11. 我用Google搜索了很多不同的算法来生成排列,但是没有用于具有特定重复元素数的第k个排列。

    感谢您的任何建议:)

1 个答案:

答案 0 :(得分:2)

如果您有二项式系数源,则一次只能生成一个位。 (由于涉及的数字很小 - 我们知道k符合无符号整数类型 - 可以预先计算可能的二项式系数。)

现在,考虑我们需要生成n0个零和n1个的情况。可能的有效位序列的数量是(n0+n1)Cn1(其中nCk是二项式系数),因为可以放置n0 + n1个一位的n1个位置。其中,(n0+n1-1)Cn1以0开头,剩余的(n0+n1-1)C(n1-1)以1开头。因此,如果k大于或等于(n0+n1-1)Cn1,我们会输出{{ 1}},递减1,并按n1递减k;否则,我们输出(n0+n1-1)Cn1并递减0

n0n0都达到0时,我们就完成了。 (当n1达到0时,通过或在必要时建立返回值的实际实现可能会停止,从而节省了几个步骤。)