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

एक उप-सरणी में अलग-अलग तत्वों की संख्या के लिए प्रश्न | सी++ में 2 सेट करें

इस समस्या में, हमें n आकार का एक सरणी arr[] दिया जाता है और हमें एक्वेरी दिया जाता है। प्रत्येक क्वेरी में दो मान (L, R) होते हैं। हमारा काम एक सबरे में अलग-अलग तत्वों की संख्या के लिए प्रश्नों को हल करने के लिए एक प्रोग्राम बनाना है

समस्या का विवरण - यहां, हमें इंडेक्स (L-1) से (R-1) तक सबएरे में मौजूद अलग-अलग पूर्णांकों की कुल संख्या का पता लगाना होगा।

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

इनपुट

arr[] = {4, 6, 1, 3, 1, 6, 5}
query = [1, 4]

आउटपुट

4

स्पष्टीकरण

क्वेरी 1 के लिए:एल =1 और आर =4, हमें इंडेक्स 0 से 3 तक के विशिष्ट तत्वों की संख्या ज्ञात करनी होगी, जो कि 4 है।

क्वेरी 2 के लिए:एल =2 और आर =6, हमें इंडेक्स 1 से 5 तक अलग-अलग तत्वों की संख्या ज्ञात करनी होगी, जो कि 3 है।

समाधान दृष्टिकोण

प्रत्येक क्वेरी को हल करने के लिए एक सरल तरीका यह है कि सरणी को एल से रैंड स्टोर तत्वों तक सेट में पार किया जाए, जिसका आकार क्वेरी का परिणाम देगा। वही हमने पिछले सेट में चर्चा की है।

समस्या को हल करने का एक अधिक प्रभावी तरीका सेगमेंट ट्री डेटास्ट्रक्चर का उपयोग करना है। यह दी गई श्रेणी के लिए विशिष्ट तत्व गणना को संग्रहीत करेगा।

खंड का पेड़ एक विशेष प्रकार का पेड़ है, जो जानकारी को खंडों के रूप में संग्रहीत करता है।

खंड वृक्ष का पत्ता नोड सरणी के तत्वों को दर्शाता है। और गैर-पत्ती नोड्स आवश्यक मान वाले खंडों को दर्शाते हैं। यहां, यह विशिष्ट तत्वों को संग्रहीत करेगा। इस डेटा संरचना के कार्यान्वयन के लिए, हम सेट का उपयोग करेंगे।

उपरोक्त समाधान की कार्यप्रणाली को लागू करने के लिए कार्यक्रम -

उदाहरण

#include <bits/stdc++.h>
using namespace std;
set<int>* segmentTree;

void CreateSegmentTree(int i, int s, int e, int arr[]) {

   if (s == e) {
      segmentTree[i].insert(arr[s]);
      return;
   }
   CreateSegmentTree(2 * i, s, (s + e) / 2, arr);
   CreateSegmentTree(1 + 2 * i, 1 + (s + e) / 2, e, arr);
   segmentTree[i].insert( segmentTree[2 * i].begin(), segmentTree[2 * i].end());
   segmentTree[i].insert(segmentTree[2 * i + 1].begin(), segmentTree[2 * i + 1].end());
}

set<int> findDistSubarray(int node, int l, int r, int a, int b) {

   set<int> left, right, distinctSubarray;
   if (b < l || a > r)
   return distinctSubarray;
   if (a <= l && r <= b)
   return segmentTree[node];
   left = findDistSubarray(2 * node, l, (l + r) / 2, a, b);
   distinctSubarray.insert(left.begin(), left.end());
   right = findDistSubarray(1 + 2 * node, 1 + (l + r) / 2, r, a, b);
   return distinctSubarray;
}

int main() {

   int arr[] = {4, 6, 1, 3, 1, 6, 5};
   int n = sizeof(arr) / sizeof(arr[0]);
   int query[] = {1, 4};
   int i = (int)ceil(log2(n));
   i = (2 * (pow(2, i))) - 1;
   segmentTree = new set<int>[i];
   CreateSegmentTree(1, 0, n - 1, arr);
   set<int> distCount = findDistSubarray(1, 0, n - 1, (query[0]-1), (query[1]-1));
   cout<<"The number of distinct elements in the subarray is "<<distCount.size();
   return 0;
}

आउटपुट

The number of distinct elements in the subarray is 4

  1. सी ++ में एक सरणी में गैर-दोहराए जाने वाले (विशिष्ट) तत्वों का योग खोजें

    विचार करें कि हमारे पास कुछ तत्वों के साथ एक सरणी ए है। हमें सरणी में सभी अलग-अलग तत्वों का योग खोजना होगा। तो अगर ए =[5, 12, 63, 5, 33, 47, 12, 63], तो अलग-अलग तत्वों का योग 160 है। एक बार विचार करने के बाद डुप्लिकेट तत्वों को आसानी से अनदेखा कर दिया जाता है। हम इस समस्या को कुशलतापूर्वक हल करने क

  1. C++ में अंकगणित संख्या

    अंकगणितीय संख्या एक ऐसी संख्या है जिसमें सभी धनात्मक भाजक का औसत एक पूर्णांक होता है अर्थात संख्या n के लिए यदि भाजक की संख्या भाजक के योग को विभाजित कर सकती है तो n एक अंकगणितीय संख्या है। आइए अवधारणा को बेहतर ढंग से समझने के लिए एक उदाहरण लेते हैं, Input : n = 6 Output : YES Explanation : Divisor

  1. सरणी तत्वों के गुणन के लिए C++ प्रोग्राम

    पूर्णांक तत्वों की एक सरणी के साथ दिया गया और कार्य एक सरणी के तत्वों को गुणा करना और इसे प्रदर्शित करना है। उदाहरण Input-: arr[]={1,2,3,4,5,6,7} Output-: 1 x 2 x 3 x 4 x 5 x 6 x 7 = 5040 Input-: arr[]={3, 4,6, 2, 7, 8, 4} Output-: 3 x 4 x 6 x 2 x 7 x 8 x 4 = 32256 नीचे दिए गए कार्यक्रम में उपयोग क