डेटा संरचनाओं के किस वर्ग को लगातार बनाया जा सकता है?


19

लगातार डेटा संरचनाएं अपरिवर्तनीय डेटा संरचनाएं हैं। उन पर संचालन डेटा संरचना की एक नई "प्रतिलिपि" लौटाता है, लेकिन ऑपरेशन द्वारा बदल दिया जाता है; पुरानी डेटा संरचना अपरिवर्तित बनी हुई है। दक्षता आमतौर पर कुछ अंतर्निहित डेटा को साझा करने और डेटा संरचना की पूरी नकल से बचने के द्वारा पूरा किया जाता है।

प्रशन:

  • क्या डेटा संरचनाओं के वर्गों के बारे में परिणाम हैं जो लगातार बनाए जा सकते हैं (समान या बहुत समान जटिलताओं को रखते हुए)?

  • क्या सभी डेटा संरचनाओं को लगातार बनाया जा सकता है (जबकि समान या बहुत समान जटिलताओं को रखते हुए)?

  • क्या किसी भी डेटा संरचना को ज्ञात किया जा सकता है जो स्थिर नहीं हो सकती (जबकि समान या बहुत ही समान जटिलताएं रखते हुए)?


1
आप एक यादृच्छिक तत्व तक पहुंचने के लिए संरक्षित ओ (1) जटिलता के साथ एक वेक्टर को स्थायी नहीं बना सकते हैं।
स्मोसेन


2
@smossen क्या आप यह साबित कर सकते हैं?
Realz Slaw

1
आपका पहला प्रश्न बहुत व्यापक प्रश्न है। डेटा संरचनाओं के विषय पर कई परिणाम हैं जिन्हें लगातार बनाया जा सकता है। व्यक्ति इस विषय पर एक पूरी पुस्तक लिख सकता है, और कुछ लोगों के पास: उदाहरण के लिए, ओकासाकी की पुस्तक इस विषय पर एक क्लासिक है। क्या आपने इस विषय पर कुछ शोध किया है? क्या आप सवाल को कम कर सकते हैं? जैसा कि यह खड़ा है, मुझे संदेह है कि यह इस साइट के लिए एक अच्छा फिट होने के लिए बहुत व्यापक हो सकता है। शायद एक अलग सवाल के लिए 3 सवाल विभाजित?
DW

@ रेलाज़ स्लाव: मैं इसे औपचारिक रूप से साबित नहीं कर सकता, लेकिन मुझे लगता है कि यह सामान्य ज्ञान है। वैक्टर (हैश टेबल सहित) में तत्वों के लिए ओ (1) किसी दिए गए हार्डवेयर पर पता डिकोडिंग के लिए निश्चित समय पर निर्भर करता है। सदिश सूचकांक के अलावा दृढ़ता एक या दो आयाम जोड़ती है। लेकिन हार्डवेयर पते अभी भी एक आयामी हैं।
स्मोसेन

जवाबों:


23

सकारात्मक परिणाम: दृढ़ता बहुत अधिक खर्च नहीं करती है। एक दिखा सकता है कि प्रत्येक डेटा संरचना को पूरी तरह से एक मंदी के साथ पूरी तरह से स्थिर बनाया जा सकता है ।O(lgn)

प्रमाण: आप एक सरणी ले सकते हैं और इसे मानक डेटा संरचनाओं (उदाहरण के लिए, एक संतुलित बाइनरी ट्री) का उपयोग करके लगातार बना सकते हैं; इस उत्तर के अंत को थोड़ा और विस्तार से देखें)। यह स्लोडाउन को बढ़ाता है: प्रत्येक एरे एक्सेस का उपयोग लगातार डेटा संरचना के साथ O ( lg n ) समय लेता है , इसके बजाय O ( 1 ) टाइम नॉन-परसेंटेज एरे के लिए। अब किसी भी अनिवार्य एल्गोरिथ्म को लें जिसका रैम मॉडल में चलने का समय हे ( f ( n ) ) है , जहां n उपयोग की गई मेमोरी की मात्रा को दर्शाता है। स्मृति के सभी एक बड़े सरणी (के साथ) के रूप में प्रतिनिधित्व करते हैंO(lgn)O(lgn)O(1)O(f(n))n तत्व), और इसे लगातार मानचित्र का उपयोग करके लगातार बनायें। अत्यावश्यक एल्गोरिथ्म का प्रत्येक चरण सबसे अधिक O ( lg n ) मंदी पर चलता है, इसलिए कुल चलने का समय O ( f ( n ) lg n ) हैnO(lgn)हे((n)एलजीn)

