这是我需要完成压缩算法的最后一个缺失部分,新算法。假设我有4位,其中2位设置为1,0011。该数字的排列总数为0011,0101,10110,1001,1010,1100,6种情况。这可以使用计算来计算。
4! /((2!)(4-2)!)= 6
现在我希望能够找到第n个序列,例如第一个数字是0011,第二个数字是0101.所以如果我说n = 5,我希望能够从最初的第五个排列序列获得1010 0011.我该怎么做?
答案 0 :(得分:1)
如果二进制文件中只有两个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