কম্পিউটার

বাইনারি ইনডেক্সড ট্রি:C++ এ রেঞ্জ আপডেট এবং রেঞ্জ কোয়েরি


এখানে, আমাদেরকে n আকারের একটি অ্যারে দেওয়া হয়েছে যার প্রাথমিকভাবে সমস্ত উপাদান রয়েছে 0। এবং কিছু প্রশ্ন রয়েছে যা এটিতে সম্পাদন করতে হবে। দুই ধরনের প্রশ্ন আছে −

  • আপডেট(l,r, value) − l থেকে r সূচকের মধ্যে থাকা অ্যারের উপাদানগুলিতে মান যোগ করুন। উদাহরণস্বরূপ, আপডেট(2, 4, 5) সূচক 4 এবং 5 এ উপাদানটিতে 2 উপাদান রেখে অ্যারে আপডেট করবে।

  • getRangeSum(l, r) − l থেকে r পর্যন্ত উপাদানের সীমার মধ্যে উপাদানের সমষ্টি খুঁজুন। উদাহরণস্বরূপ, getRangeSum(4, 7) সূচক 4, 5, 6, 7 সহ সমস্ত উপাদানের যোগফল খুঁজে পাবে।

সমস্যাটি বোঝার জন্য একটি উদাহরণ দেওয়া যাক,

ইনপুট

n =7 , arr[7] ={0,0,0,0,0,0,0}Q1 =আপডেট(3, 6, 4)Q2 =আপডেট(0, 4, 2)Q3 =যোগফল (2, 5)

আউটপুট

10

ব্যাখ্যা

প্রশ্নগুলি সমাধান করা:Q1 - আপডেট(3, 6, 4) ={0, 0, 0, 4, 4, 4, 4}Q2 - আপডেট(0, 4, 2) ={2, 2, 2, 2, 2, 4, 4}Q3 - যোগফল(2, 5) =2+2+2+4 =10

এই সমস্যাটি সমাধান করার জন্য একটি নিষ্পাপ পন্থা হবে প্রতিটি আপডেট ক্যোয়ারীতে অ্যারে আপডেট করা এবং তারপর যোগফল খুঁজে বের করা কিন্তু এটি এতটা কার্যকর নয় তাই আসুন সমস্যা সমাধানের আরও কার্যকর পদ্ধতি শিখি।

যোগফলের প্রশ্নে আপডেট কোয়েরির প্রভাব দেখা যাক। যোগফলের প্রশ্ন হল যোগফল[l,r] ফর্মের, আমরা এটিকে বিভক্ত করব সমষ্টি [0,k] ফর্মের যোগফলের প্রশ্নে এবং তারপর যোগফলকে যোগফল থেকে নিম্ন সীমাতে বিয়োগ করব।

 যোগফল[l,r] =যোগফল[0,r] - যোগফল[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 নেমস্পেস ব্যবহার করে std;int getSum(int BITree[], int i){ int sum =0; i++; যখন (i>0) { যোগফল +=BITree[i]; i -=i &(-i); } রিটার্ন যোগ;} void updateBITree(int BITree[], int n, int i, int val) { i =i + 1; যখন (i <=n) { BITree[i] +=val; i +=i &(-i); }}অকার্যকর আপডেট(int BITTree1[], int BITTree2[], int n, int l, int r, int মান) { 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[]) { রিটার্ন (getSum(BITTree1, x) * x) - getSum(BITTree2, x) int n) { int *BITree =নতুন int[n+1]; জন্য (int i=1; i<=n; i++) BITree[i] =0; BITree;}int main(){int n =7; int *BITTree1, *BITTree2; BITTree1 =createBITree(n); BITTree2 =createBITree(n); আপডেট(BITTree1,BITTree2,n,3,6,9); আপডেট (BITTree1, BITTree2, n, 0, 4, 5); cout<<"সমস্ত আপডেট কোয়েরি প্রয়োগ করার পর যোগফলের আউটপুট হল \t" < 

আউটপুট

সমস্ত আপডেট প্রশ্ন প্রয়োগ করার পরে যোগফলের আউটপুট হল

  1. C++ এ বাইনারি ট্রিতে সর্বোচ্চ স্তরের যোগফল খুঁজুন

  2. C++ এ বাইনারি ট্রি সিরিয়ালাইজ এবং ডিসিরিয়ালাইজ করুন

  3. C++ এ বাইনারি ট্রিতে সর্বাধিক সর্পিল যোগফল

  4. C++ এ বাইনারি ট্রিতে সর্বোচ্চ উল্লম্ব যোগফল খুঁজুন