जाहिरा तौर पर यह थोड़ा बेहतर करना संभव है: जाहिर है कि (अपेक्षित समय, परिशोधन समय) में मंदी के कारक को कम किया जा सकता है, नीचे दिए गए डेइन पेपर में तकनीकों का उपयोग करते हुए - लेकिन मैं विवरण से परिचित नहीं हूं उस काम के लिए, इसलिए मैं खुद इसके लिए प्रतिज्ञा नहीं कर सकता। इस अवलोकन के लिए jbapple का धन्यवाद।हे(एलजीएलजीn)


नकारात्मक परिणाम: आप कुछ डेटा संरचनाओं के लिए, कुछ मंदी से बच नहीं सकते। आपके तीसरे प्रश्न का उत्तर देने के लिए, वहाँ डेटा संरचनाएँ मौजूद हैं जहाँ यह ज्ञात है कि उन्हें लगातार बनाए रखना कुछ मंदी का परिचय देता है।

विशेष रूप से, तत्वों की एक सरणी पर विचार करें । दृढ़ता के बिना, प्रत्येक ऐरे एक्सेस ( 1 ) समय (रैम मॉडल में) लेता है । दृढ़ता के साथ, यह स्पष्ट रूप से दिखाया गया है कि यादृच्छिक तत्व तक पहुंचने के लिए ( 1 ) सबसे खराब स्थिति के साथ एक लगातार सरणी बनाने का कोई तरीका नहीं है । विशेष रूप से, जाहिरा तौर पर एक कम बाउंड दिखा रहा है कि पूरी तरह से लगातार सरणियों में l ( lg lg n ) एक्सेस समय होना चाहिए । यह निम्न सीमा निम्नलिखित कागज के p.3 पर मुखर है:nहे(1)हे(1)Ω(एलजीएलजीn)

निचली बाउंड का श्रेय मिहाई पतरास्कु को दिया जाता है, लेकिन ऐसे स्रोत का कोई उद्धरण नहीं है जो इस दावे के प्रमाण का विवरण देता है।


अनुसंधान का एक समृद्ध क्षेत्र। यदि हम एक मनमाना डेटा संरचना या एल्गोरिथ्म लेते हैं, तो यह एक नाजुक सवाल है कि क्या आप इसे सबसे अधिक मंदी के साथ लगातार बना सकते हैं या नहीं। मैं किसी भी सामान्य वर्गीकरण प्रमेय के बारे में नहीं जानता। हालांकि, विशिष्ट डेटा संरचनाओं को लगातार बनाने के तरीकों में एक कुशल तरीके से बहुत सारे शोध हैं।हे(1)

कार्यात्मक प्रोग्रामिंग भाषाओं के साथ एक मजबूत संबंध भी है। विशेष रूप से, प्रत्येक डेटा संरचना जिसे विशुद्ध रूप से कार्यात्मक तरीके से लागू किया जा सकता है (कोई म्यूटेशन के साथ) पहले से ही एक स्थायी डेटा संरचना है। (आक्षेप आवश्यक रूप से मामला नहीं है, अफसोस।) यदि आप अपनी आँखों को निचोड़ना चाहते हैं, तो आप इसे आंशिक वर्गीकरण प्रमेय के कुछ कमजोर प्रकारों के रूप में ले सकते हैं: यदि यह एक विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग भाषा में लागू होता है जिसमें एक ही समय सीमा होती है। एक अनिवार्य भाषा है, तो एक ही समय के साथ एक निरंतर डेटा संरचना होती है जो गैर-लगातार एक के रूप में होती है। मुझे पता है कि यह वह नहीं है जो आप ढूंढ रहे थे - यह ज्यादातर स्थिति का केवल एक तुच्छ पुन: अध्ययन है।


