अंतराल और शून्य संख्या की क्वेरी पर अपडेट के लिए डेटा संरचना


13

मैं एक डेटा संरचना की तलाश कर रहा हूं , जो आकार पूर्णांक तालिका को बनाए रखे , और समय के बाद संचालन को में अनुमति दे ।n O ( लॉग एन )tnO(logn)

  • increase(a,b) , जो बढ़ाता ।t[a],t[a+1],,t[b]
  • decrease(a,b) , जो घटाता ।t[a],t[a+1],,t[b]
  • support() , जो सूचकांकों की संख्या दिखाता है ऐसी है कि ।t [ i ] 0it[i]0

आपके पास वादा है कि घटने वाली प्रत्येक कॉल को पिछले कॉल के साथ मिलान किया जा सकता है ताकि समान मापदंडों के साथ वृद्धि हो । मेरे पास जो एप्लिकेशन है वह समय में गणना करने के लिए एक स्वीपलाइन एल्गोरिथ्म है जो एन दिए गए आयताकार आयतों के मिलन का क्षेत्र है।( एन लॉग एन )a,bO(nlogn)

एक क्वाड-ट्री का आकार , इसलिए यह कोई समाधान नहीं है। फ़ेनविक या इंटरवल पेड़ों में सही स्वाद होता है, लेकिन मैं यह नहीं देखता कि ऊपर दिए गए कार्यों का समर्थन करने के लिए उन्हें कैसे बढ़ाया जाए।Θ(n2)


Fenwick के पेड़ इस वादे का उपयोग नहीं करेंगे कि "हर कॉल को कम करने के लिए एक ही पैरामीटर a, b" के साथ बढ़ाने के लिए पिछले कॉल से मिलान किया जा सकता है, इसलिए उस वादे का उपयोग करते हुए एक सरल समाधान हो सकता है (लेकिन यह मेरे लिए अभी बच जाता है)।
जेरेमी

चूँकि आपके पास जितना इनपुट हो सकता है, वह (आप रिपीट का पता लगा सकते हैं और डेटा संरचना में सम्मिलित नहीं कर सकते हैं), हम अभी भी सामान्य माप ट्री डेटा संरचना का उपयोग करके प्रदर्शन प्राप्त करते हैं। Cosy.sbg.ac.at/~ksafdar/data/courses/SeminarADS/… स्लाइड 47-52 देखें । ( लॉग एन )n2O(logn)
चाओ जू

जेरेमी और चाओ जू। आपकी टिप्पणियों के लिए धन्यवाद। मैं अब समझता हूं कि अंतराल के बदलते सेट के संघ की कुल लंबाई को बनाए रखने के लिए इंटरवल ट्री का उपयोग कैसे किया जा सकता है। यह वास्तव में एक बहुत प्यारा डेटास्ट्रक्चर है।
क्रिस्टोफ ड्यूर

सामान्य डेटा संरचना समस्या के लिए, समय में में खोज करने के लिए स्थान जहाँ , सूची के आकार का होता है निर्देशांक के सक्रिय जोड़े। लेकिन वास्तव स्वीपलाइन एल्गोरिथ्म इसलिए अंतरिक्ष रैखिक रहता है। समस्या अभी भी से बेहतर स्थान वाली डेटा संरचना के लिए खुली है , जब । हे ( पी ) हे ( एन 2 ) पी पी हे ( एन ) ( पी ) पी ω ( एन )log(n2)O(log(n))O(p)O(n2)ppO(n)O(p)pω(n)
जेरेमी

2
यहाँ एक अच्छा लिंक है जहाँ आप उसी समस्या के अन्य समाधानों के खिलाफ अपने कार्यान्वयन का परीक्षण कर सकते हैं: spoj.com/OI/problems/NKMARS
Erel Segal-

जवाबों:


2

एक सेगमेंट ट्री का उपयोग करें - श्रेणी का एक पुनर्संरचनात्मक विभाजन छोटी श्रेणियों में। आपके अपडेट संचालन के प्रत्येक अंतराल को इस पुनरावर्ती विभाजन में श्रेणियों में विभाजित किया जा सकता है। प्रत्येक श्रेणी के लिए स्टोर:[ , बी ] ( लॉग एन ) [ एक्स , वाई ][1,n][a,b]O(logn)[x,y]

  • अंतरालों की संख्या जिसे बढ़ा दिया गया है और ऐसा कम नहीं किया गया है कि उन श्रेणियों में से जिनमें का विभाजन किया गया है[ a , b ] [ x , y ] [ a , b ]c(x,y)[a,b][x,y][a,b]
  • उन कोशिकाओं की संख्या जो अंतराल के विभाजित उपसमूह से आच्छादित नहीं हैं जो पुनरावृत्ति में या निम्न पर हैं[ x , y ]u(x,y)[x,y]

