अद्यतन: यह प्रश्न 8 जून 2012 को मेरे ब्लॉग का विषय था । महान प्रश्न के लिए धन्यवाद!
बड़ा सवाल है। हमने उन मुद्दों पर बहस की, जो आप लंबे समय से उठाते हैं।
हम चाहते हैं कि एक डेटा संरचना हो जिसमें निम्नलिखित विशेषताएं हों:
- अपरिवर्तनीय।
- एक वृक्ष का रूप।
- चाइल्ड नोड्स से पैरेंट नोड्स तक सस्ती पहुंच।
- पाठ में एक पेड़ से एक नोड में एक चरित्र ऑफसेट करने के लिए मैप करना संभव है।
- लगातार ।
तक हठ मैं करने की क्षमता का मतलब यह पेड़ में मौजूदा नोड्स के सबसे पुन: उपयोग पाठ संपादित करें बफर करने के लिए किया जाता है। चूंकि नोड्स अपरिवर्तनीय हैं, इसलिए उनका पुन: उपयोग करने में कोई बाधा नहीं है। हमें प्रदर्शन के लिए इसकी आवश्यकता है; हर बार जब आप एक कुंजी दबाते हैं, तो हम फ़ाइल के विशाल वोड्स को फिर से पार्स नहीं कर सकते हैं। हमें उस पेड़ के केवल हिस्सों को फिर से लिखने और फिर से पार्स करने की जरूरत है, जो संपादन से प्रभावित थे।
अब जब आप उन पाँचों चीज़ों को एक डेटा संरचना में रखने का प्रयास करते हैं जिन्हें आप तुरंत समस्याओं में चलाते हैं:
- आप पहली जगह में एक नोड का निर्माण कैसे करते हैं? माता-पिता और बच्चा दोनों एक-दूसरे का उल्लेख करते हैं, और अपरिवर्तनीय हैं, इसलिए कौन सा पहले निर्मित होता है?
- मान लीजिए कि आप उस समस्या को हल करने का प्रबंधन करते हैं: आप इसे कैसे बनाए रखते हैं? आप एक अलग अभिभावक में एक बच्चे के नोड का फिर से उपयोग नहीं कर सकते क्योंकि इसमें बच्चे को यह बताना शामिल होगा कि उसका नया माता-पिता है। लेकिन बच्चा अपरिवर्तनीय है।
- मान लें कि आप उस समस्या को हल करने का प्रबंधन करते हैं: जब आप संपादन बफ़र में एक नया वर्ण सम्मिलित करते हैं, तो उस बिंदु के बाद स्थिति में मैप किए गए प्रत्येक नोड की पूर्ण स्थिति । यह लगातार डेटा संरचना बनाने के लिए बहुत मुश्किल बनाता है, क्योंकि कोई भी संपादन अधिकांश नोड्स के स्पैन को बदल सकता है!
लेकिन रोजलिन टीम पर हम असंभव चीजों को नियमित करते हैं। हम वास्तव में दो तोते के पेड़ रखकर असंभव को पूरा करते हैं। "हरा" पेड़ अपरिवर्तनीय है, लगातार है, इसका कोई माता-पिता संदर्भ नहीं है, इसे "नीचे-ऊपर" बनाया गया है, और प्रत्येक नोड इसकी चौड़ाई को ट्रैक करता है, लेकिन इसकी पूर्ण स्थिति नहीं है । जब एक सम्पादन होता है, तो हम केवल उस हरे पेड़ के कुछ हिस्सों को फिर से बनाते हैं, जो कि सम्पादन से प्रभावित थे, जो आम तौर पर पेड़ में कुल पार्स नोड्स के O (लॉग एन) के बारे में होता है।
"लाल" पेड़ एक अपरिवर्तनीय मुखौटा है जो हरे पेड़ के चारों ओर बनाया गया है; यह मांग पर "टॉप-डाउन" बनाया गया है और हर संपादन पर फेंक दिया गया है। यह माता-पिता के संदर्भों की गणना मांग के आधार पर करके करता है क्योंकि आप ऊपर से पेड़ से नीचे उतरते हैं । यह चौड़ाई से पूरी तरह से स्थिति का निर्माण करता है, फिर से, जैसा कि आप नीचे उतरते हैं।
आप, उपयोगकर्ता, केवल कभी लाल पेड़ देखते हैं; हरे पेड़ एक कार्यान्वयन विवरण है। यदि आप एक पार्स नोड के आंतरिक स्थिति में सहकर्मी हैं, तो आप वास्तव में देखेंगे कि एक अलग प्रकार के एक अन्य पार्स नोड का संदर्भ है ; वह हरे वृक्ष का वृक्ष है।
संयोग से, इन्हें "लाल / हरे पेड़" कहा जाता है क्योंकि वे व्हाइटबोर्ड मार्कर रंग थे जिनका उपयोग हम डिज़ाइन मीटिंग में डेटा संरचना को आकर्षित करने के लिए करते थे। रंगों का कोई अन्य अर्थ नहीं है।
इस रणनीति का लाभ यह है कि हम उन सभी महान चीजों को प्राप्त करते हैं: अपरिवर्तनीयता, दृढ़ता, माता-पिता के संदर्भ, और इसी तरह। लागत यह है कि यह प्रणाली जटिल है और बहुत सारी मेमोरी का उपभोग कर सकती है यदि "लाल" facades बड़े हो जाते हैं। हम वर्तमान में प्रयोग कर रहे हैं यह देखने के लिए कि क्या हम लाभ को खोए बिना कुछ लागत को कम कर सकते हैं।