कैसे एक निरंतर सरणी बनाने के लिए। मैं सबसे खराब स्थिति वाले समय के साथ एक पूरी तरह से लगातार सरणी बनाने के लिए निर्माण का वर्णन करने की कोशिश नहीं करूंगा । हालांकि, मूल विचार बहुत जटिल नहीं हैं, इसलिए मैं विचारों के सार को संक्षेप में बताऊंगा।O(lgn)

मूल विचार यह है कि हम किसी भी बाइनरी ट्री डेटा संरचना को ले सकते हैं, और पथ प्रतिलिपि बनाने वाली तकनीक का उपयोग करके इसे लगातार बना सकते हैं । चलो कहते हैं कि हम एक द्विआधारी पेड़ है, और हम कुछ पत्ती में मूल्य को संशोधित करना चाहते । हालांकि, दृढ़ता के लिए, हम उस पत्ती के स्थान पर मूल्य को संशोधित करने का साहस नहीं करते हैं। इसके बजाय, हम उस पत्ते की एक प्रति बनाते हैं, और कॉपी में मूल्य को संशोधित करते हैं। फिर, हम इसके अभिभावक की एक प्रति बनाते हैं, और नए पत्ते को इंगित करने के लिए उपयुक्त चाइल्ड पॉइंटर को कॉपी में बदलते हैं। इस तरह से आगे बढ़ें, प्रत्येक नोड को रूट से लीफ तक के पथ पर क्लोनिंग करें। यदि हम गहराई d पर एक पत्ती को संशोधित करना चाहते हैं , तो इसके लिए d नोड्स की प्रतिलिपि बनाने की आवश्यकता होती है ।dd

यदि हमारे पास एक संतुलित बाइनरी ट्री में नोड्स हैं, तो सभी पत्तियों में गहराई O ( lg n ) है , इसलिए बाइनरी ट्री पर इस ऑपरेशन में O ( lg n ) समय लगता है। कुछ विवरण हैं जो मैं स्किप कर रहा हूं - O ( lg n ) सबसे खराब स्थिति के समय को प्राप्त करने के लिए , हमें पेड़ को संतुलित करने के लिए इसे संतुलित बनाए रखने की आवश्यकता हो सकती है - लेकिन इससे इसका पता चलता है।nO(lgn)O(lgn)O(lgn)

आप निम्न संसाधनों पर सुंदर चित्रों के साथ अधिक स्पष्टीकरण पा सकते हैं:

  • Http://toves.org/books/persist/index.html पर "बाइनरी सर्च ट्री" और "रैंडम-एक्सेस स्ट्रक्चर्स" (विशेष रूप से ट्री मेथड) लेबल वाले सेक्शन पढ़ें ।

  • या, http://netcode.ru/dotnet/?artID=6592#BinaryTrees और उसके बाद के कुछ खंड पढ़ें ।

  • या, ऊपर उल्लिखित डेमियन पेपर के "कार्यात्मक डेटा संरचनाएं" और "पथ की प्रतिलिपि बनाना" (p.4 पर शुरू) लेबल किए गए अनुभागों को पढ़ें: http://erikdemaine.org/papers/ConfluentTries_Algorithmica/paper.pdf

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


मैं वास्तव में पहले पैराग्राफ को नहीं समझता, लाल-काले पेड़ का उपयोग करके एक सरणी को लगातार बनाने के बारे में मैं कैसे जाऊंगा?
जी। बाच

@ G.Bach, वहाँ वर्गों "बाइनरी खोज पेड़" और "यादृच्छिक-अभिगम संरचनाओं" (विशेष रूप से, पेड़ विधि) पर लेबल में एक बहुत अच्छी व्याख्या दी गई है toves.org/books/persist/index.html । अन्य अच्छे विवरण के लिए, netcode.ru/dotnet/?artID=6592#BinaryTrees और उसके बाद के कुछ अनुभाग देखें। जो आपको मुख्य विचार देगा। विवरण इस प्रश्न के दायरे से बाहर हैं, लेकिन यह सभी मानक सामान हैं; मैं आपको एक अलग प्रश्न पूछने के लिए प्रोत्साहित करता हूं यदि आप इस तरह की डेटा संरचना का निर्माण करने के बारे में अधिक जानकारी चाहते हैं।
DW

4
O(lglgn)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.