📌  相关文章
📜  一个数组元素与另一个数组所有元素的按位异或之和

📅  最后修改于: 2021-09-08 12:41:36             🧑  作者: Mango

给定一个大小为N的数组 arr[]和一个数组Q[] ,任务是计算数组 arr[]的所有元素与数组 q[] 的每个元素的按位异或之和。

例子:

朴素方法:解决问题的最简单方法是遍历数组Q[]并针对每个数组元素计算其与数组arr[] 的所有元素的按位异或之和。
时间复杂度: O(N 2 )
辅助空间: O(1)

高效方法:按照以下步骤优化上述方法:

  • 初始化一个数组count[] ,大小为32在数组 arr[]的元素的每个位置存储设置位的计数。
  • 遍历数组arr[]
  • 相应地更新数组count[] 。在32 位二进制表示中,如果设置了i位,则增加该位置的设置位计数。
  • 遍历数组Q[]并对每个数组元素执行以下操作:
    • 初始化变量,例如sum = 0,以存储按位 XOR 所需的总和。
    • 迭代当前元素的每个位位置。
    • 如果设置了当前位,则添加i 位未设置的元素数* 2 i 求和
    • 否则,添加count[i] * 2 i
    • 最后,打印sum的值。

下面是上述方法的实现:

C++
// C++ Program for the above approach
#include 
using namespace std;
  
// Function to calculate sum of Bitwise
// XOR of elements of arr[] with k
int xorSumOfArray(int arr[], int n, int k, int count[])
{
  
    // Initialize sum to be zero
    int sum = 0;
    int p = 1;
  
    // Iterate over each set bit
    for (int i = 0; i < 31; i++) {
  
        // Stores contribution of
        // i-th bet to the sum
        int val = 0;
  
        // If the i-th bit is set
        if ((k & (1 << i)) != 0) {
  
            // Stores count of elements
            // whose i-th bit is not set
            int not_set = n - count[i];
  
            // Update value
            val = ((not_set)*p);
        }
        else {
  
            // Update value
            val = (count[i] * p);
        }
  
        // Add value to sum
        sum += val;
  
        // Move to the next
        // power of two
        p = (p * 2);
    }
  
    return sum;
}
  
void sumOfXors(int arr[], int n, int queries[], int q)
{
  
    // Stores the count of elements
    // whose i-th bit is set
    int count[32];
  
    // Initialize count to 0
    // for all positions
    memset(count, 0, sizeof(count));
  
    // Traverse the array
    for (int i = 0; i < n; i++) {
  
        // Iterate over each bit
        for (int j = 0; j < 31; j++) {
  
            // If the i-th bit is set
            if (arr[i] & (1 << j))
  
                // Increase count
                count[j]++;
        }
    }
  
    for (int i = 0; i < q; i++) {
        int k = queries[i];
        cout << xorSumOfArray(arr, n, k, count) << " ";
    }
}
  
// Driver Code
int main()
{
    int arr[] = { 5, 2, 3 };
    int queries[] = { 3, 8, 7 };
  
    int n = sizeof(arr) / sizeof(int);
    int q = sizeof(queries) / sizeof(int);
  
    sumOfXors(arr, n, queries, q);
  
    return 0;
}


输出:
7 34 11

时间复杂度: O(N)
辅助空间: O(N)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live