मान लीजिए कि आपके पास एक खाली सरणी है:
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
पिछली श्रेणी के अपडेट के लिए वांछित BIT1 और BIT2 मान प्राप्त करने के लिए, हम 3 रेंज अपडेट करते हैं:
BIT1 के लिए हमें 3.5 से लेकर सूचकांकों तक +5 की एक श्रेणी अपडेट करने की आवश्यकता है।
हमें BIT2 के लिए सूचकांकों के लिए 3.10 की एक सीमा अद्यतन करने की आवश्यकता है।
हमें BIT2 के लिए -25 से सूचकांक 8..9 तक की रेंज अपडेट करने की आवश्यकता है।
अब एक और परिवर्तन करते हैं। BIT1 और BIT2 के लिए ऊपर दिखाए गए मानों को संग्रहीत करने के बजाय, हम वास्तव में उनके संचयी रकमों को संग्रहीत करते हैं। इससे हम संचयी रकमों में 4 अपडेट करके ऊपर की 3 रेंज अपडेट कर सकते हैं:
BIT1sum[3] += 5
BIT1sum[8] -= 5
BIT2sum[3] += 10
BIT2sum[8] -= 35
सामान्य तौर पर, एक श्रेणी [i..j] में मान v जोड़ने के लिए एल्गोरिथ्म होगा:
BIT1sum[i] += v
BIT1sum[j+1] -= v
BIT2sum[i] += v * (i-1)
BIT2sum[j+1] -= v * j
जहाँ + = और - = सिंटैक्स का अर्थ है उस सूचकांक पर सकारात्मक या नकारात्मक मान के साथ BIT संचयी योग डेटा संरचना को अद्यतन करना। ध्यान दें कि जब आप किसी सूचकांक में BIT संचयी योग को अद्यतन करते हैं, तो यह उस सूचकांक के दाईं ओर सभी सूचकांकों को प्रभावित करता है। उदाहरण के लिए:
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])
फेनविक पेड़ एक द्विआधारी वृक्ष में रकम जमा करते हैं। ऊपर दिखाए गए अपडेट्स को Fenwick ट्री में करना आसान हैओ ( लॉग)n ) समय।
sum[i] = BIT1[i] * i - BIT2[i]
? यह काम करने लगता है लेकिन यह इतना मनमाना लगता है ... क्या अंतर्दृष्टि आपको इस पर आने की अनुमति देती है?