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

बाइनरी इंडेक्स ट्री:सी ++ में रेंज अपडेट और रेंज क्वेरीज़

यहां, हमें आकार n की एक सरणी दी गई है जिसमें शुरू में सभी तत्व 0 हैं। और कुछ प्रश्न हैं जो इस पर किए जाने हैं। क्वेरी दो प्रकार की होती हैं -

  • अपडेट करें(l,r, value) - सरणी के उन तत्वों में मान जोड़ें जो सूचकांक l से r के बीच हैं। उदाहरण के लिए, अपडेट (2, 4, 5) एलिमेंट 2 को इंडेक्स 4 और 5 पर एलिमेंट पर रखकर ऐरे को अपडेट करेगा।

  • getRangeSum(l, r) - l से r तक के तत्वों की सीमा के भीतर तत्वों का योग ज्ञात कीजिए। उदाहरण के लिए, getRangeSum(4, 7) इंडेक्स 4, 5, 6, 7 के साथ सभी तत्वों का योग मिलेगा।

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

इनपुट

n = 7 , arr[7] = {0,0,0,0,0,0,0}
Q1 = update(3, 6, 4)
Q2 = update(0, 4, 2)
Q3 = Sum(2, 5)

आउटपुट

10

स्पष्टीकरण

Solving queries: Q1 - update(3, 6, 4) = {0, 0, 0, 4, 4, 4, 4}
Q2 - update(0, 4, 2) = {2, 2, 2, 2, 2, 4, 4}
Q3 - sum(2, 5) = 2+2+2+4 = 10

इस समस्या को हल करने के लिए प्रत्येक अद्यतन क्वेरी पर सरणी को अद्यतन करने और फिर योग खोजने के लिए एक सरल दृष्टिकोण होगा लेकिन यह इतना प्रभावी नहीं है तो आइए समस्या को हल करने के लिए एक अधिक प्रभावी दृष्टिकोण सीखें।

आइए देखें कि सम क्वेरी पर अद्यतन प्रश्नों का प्रभाव क्या है। सम क्वेरी फॉर्म योग का है [एल, आर], हम इसे फॉर्म योग [0, के] के योग प्रश्नों में विभाजित करेंगे और फिर योग को योग से निचली सीमा से निचली सीमा तक घटा देंगे।

sum[l,r] = sum[0,r] - sum[0,l]

तो, राशि का प्रभाव [0, k] योग [l, r] पर परिलक्षित होगा। योग चर k अपने सापेक्ष मूल्य के आधार पर 3 अलग-अलग क्षेत्रों में स्थित होगा और अद्यतन क्वेरी की [l,r] श्रेणी में होगा।

क्षेत्र 1 − k, o और l के बीच स्थित है अर्थात 0

इस मामले में, अद्यतन क्वेरी योग क्वेरी को प्रभावित नहीं करेगी।

क्षेत्र 2 − k l और r के बीच स्थित है अर्थात l ≤ k r

इस मामले में, योग क्वेरी l से k तक के मानों का मनोरंजन करेगी।

क्षेत्र 3 − k, r से बड़ा है यानी k>r

इस मामले में, योग क्वेरी l से r के बीच के सभी मानों का मनोरंजन करेगी।

अब, रेंज अपडेट और रेंज क्वेरीज़ को हल करने के लिए प्रोग्राम देखें

// रेंज अपडेट और रेंज प्रश्नों को हल करने का कार्यक्रम

उदाहरण

#include <bits/stdc++.h>
using namespace std;
int getSum(int BITree[], int i){
   int sum = 0;
   i++;
   while (i>0) {
      sum += BITree[i];
      i -= i & (-i);
   }
   return sum;
}
void updateBITree(int BITree[], int n, int i, int val) {
   i = i + 1;
   while (i <= n) {
      BITree[i] += val;
      i += i & (-i);
   }
}
void update(int BITTree1[], int BITTree2[], int n, int l, int r, int value) {
   updateBITree(BITTree1,n,l,value);
   updateBITree(BITTree1,n,r+1,-value);
   updateBITree(BITTree2,n,l,value*(l-1));
   updateBITree(BITTree2,n,r+1,-value*r);
}
int sum(int x, int BITTree1[], int BITTree2[]) {
   return (getSum(BITTree1, x) * x) - getSum(BITTree2, x);
}
int getRangeSum(int l, int r, int BITTree1[], int BITTree2[]) {
   return sum(r, BITTree1, BITTree2) - sum(l-1, BITTree1, BITTree2);
}
int *createBITree(int n) {
   int *BITree = new int[n+1];
   for (int i=1; i<=n; i++)
   BITree[i] = 0;
   return BITree;
}
int main(){
   int n = 7;
   int *BITTree1, *BITTree2;
   BITTree1 = createBITree(n);
   BITTree2 = createBITree(n);
   update(BITTree1,BITTree2,n,3,6,9);
   update(BITTree1,BITTree2,n, 0, 4, 5);
   cout<<"The output of sum query after applying all update queries is \t"      <<getRangeSum(1,5,BITTree1,BITTree2);
   return 0;
}

आउटपुट

The output of sum query after applying all update queries is

  1. सी ++ में बाइनरी ट्री को सीरियलाइज़ और डिसेरिएलाइज़ करें

    मान लीजिए कि हमारे पास एक बाइनरी ट्री है और हमें उन्हें क्रमबद्ध और डिसेरिएलाइज़ करना है। जैसा कि हम जानते हैं कि क्रमांकन डेटा संरचना या ऑब्जेक्ट को बिट्स के अनुक्रम में परिवर्तित करने की प्रक्रिया है, इसलिए हम उन्हें एक फ़ाइल या मेमोरी बफर में स्टोर कर सकते हैं, और जिसे बाद में उसी या किसी अन्य कं

  1. C++ में बाइनरी ट्री में अधिकतम सर्पिल योग

    इस समस्या में हमें एक बाइनरी ट्री दिया जाता है। हमारा काम एक प्रोग्राम बनाना है जो C++ में एक बाइनरी ट्री में अधिकतम सर्पिल योग प्राप्त करेगा। सर्पिल योग बाइनरी ट्री का, बाइनरी ट्री के स्पाइरल ट्रैवर्सल में पाए जाने वाले नोड्स का योग होता है। एक पेड़ के सर्पिल ट्रैवर्सल में, नोड्स को रूट से लीफ न

  1. C++ में बाइनरी ट्री में अधिकतम लम्बवत योग ज्ञात कीजिए

    मान लीजिए कि हमारे पास एक बाइनरी ट्री है। कार्य ऊर्ध्वाधर क्रम ट्रैवर्सल में सभी नोड्स के अधिकतम योग को प्रिंट करना है। तो अगर पेड़ नीचे जैसा है - लंबवत क्रम ट्रैवर्सल इस प्रकार है - 4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9 यहां अधिकतम 12 है। दृष्टिकोण सरल है। हम वर्टिकल ऑर्डर ट्रैवर्सल करेंगे, फिर योग