फिर अगर पुनरावर्ती रूप से और में विभाजित हो जाता है तो हमारे पास इसलिए हम निरंतर समय में प्रत्येक मान को अपडेट कर सकते हैं जब अन्य डेटा एक सीमा बदलती है। प्रत्येक समर्थन क्वेरी का उत्तर को देखकर दिया जा सकता है ।[ x , z ] [ z + , w ] u ( x , y ) = { अगर  c ( x , y ) > 0 u ( x , z ) + u ( z + , y ) अन्यथा यू ( एक्स , वाई ) यू ( 1 )[x,y][x,z][z+1,w]

u(x,y)={0if c(x,y)>0u(x,z)+u(z+1,y)otherwise
u(x,y)u(1,n)

वृद्धि प्रदर्शन करने के लिए आपरेशन, विभाजन में पर्वतमाला, वेतन वृद्धि इन सीमाओं से प्रत्येक के लिए, और पुनर्गणना के लिए ऊपर सूत्र का उपयोग इनमें से प्रत्येक पर्वतमाला और उनके प्रत्येक पूर्वज के लिए। कमी ऑपरेशन एक वेतन वृद्धि के बजाय एक वृद्धि के साथ है।[ , बी ] ( लॉग एन ) सी ( एक्स , वाई ) यू ( एक्स , वाई )(a,b)[a,b]O(logn)c(x,y)u(x,y)


मुझे नहीं लगता कि मैं आपकी दूसरी बुलेट को समझता हूं। लेबल वाली सड़ांध के साथ उपप्रकार में , कौन सी कोशिकाएँ पर अंतराल के विभाजन वाले सबसेट द्वारा कवर नहीं की जाती हैं ? क्या पूरी रेंज कवर नहीं है, इसलिए ? [ x , y ] [ x , y ] u ( x , y ) = [x,y][x,y][x,y]u(x,y)=0
jbapple

यह इस बात पर निर्भर करता है कि आपने कौन से ऑपरेशन बढ़ाए हैं। प्रारंभ में उन सभी को उजागर किया जाता है, लेकिन जब आप (या कोई भी अंतराल जो भीतर शुरू या समाप्त होता है , या उसके विभाजन में शामिल होता है) के भीतर एक छोटा अंतराल बढ़ जाता है। [ x , y ] [ x , y ][x,y][x,y][x,y]
डेविड एपपस्टीन

क्या आप एक उदाहरण दे सकते हैं?
जप्‍पल

मान लीजिए कि आपका अंतराल संख्या [1,8] है। इसे पुनरावर्ती रूप से [१,४], [४,,], फिर [१,२], [३,४], [५,६], और [],,] में विभाजित किया गया है, फिर सभी एक-तत्व श्रेणी में हैं। प्रारंभ में, सब कुछ खुला है, सभी c [x, y] = 0, और प्रत्येक श्रेणी में u = इसकी लंबाई है। लेकिन, मान लीजिए कि आप एक वृद्धि [2,6] ऑपरेशन करते हैं। O (लॉग एन) अधिकतम सीमाएं जिनमें [2,6] विघटित हो सकती हैं, [2,2], [3,4] और [5,6] हैं, इसलिए हम उन तीनों के लिए c [x, y] सेट करते हैं सीमाएँ 1. मेरे उत्तर के सूत्र के अनुसार, इसके कारण u [x, y] इन तीनों श्रेणियों के लिए भी 0. u [1,2] हो जाता है 1, u [1,4] भी 1, u [हो जाता है। 5,8] = 2, और यू [1,8] = 1 + 2 = 3
डेविड एपस्टीन

0

आप समय में और का समर्थन और में कर सकते हैं। कमी ( √)increasedecreaseसमर्थनहे(1)O(nlogn)supportO(1)मुख्य विचार आकार समूहों में तालिका को तोड़ना है । तब प्रत्येक संशोधित ऑपरेशन ( या ) अधिकांश समूहों पर संचालित होता है , और केवल इसकी सीमा के अंत में ( और , आपके निर्माण में) समय लेने के लिए ।वृद्धिकमीहे(Θ(n)increasedecreaseएकω(लॉगएन)O(n)abω(logn)


इस दृष्टिकोण को सीमा तक क्यों नहीं ले जाते। बाल्टियों में बाल्टी लगाने के बजाय, हम इसके विपरीत एक पेड़ बना सकते हैं: 1 / \ 2 3 / \ / 4 5 6 7, जिनमें से अद्यतन करके, आप लेते हैं सभी परिचालनों के लिए। (लॉगएन)O(n)O(logn)
एस। पीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.