如何找到第 n 个二进制排列?
How to find the nth binary permutation?
这是我完成压缩算法所需的最后一个缺失部分,新的。假设我有 4 位,其中 2 位设置为 1、0011。该数字的排列总数为 0011、0101、0110、1001、1010、1100、6 种情况。这个可以用计算来计算。
4! / ((2!)(4-2)!) = 6
现在我希望能够找到第 n 个序列,例如第一个数字是 0011,第二个数字是 0101。所以如果我说 n=5,我希望能够从中得到第 5 个排列序列 1010最初的 0011。我该怎么做?
如果二进制只有两个1,也不算太难
当最高1位位于x
位置时,排列数为x
.
因此,最高位位置最小a
(从0开始),服从a*(a+1)/2 >= n
。您可以通过 O(n) 循环轻松找到 a
。
则最低位为a*(a+1)/2-n
(从0开始)
例如n
为5时,最小的a
为3,最低位为1,则答案为1010
这是我完成压缩算法所需的最后一个缺失部分,新的。假设我有 4 位,其中 2 位设置为 1、0011。该数字的排列总数为 0011、0101、0110、1001、1010、1100、6 种情况。这个可以用计算来计算。
4! / ((2!)(4-2)!) = 6
现在我希望能够找到第 n 个序列,例如第一个数字是 0011,第二个数字是 0101。所以如果我说 n=5,我希望能够从中得到第 5 个排列序列 1010最初的 0011。我该怎么做?
如果二进制只有两个1,也不算太难
当最高1位位于x
位置时,排列数为x
.
因此,最高位位置最小a
(从0开始),服从a*(a+1)/2 >= n
。您可以通过 O(n) 循环轻松找到 a
。
则最低位为a*(a+1)/2-n
(从0开始)
例如n
为5时,最小的a
为3,最低位为1,则答案为1010