[英]Calculate how many binary numbers with X number of 1 bits exist between two given binary numbers with the same property
一段時間以來,這一直是我的挑戰。
給定兩個表示二進制數的數組,A和C具有相同的大小,由數字0或1表示的位組成,使得C> A,並且都具有相同的X位數1,這是最有效的方法計算存在多少個二進制B,使得A <B <C,並且每個B也具有X個1位數字?
示例:對於A = {0,1,0,0,1} C = {1,0,1,0,0} X = 2
所有B均為{0,1,0,1,0},{0,1,1,0,0},{1,0,0,0,1},{1,0,0,1,0 },它會給我答案4。在01001和10100之間有4個二進制文件,帶有2個“ 1”位。
我有一個算法可以給定一些A來生成下一個B,但是我覺得繼續生成下一個B並檢查我是否已經達到C二進制代碼效率不高。
有什么方法可以在不生成B的情況下計算A和C之間B的確切數目?
不知道您是否在https://math.stackexchange.com/上找到了答案,但是讓我take一下。
在下面的所有討論中,我們只對X
1位的數字感興趣。 為了簡單起見,我不會再這么說了。
因此,假設我們可以計算低於給定值A
的數字計數: smaller(A)
。 要找到A
和C
之間的數字計數,我們可以將其計算為smaller(C) - smaller(A) - 1
。
讓我們定義計數多少數字與X個比特在Y位的空間中存在的功能, count(X, Y)
例如count(1, 3) = 3
( 001
, 010
, 100
)和count(2, 3) = 3
( 011
, 101
, 110
)。 這是標准組合數學,即從袋子中拉出編號為1到Y的X球的組合數量。
count(X, Y) = Y! / ((Y-X)! * X!)
X!
在哪里X!
是factorial(X)
。
現在,我將通過一個示例展示下一部分,如何計算smaller(A)
。 設A = 010010100
。
首先,計算右邊的0(2)。 有然后count(1, 2)
下面的數字A
其中最右邊的1比特被移動到右側( 010010010
, 010010001
)。
提示:使用count = Integer.numberOfTrailingZeros(A)
刪除該1位,剩下A = 010010000
。
提示:使用A = A ^ (1 << count)
重復,即計數0(4),但是這次我們需要計數2位組合,即count(2, 4)
。
A = 010000000
,這導致count(3, 7)
A = 010000000
count(3, 7)
。
因此,由於1位分別位於第2、4和7位,我們可以計算出:
smaller(A) = count(1, 2) + count(2, 4) + count(3, 7)
現在,有了count(X, Y)
高效實現,即使對於高位數,也可以計算A和C之間的數字計數。
無論如何,這是做到這一點的一種方法,但是數學方面的天才可能對此有更好的算法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.