计算数组中的位

时间:2015-02-13 15:55:57

标签: algorithm

鉴于我们知道在N个元素中设置了多少位,即如果我们有数组A和数组B的数组。

A store element 
B[i] store positions of bits set corresponding to A[i].

然后问题是我们能否找到使用该B阵列将所有A [i]的总和设置为1< = i< = N的总和。

就像说我们有A = [700,40]

As 700 is 1010111100 so we have [2 3 4 5 7 9]
As 40 is 101000 so we have [3 5]

B是[[2,3,4,5,7,9],[3,5]]

我们想要在740中设置的位数。

如何以有效的方式完成这项工作?请帮忙

2 个答案:

答案 0 :(得分:1)

这是关于二进制加法。在你的例子中

     A[0] = 1010111100    B[0] = [2,3,4,5,7,9]
     A[1] = 0000101000    B[1] = [3,5]
A[0]+A[1] = 1011100100

所以总和表示为[2,5,6,7,9]。你能看到在给定B[0]B[1]的情况下如何到达这个数组吗?

以下是如何继续使用两个数组:

set B = B[0]
while B[1] not empty:
    for each b in B[1]:
        if b not in B:
            append b to B
            remove b from B[1]
        else:
            remove b from B
    increment each of the remaining elements in B[1] by 1
return length(B)

您必须通过B阵列的元素模仿二进制加法。

要获得设置的位数,只需返回B中的元素数。

答案 1 :(得分:0)

所以给定数组B,你想在这个例子中计算A,740元素的总和吗?

易:

int sum = 0;
foreach( var bSubArray in B)
    foreach( var b in bSubArray)
        sum += Power( 2, b);