RMQ problem के लिए द्विआधारी अनुक्रमित पेड़ का उपयोग करना तो जैसे बढ़ाया जा सकता है:एक RMQ विस्तार
को देखते हुए n
पूर्णांकों A
की एक सरणी है।
क्वेरी (एक्स, वाई): दिया दो पूर्णांकों 1 ≤ x
, y
≤ n
, A[x], A[x+1], ... A[y]
की न्यूनतम प्राप्त होता है;
अद्यतन (एक्स, v): एक पूर्णांक v
और 1 ≤ x
≤ n
A[x] = v
कर दिया।
segment trees का उपयोग कर दोनों परिचालनों के लिए इस समस्या को O(log n)
में हल किया जा सकता है।
यह कागज पर एक कुशल समाधान है, लेकिन व्यावहारिक रूप से, सेगमेंट पेड़ में बहुत अधिक उपर है, विशेष रूप से यदि पुनरावर्ती रूप से कार्यान्वित किया जाता है।
मुझे इस तथ्य के बारे में पता है कि द्विआधारी अनुक्रमित पेड़ (अधिक संसाधन मिल सकते हैं, लेकिन this का उपयोग करके, संचालन के एक (या दोनों, मुझे यकीन नहीं है) के लिए O(log^2 n)
में समस्या का समाधान करने का कोई तरीका है। this क्रमशः सबसे संक्षिप्त और संपूर्ण, आईएमओ हैं)। n
के मानों के लिए यह समाधान, स्मृति में फिट है, अभ्यास में तेज़ है, क्योंकि बीआईटी के पास बहुत कम ओवरहेड है।
हालांकि, मुझे नहीं पता कि बीआईटी संरचना का उपयोग दिए गए कार्यों को करने के लिए कैसे किया जाता है। मुझे केवल यह पता है कि उदाहरण के लिए अंतराल राशि पूछने के लिए इसका उपयोग कैसे किया जाए। न्यूनतम खोजने के लिए मैं इसका उपयोग कैसे कर सकता हूं?
यदि यह मदद करता है, तो मेरे पास कोड है जो दूसरों ने लिखा है जो मैं पूछ रहा हूं, लेकिन मैं इसका एहसास नहीं कर सकता। यहाँ कोड में से एक इस तरह के टुकड़ा है:
int que(int l, int r) {
int p, q, m = 0;
for(p=r-(r&-r); l<=r; r=p, p-=p&-p) {
q = (p+1 >= l) ? T[r] : (p=r-1) + 1;
if(a[m] < a[q])
m = q;
}
return m;
}
void upd(int x) {
int y, z;
for(y = x; x <= N; x += x & -x)
if(T[x] == y) {
z = que(x-(x&-x) + 1, x-1);
T[x] = (a[z] > a[x]) ? z : x;
}
else
if(a[ T[x] ] < a[ y ])
T[x] = y;
}
उपरोक्त कोड में, T
0 के साथ आरंभ नहीं हो जाता, a
दिया सरणी, N
इसके आकार और upd
(वे जो भी कारण के लिए 1 से इंडेक्सिंग करते हैं) पर कहा जाता है पहले प्रत्येक पढ़ने के मूल्य के लिए। upd
से पहले a[x] = v
को निष्पादित किया जाता है।
इसके अलावा, p & -p
कुछ बीआईटी स्रोतों में p^(p & (p - 1))
जैसा ही है और इंडेक्सिंग शून्य से शुरू होने वाले शून्य तत्व के साथ 1 से शुरू होता है।
क्या कोई बता सकता है कि ऊपर दिए गए कार्यों या मैं बीआईटी के साथ दी गई समस्या को कैसे हल कर सकता हूं?
'के लिए (y = x; x <= N; x + = x & -x) 'यह गहरा है। बीटीडब्ल्यू 'टी [] 'क्या है? बीटीडब्लू 2: मुझे यकीन नहीं है कि यह 'y (x = x; x
wildplasser
@ विल्डप्लेसर - कि पहले 'के लिए' वास्तव में बीआईटी के लिए काफी मानक है। ऐसा लगता है कि बीआईटी जानकारी वास्तव में आयोजित की जाती है। 'एन' के लिए, यह मेरी समस्या कथन में' n' है, मैं इसे संपादित कर दूंगा। – IVlad