在所有可能的大阵列对中查找AND乘积的最佳方法是什么?

时间:2019-09-03 15:38:16

标签: java python-3.x algorithm

给定的数组太大,大约包含10 ^ 6个元素。

已经知道遍历每个可能的对的传统方法,但是我想要一些更有效的方法/技巧。

int prod = 0, arr[]= {1,4};

for(int x = 0; x<arr.length;x++) {
    for(int y = x;y<arr.length; y++) {
        prod += arr[x] & arr[y];
    }
}

System.out.println(prod);

3 个答案:

答案 0 :(得分:4)

// Count the occurrences of each bit

int[] bitcounts = new int[32];
for (int x=0; x<arr.length; ++x) {
    int val = arr[x];
    for (int bit=0; bit<32; ++bit) {
        if ((val & (1<<bit)) != 0) {
            bitcounts[bit]++;
        }
    }
}

// If a bit appears in n entries, then it appears in n(n+1)/2 pairs
// (counting the pair of each item with itself)

int result = 0;
for (int bit=0; bit<32; ++bit) {
   long pairs = ((long)bitcounts[bit]) * (bitcounts[bit]+1) / 2;
   result += ((int)pairs) * (1<<bit);
}
return result;

答案 1 :(得分:0)

如果const mockPropsForComponentAlternatorAndLOW = { notifications: [{ params: { subType: 'ALTERNATOR' } }, params: { subType: 'LOW' }] } = 0,则可以跳过arr[x]值的整个内部循环(因为无论 y y = 0都是 y = 0 em>是。

答案 2 :(得分:0)

对角线是一个身份。

prod = 0;
for(int x = 0; x < arr.length; x++) {
    int ax = arr[x];
    for(int y = x + 1; y <arr.length; y++) {
        prod += ax & arr[y];
    }
    prod += arr[x];
}