क्या त्वरित सूची में हेरफेर और प्रश्नों के लिए डेटा संरचना मौजूद है?


9

हमारे पास सेट से तत्वों की सूचियों का एक सेट , है । से प्रत्येक तत्व में एक सूची में दिखाई देता है । मैं एक डेटा संरचना की तलाश कर रहा हूं जो निम्नलिखित अपडेट कर सके:LN={1,2,3,...,n}NL

  1. concat(x,y) : सूची को समाहित करता है जिसमें युक्त सूची के अंत में होता हैyx

  2. split(x) : युक्त सूची विभाजन के बाद सीधेxx

इसके लिए निम्नलिखित प्रश्नों को करने की आवश्यकता है:

  1. follows(x,y) : रिटर्न अगर और एक ही सूची में हैं और के बाद आता है (लेकिन जरूरी नहीं के निकट है )truexyyxx

  2. first(x) : सूची का पहला तत्व देता है जिसमेंx

  3. next(x) : वाले सूची में बाद अगला तत्व देता हैxx

मैं पहले से ही एक डेटा संरचना के साथ आया हूं जो इन अपडेट्स को और समय में क्वेरी करता है। मैं ज्यादातर इस बात में दिलचस्पी रखता हूं कि पहले से ही कोई डेटा स्ट्रक्चर है या नहीं जो यह कर सकता है (उम्मीद है कि तेजी से?)।O(lg2(n))O(lg(n))

अभिप्रेरण: जड़ वाले निर्देशित जंगलों को इनमें से दो सूची सेटों के साथ दर्शाया जा सकता है और वे ऐसे जंगलों में पुन: स्थापन की त्वरित गणना की अनुमति देते हैं। मैं यह देखना चाहता हूं कि इनका और क्या उपयोग किया जा सकता है और यदि यह सब पहले से ही ज्ञात है।

जवाबों:


11

स्किप सूची में अपने पूर्णांक रखें। सामान्य स्किप सूचियों को कुंजी द्वारा आदेश दिया जाता है, लेकिन हम सिर्फ अनुक्रमों के प्रतिनिधित्व के रूप में उनका उपयोग करेंगे। इसके अतिरिक्त, आकार के संकेत की एक सरणी बनाए रखें । सरणी के प्रत्येक तत्व को एक स्किप सूची में नोड को इंगित करना चाहिए। मेरा मानना है कि यह समर्थन करता है में और अन्य सभी कार्यों ।nnextO(1)O(lgn)

विशेष रूप से:

  • concat आईएनजी या टिंग टू स्किप लिस्ट में समय लगता है और इसलिए अधिकांश पॉइंटर्स पर अमान्य हो जाता है ।splitहे(एलजीn)हे(एलजीn)
  • nएक्सटी बस समय लेते हुए, पत्ते के स्तर पर आगे के सूचक का अनुसरण करता है।हे(1)
  • मैंआररोंटी समय लेता है : पॉइंटर्स का पालन करें जब तक आप अटक नहीं जाते हैं, तब एक बाएं पॉइंटर का पालन करें। जब आप किसी भी अधिक बाईं ओर का अनुसरण नहीं कर सकते हैं, तो आप अपनी स्किप सूची के मुख्य सूचक पर हैं। पत्ती के लिए नीचे पॉइंटर्स का पालन करें, फिर एक फॉरवर्ड पॉइंटर। यह सूची में पहला तत्व है।हे(एलजीn)
  • एलएलwरों कुछ हद तक जटिल काम है। लिए तरह आगे बढ़ें , लेकिन उन मूल्यों की एक सूची रिकॉर्ड करें जहाँ आप अटक जाते हैं (यानी, जहाँ आप पॉइंटर्स का अनुसरण नहीं कर सकते हैं)। हम इस सूची को आप "ट्रेस" रिकॉर्ड करेंगे। लिए भी ऐसा ही करें, लेकिन सही पॉइंटर्स का पालन करें जब आप अटक जाते हैं, तो बाएं नहीं। यदि पहले से , तो उनके निशान प्रतिच्छेद करेंगे। निशान आकार के हैं । यदि ट्रेस में प्रत्येक तत्व को अटक स्तर के साथ एनोटेट किया जाता है, तो हम समय चौराहे के लिए में जांच कर सकते हैं ।मैंआररोंटीyएक्सएक्सyहे(एलजीn)हे(एलजीn)

nएक्सटी सबसे खराब स्थिति वाला , अन्य सभी उच्च संभावना वाले । निर्धारक स्किप सूचियों का उपयोग करके उन्हें सबसे खराब स्थिति में बनाया जा सकता है।हे(1)हे(एलजीn)

मुझे लगता है कि पत्ती-स्तर-जुड़े (2,5) पेड़ों का उपयोग करके और रीढ़ को बढ़ावा देकर, को बनाया जा सकता है । बूटस्ट्रैपिंग ट्रिक के लिए, कपलान और टार्जन द्वारा " शुद्ध रूप से छांटे जाने योग्य सूचियों का कार्यात्मक प्रतिनिधित्व " देखें ।सीnसीटीहे(एलजीएलजीn)


ठंडा। मैं सूचियों को छोड़ने के बारे में सोच रहा था, लेकिन यह नहीं देख सकता था कि संबंधित प्रमुख मूल्यों के बिना कैसे पालन किया जाए।
साशो निकोलेव

यह भी खूब रही; मैं देखता हूं कि सभी अपडेट्स को कैसे नियत किया जाएहे(एलजी(n)), कौन सा अच्छा है। ओ (lg lg (n)) समझने के लिए मुझे पढ़ते रहना होगा। @Jbapple पोस्ट के लिए धन्यवाद।
bbejot

1

कम से कम आम पूर्वज : समस्या गतिशील निहित पेड़ों में गम्यता समस्या हल करने के लिए है, इसलिए मुझे लगता है कि आप निम्न में भी रुचि हो जाएगा इस्तेमाल किया जा सकता ढूँढना के लिए आम पूर्वज निकटतम गतिशील पेड़ में इष्टतम एल्गोरिदम , Alstrup और Thorup द्वारा। यह पेपर एक समय सीमा देता हैहे(n+लॉगलॉगn) के लिये n लिंक और एक पॉइंटर मशीन पर nca क्वेरीज़।


संदर्भ के लिए धन्यवाद। निकटतम सामान्य पूर्वज समस्या निश्चित रूप से पेड़ों में पुनरावृत्ति को हल करती है। आप जिस पेपर से जुड़े हैं, वह एक वृद्धिशील पेड़ का वर्णन करता है जिसमें सभी ऑपरेशन शामिल हैंहे(एलजीएलजी(n))समय। मुझे आश्चर्य है कि अगर यह पूरी तरह से गतिशील पेड़ों के साथ-साथ काम करने के लिए सुधार किया जा सकता है।
bbejot
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.