Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ผลรวมของ XOR ของคู่ทั้งหมดในอาร์เรย์ใน C++


ในปัญหานี้ เราได้รับอาร์เรย์ arr[] ของจำนวนเต็ม n ตัว งานของเราคือสร้างโปรแกรมเพื่อค้นหาผลรวมของ XOR ของคู่ทั้งหมดในอาร์เรย์

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

Input: arr[] = {5, 1, 4}
Output: 10
Explanation: the sum of all pairs:
5 ^ 1 = 4
1 ^ 4 = 5
5 ^ 4 = 1
sum = 4 + 5 + 1 = 10

วิธีง่ายๆ วิธีหนึ่งในการแก้ปัญหานี้คือเรียกใช้การวนซ้ำแบบซ้อนและค้นหาคู่ของตัวเลขทั้งหมด ค้นหา XOR ของแต่ละคู่และเพิ่มลงในผลรวม

อัลกอริทึม

Initialise sum = 0
Step 1: for(i -> 0 to n). Do:
   Step 1.1: for( j -> i to n ). Do:
      Step 1.1.1: update sum. i.e. sum += arr[i] ^ arr[j].
Step 2: return sum.

ตัวอย่าง

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

#include <iostream>
using namespace std;
int findXORSum(int arr[], int n) {
   int sum = 0;
   for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++)
    sum += (arr[i]^arr[j]);
   return sum;
}
int main() {
   int arr[] = { 5, 1, 4 };
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"Sum of XOR of all pairs in an array is "<<findXORSum(arr, n);
   return 0;
}

ผลลัพธ์

Sum of XOR of all pairs in an array is 10

ความซับซ้อนของเวลาของอัลกอริทึมคือ O(n2) และไม่ใช่วิธีแก้ปัญหาที่มีประสิทธิภาพที่สุด

วิธีแก้ปัญหาที่มีประสิทธิภาพคือการใช้เทคนิคการจัดการบิต

ในที่นี้ เราจะพิจารณาบิตของตัวเลขและในแต่ละตำแหน่ง และใช้สูตรด้านล่างหาผลรวมกลาง

(number of set bits) * (number of unset bits) * (2^(bit_position))

เพื่อหาผลรวมสุดท้าย เราจะบวกผลรวมกลางของบิตทั้งหมด

โซลูชันของเราใช้สำหรับค่าจำนวนเต็ม 64 บิต สำหรับวิธีนี้ เราต้องการจำนวนบิต

อัลกอริทึม

Initialize sum = 0, setBits = 0, unsetBits = 0.
Step 1: Loop for i -> 0 to 64. repeat steps 2, 3.
Step 2: Reset setBits and unsetBits to 0.
Step 3: For each element of the array find the value of setBits and unsetBits. At ith position.
Step 4: update sum += (setBits * unsetBits * (2i))

ตัวอย่าง

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

#include <iostream>
#include <math.h>
using namespace std;
long findXORSum(int arr[], int n) {
   long sum = 0;
   int unsetBits = 0, setBits = 0;
   for (int i = 0; i < 32; i++) {
      unsetBits = 0; setBits = 0;
      for (int j = 0; j < n; j++) {
         if (arr[j] % 2 == 0)
            unsetBits++;
         else
            setBits++;
         arr[j] /= 2;
      }
      sum += ( unsetBits*setBits* (pow(2,i)) );
   }
   return sum;
}
int main() {
   int arr[] = { 5, 1, 4, 7, 9};
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"Sum of XOR of all pairs in an array is "<<findXORSum(arr, n);
   return 0;
}

ผลลัพธ์

Sum of XOR of all pairs in an array is 68