Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सी ++ में एक सरणी में सभी जोड़े के एक्सओआर का योग

इस समस्या में, हमें n पूर्णांकों का एक सरणी arr[] दिया गया है। हमारा काम एक प्रोग्राम बनाना है जो एक सरणी में सभी जोड़े के एक्सओआर का योग खोजने के लिए है।

समस्या को समझने के लिए एक उदाहरण लेते हैं,

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

  1. सी ++ में सरणी के सभी तत्वों पर एक्सओआर ऑपरेशन लागू करके सरणी योग को कम करना

    विवरण आकार की एक सरणी को देखते हुए, एन। एक तत्व एक्स खोजें जैसे कि सरणी तत्वों का योग न्यूनतम होना चाहिए जब एक्सओआर ऑपरेशन एक्स और सरणी के प्रत्येक तत्व के साथ किया जाता है। If input array is: arr [] = {8, 5, 7, 6, 9} then minimum sum will be 30 Binary representation of array elments are: 8 : 1000

  1. सी++ सम ऐरे पहेली

    सरणी एक डेटा संरचना है जो एक ही डेटा प्रकार के कई तत्वों को संग्रहीत करती है। यह मूल्यों के पूरे सेट को एक साथ स्टोर कर सकता है। लेकिन इसकी लंबाई पहले से तय करने की जरूरत है। इस योग सरणी पहेली में, हमें एक निश्चित आकार, मान लीजिए n की एक सरणी A1 दी गई है। इस पहेली को हल करने के लिए, हम S1 नामक एक स

  1. सी ++ में एक सम ऐरे पहेली?

    यहां हम सरणी से संबंधित एक दिलचस्प समस्या देखेंगे। n तत्वों के साथ एक सरणी है। हमें n तत्वों की एक और सरणी बनानी है। लेकिन दूसरी सरणी की i-वें स्थिति i-वें तत्व को छोड़कर पहले सरणी के सभी तत्वों का योग धारण करेगी। और एक बाधा यह है कि हम इस समस्या में घटाव ऑपरेटर का उपयोग नहीं कर सकते हैं। यदि हम घट