【问题标题】:Kth permutation with specific number of value repetition具有特定值重复次数的第 K 次排列
【发布时间】:2017-08-02 04:54:59
【问题描述】:

我正在寻找一种算法,该算法将返回包含特定数量的真假值的布尔向量的第 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

我用谷歌搜索了很多不同的算法来生成排列,但没有找到具有特定重复元素数量的第 k 个排列。

感谢您的任何建议:)

【问题讨论】:

标签: c++ algorithm boolean permutation repeat


【解决方案1】:

如果您有二项式系数的来源,则很容易一次生成一个位。 (由于涉及的数字很小——我们知道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,递减n1,然后将k 递减(n0+n1-1)Cn1;否则,我们输出 0 并递减 n0

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

【讨论】:

    猜你喜欢
    • 2019-10-17
    • 2017-01-18
    • 2019-09-29
    • 2021-03-14
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    相关资源
    最近更新 更多