我正在寻找一种算法,该算法将返回包含特定数量的真值和假值的bool向量的第k个排列。并且这样做不会产生所有先前的排列,例如使用c ++ next_permutation(...)。 例如,我有00011并想要第5个词典排列(01010)。
有没有办法这样做?
包含2x true和3x false的排列的完整列表:
我用Google搜索了很多不同的算法来生成排列,但是没有用于具有特定重复元素数的第k个排列。
感谢您的任何建议:)
答案 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
。
当n0
和n0
都达到0时,我们就完成了。 (当n1
达到0时,通过或在必要时建立返回值的实际实现可能会停止,从而节省了几个步骤。)