[英]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.