(n选择k)和长度为n的位串之间的双射,并设置了k位

时间:2019-01-28 15:45:29

标签: algorithm bitstring hammingweight bijection

虽然我知道如何生成大小为n的所有(k个选择n)位串,并且精确地将k位设置为1,但我仍在努力寻找双射,得到i和(1选择n)之间的数字k作为输入,并以任意顺序输出第i

很显然,人们可以简单地枚举列表中的所有向量,然后输出列表中的第i个条目,但是不幸的是,这种设置对我的设置要求很高的内存要求。

编辑:这也应该是一种高效的计算,对于每次调用双射都计算所有向量的列表也不是一种选择。

1 个答案:

答案 0 :(得分:3)

直接的方法:

如果 i <(n-1选择k),则最左边的位为 0 ,而 i 递归确定其余位。否则,最左边的位是 1 ,而 i-(n-1选择k)递归确定其余位。在第二种情况下,最多有(n-1个选择k-1)的可能值 i-(n-1个选择k)