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

Bijection between (n choose k) and bitstrings of length n with k bits set

虽然我知道如何生成所有(n 选择 k)大小为 n 的位串,并且恰好 k 位设置为 1,但我正在努力寻找双射,将 1 和 (n 选择 k) 之间的数字 i 作为输入,并输出第 i 个此类向量任意排序。

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

编辑:它也应该是一个高效的计算,计算每次调用双射的所有向量列表也不是一个选项。

最直接的方式:

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