(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),那么最左边的位是0和i 递归地确定剩余的位。否则,最左边的位为1,i - (n-1 choose k) 递归确定余位。在第二种情况下,最多 (n-1 选择 k-1) 个可能的值 i - (n-1 选择 k)。
虽然我知道如何生成所有(n
选择 k
)大小为 n
的位串,并且恰好 k
位设置为 1,但我正在努力寻找双射,将 1
和 (n
选择 k
) 之间的数字 i
作为输入,并输出第 i
个此类向量任意排序。
显然,可以简单地枚举列表中的所有向量,然后输出列表的第 i
个条目,但不幸的是,这种方法对我的设置有很高的内存要求。
编辑:它也应该是一个高效的计算,计算每次调用双射的所有向量列表也不是一个选项。
最直接的方式:
如果i < (n-1 choose k),那么最左边的位是0和i 递归地确定剩余的位。否则,最左边的位为1,i - (n-1 choose k) 递归确定余位。在第二种情况下,最多 (n-1 选择 k-1) 个可能的值 i - (n-1 选择 k)。