2016-10-02 50 views
0

這是我需要完成我的壓縮算法,最新的一個失蹤的一塊。假設我有4位,其中2位設置爲1,0011.此數字的排列總數爲0011,0101,0110,1001,1010,1100,6個案例。這可以使用計算來計算。如何找到第n個二進制排列?

4! /((2!)(4-2)!)= 6

現在我想能夠找到第n個序列,例如第一個數字是0011,第二個數字是0101.所以如果我說n = 5 ,我希望能夠從最初的0011獲得第5個排列序列1010.我該怎麼做?

+0

你可以迭代它們,這個解決方案可以運行多達63位數字:https://codereview.stackexchange.com/a/162983/21279 – RobAu

回答

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

+0

嗨,如00111和n = 8這樣的大數字怎麼樣? – user1352777

+0

我的意思是找到中間位 – user1352777