ধরুন আপনার খালি অ্যারে ছিল:
0 0 0 0 0 0 0 0 0 0 (array)
0 0 0 0 0 0 0 0 0 0 (cumulative sums)
এবং আপনি +5 থেকে [3.7] এর একটি পরিসীমা আপডেট করতে চেয়েছিলেন:
0 0 0 5 5 5 5 5 0 0 (array)
0 0 0 5 10 15 20 25 25 25 (desired cumulative sums)
আপনি কীভাবে 2 বাইনারি সূচকযুক্ত গাছ ব্যবহার করে কাঙ্ক্ষিত ক্রমসংখ্যাটি সঞ্চয় করতে পারেন?
কৌশলটি হ'ল দুটি বাইনারি সূচকযুক্ত গাছ, বিআইটি 1 এবং বিআইটি 2 ব্যবহার করা, যেখানে তাদের সামগ্রীর থেকে সংযোজিত যোগফল গণনা করা হয়। এই উদাহরণে, আমরা দুটি গাছের মধ্যে যা সঞ্চয় করতাম তা এখানে:
0 0 0 5 5 5 5 5 0 0 (BIT1)
0 0 0 10 10 10 10 10 -25 -25 (BIT2)
এটির জন্য sum[i]
, আপনি এটি গণনা করুন:
sum[i] = BIT1[i] * i - BIT2[i]
উদাহরণ স্বরূপ:
sum[2] = 0*2 - 0 = 0
sum[3] = 5*3 - 10 = 5
sum[4] = 5*4 - 10 = 10
...
sum[7] = 5*7 - 10 = 25
sum[8] = 0*8 - (-25) = 25
sum[9] = 0*9 - (-25) = 25
পূর্ববর্তী পরিসরের আপডেটের জন্য কাঙ্ক্ষিত বিআইটি 1 এবং বিআইটি 2 মান অর্জন করতে আমরা 3 টি ব্যাপ্তি আপডেট করি:
বিআইটি 1 এর জন্য আমাদের সূচকগুলির 3.5 থেকে +5 এর একটি পরিসীমা আপডেট করতে হবে।
বিআইটি 2 এর জন্য আমাদের সূচকগুলির 3.10 থেকে + 10 এর একটি পরিসীমা আপডেট করতে হবে।
বিআইটি 2 এর জন্য আমাদের সূচি 8 -9 এর 25-এর পরিসীমা আপডেট করতে হবে।
এখন আরও একটি রূপান্তর করা যাক। বিআইটি 1 এবং বিআইটি 2 এর জন্য উপরের দেখানো মানগুলি সংরক্ষণ করার পরিবর্তে আমরা আসলে তাদের সংখ্যার যোগফলগুলি সঞ্চয় করি। এটি আমাদের সম্মিলিত অঙ্কের 4 টি আপডেট করে 3 টি রেঞ্জের আপডেটগুলি করতে দেয়:
BIT1sum[3] += 5
BIT1sum[8] -= 5
BIT2sum[3] += 10
BIT2sum[8] -= 35
সাধারণভাবে, একটি সীমাতে v মান যোগ করার আলগোরিদিম [i..j] হ'ল:
BIT1sum[i] += v
BIT1sum[j+1] -= v
BIT2sum[i] += v * (i-1)
BIT2sum[j+1] -= v * j
যেখানে + = এবং - = বাক্য গঠনটি কেবলমাত্র সেই সূচকটিতে ধনাত্মক বা নেতিবাচক মান সহ বিআইটি সংশ্লেষক সমষ্টি ডেটা স্ট্রাকচার আপডেট করে। নোট করুন যে আপনি যখন কোনও সূচকে বিআইটি সংযোজিত যোগফলটি আপডেট করেন তখন তা সূচকটির ডানদিকে সমস্ত সূচককে স্পষ্টতই প্রভাবিত করে। উদাহরণ স্বরূপ:
0 0 0 0 0 0 0 0 0 0 (original)
BITsum[3] += 5
0 0 0 5 5 5 5 5 5 5 (after updating [3])
BITsum[8] -= 5
0 0 0 5 5 5 5 5 0 0 (after updating [8])
ফেনউইক ট্রি একটি বাইনারি গাছে অঙ্কের সঞ্চয় করে। উপরে কোনও ফেনউইক ট্রিতে উপরে প্রদর্শিত আপডেটগুলি করা সহজও ( লগএন ) সময়।
sum[i] = BIT1[i] * i - BIT2[i]
? এটি কাজ করে বলে মনে হচ্ছে তবে এটি নির্বিচারে মনে হচ্ছে ... কী অন্তর্দৃষ্টি আপনাকে এখানে আসতে দেয়?