data structures - पाठ संपादक सिद्धांत




data-structures editor (8)

पाठ सम्मिलन का प्रबंधन कैसे करें (यदि आपके पास 100 एमबी फ़ाइल है और एक्स स्थिति में एक char जोड़ना चाहते हैं, तो आप केवल विशाल टेक्स्ट ब्लॉक को याद नहीं कर सकते ...)।

टेक्स्ट फ़ाइल को एक लिंक की गई सूची बनाएं, जहां प्रत्येक पंक्ति एक प्रविष्टि है।

चूंकि मैं हमेशा मौजूदा संपादकों से असंतुष्ट हूं, एक परियोजना जिसे मैं हमेशा शुरू करना चाहता हूं वह मेरा स्वयं का टेक्स्ट एडिटर है। हालांकि पाठ संपादन करना गंभीर व्यवसाय है।

मौजूदा पाठ संपादकों के स्रोत कोड का विश्लेषण करने के अलावा, क्या इस विषय के बारे में कोई पुस्तक या अन्य संसाधन (अकादमिक कार्य की तरह) है? मुझे विशेष रूप से कुछ ऐसा लगता है जो स्मृति को संभालने और पाठ सम्मिलन को प्रबंधित करने का तरीका सिखाता है (यदि आपके पास 100 एमबी फ़ाइल है और एक्स स्थिति में एक char जोड़ना चाहते हैं, तो आप केवल विशाल टेक्स्ट ब्लॉक को memmove नहीं कर सकते ... )।


अनुरोध द्वारा उत्तर देने के लिए प्रचारित:

कर्नीघान और प्लोगर द्वारा प्राचीन " सॉफ्टवेयर टूल्स इन पास्कल " एक भाषा में ed एडिटर लागू करता है जिसमें न तो वास्तविक तार और न ही पॉइंटर्स होते हैं। इसमें डिजाइन विचारों का एक शानदार अवलोकन शामिल है जो किसी भी टेक्स्ट एडिटर को रेखांकित करता है।


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

सामान्य नियंत्रण (कर्सर बाएं, दाएं, ऊपर, नीचे, पेज अप, पेज डाउन) दिया गया है, जो आमतौर पर आपके द्वारा सौदा किया जाने वाला सबसे बड़ा कदम एक समय में एक पृष्ठ होता है, जो आमतौर पर कीबोर्ड दोहराने से थोड़ा तेज़ संभालना आसान होता है। यह निश्चित रूप से थोड़ा धीमा हो सकता है यदि आपके पास वास्तव में बड़ी फ़ाइल और "गोटो लाइन" कमांड है, या उस क्रम पर कुछ है। यदि आप इसमें बहुत कुछ करने जा रहे हैं, तो निस्संदेह बेहतर संरचनाएं उपयोग करने के लिए हैं ...


खैर यदि आप जानते हैं कि सामान्य लोगों में अपेक्षाकृत कुछ सम्मिलित बिंदु होंगे, तो आप अपने मूल पाठ बफर में पॉइंटर्स की एक सरणी रख सकते हैं और जब उपयोगकर्ता इसके अंदर डालने का प्रयास करता है, तो आप शेष को अन्य पॉइंटर को घुमाकर बफर को "विभाजित" करते हैं बफर का, पहला पॉइंटर की लंबाई बनाते हुए, इसलिए यह सम्मिलन बिंदु पर रुक जाता है और पाठ के लिए एक तीसरा पॉइंटर जोड़ता है, जैसे कि:

long original text la la la
^                *^
|                 2nd part
1st part

और स्टार एक नए टेक्स्ट बफर में इंगित करता है जहां आप डालने के लिए टेक्स्ट जोड़ना शुरू करते हैं।

जब आप अपनी टेक्स्ट फ़ाइल (या सामान्य पार्स में) प्रस्तुत करते हैं, तो आप पॉइंटर्स की सरणी पर लूप करते हैं और फिर प्रत्येक बफर पर अपना काम करते हैं। बेशक यदि बफर पर्याप्त छोटा है, तो आप एक नया बफर भाग जोड़ना छोड़ देते हैं, लेकिन यह केवल ह्युरिस्टिक्स है, प्रत्येक को आजमाएं और एक ऐसा अनुभव प्राप्त करें जिसके लिए सबसे अच्छा काम करता है।

आप लोड फ़ाइल को लोड पर कई बफर में विभाजित करने पर भी विचार कर सकते हैं, प्रत्येक 1 एमबी या उससे भी ज्यादा कहते हैं, क्योंकि यदि आप एक बफर में फ़ाइल लोड करते हैं तो आपको आकार के कारण सम्मिलित टेक्स्ट के लिए एक नया बफर बनाने की आवश्यकता होगी। फिर, यह एक उदारवादी अनुकूलन है।


यहां एक उत्कृष्ट ट्यूटोरियल उपलब्ध है जिसमें अधिक आधुनिक संदर्भों में बहुत से प्रासंगिक विषय शामिल हैं:

इस प्रश्न के अन्य उत्तरों कवर अंतराल बफर।

एक और आधुनिक कवरेज AvalonEdit का विवरण है

और अतिरिक्त विवरण से:

और किताब में विस्तार / सामग्री (तीव्र गति के बारे में) की एक बड़ी मात्रा है:


यहां बताया गया है कि माइक्रोसॉफ्ट में "पेशेवर" कैसे करते हैं:

एमएस वर्ड टुकड़ा तालिका डेटा संरचना का उपयोग करता है। चरित्र पदों की एक आरोही सरणी को बड़ी संरचनाओं की एक सरणी के साथ समानांतर में बनाए रखा जाता है जिसमें पॉइंटर्स को मूल फ़ाइल (फ़ाइल लोड पर लोड किया गया टेक्स्ट) या नए जोड़े गए अक्षरों के केवल एक ही बफर में शामिल किया जाता है।

विंडोज़ में हर जगह इस्तेमाल किया गया EDIT नियंत्रण कोई डेटा संरचना का उपयोग नहीं करता है। नोटपैड बस एक बहु-लाइन EDIT नियंत्रण का उपयोग करता है। एक ढेर दर्शक के साथ इसे देखें। ईडीआईटी नियंत्रण लाइन-ब्रेक और टैब-स्टॉप के केवल एक बफर को बनाए रखता है।

यदि आप विंडोज़ में एक साधारण गैर-स्वरूपित टेक्स्ट एडिटर बनाने जा रहे हैं, तो आप सुविधाओं को जोड़ने के लिए आसानी से EDIT नियंत्रण को उपclass कर सकते हैं।


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


यह पेपर कई डेटा संरचनाओं की तुलना करता है जिनका उपयोग पाठ संपादकों के लिए किया जा सकता है, जिनमें पहले से ही कुछ उल्लेख किए गए हैं (उदाहरण के लिए, अंतराल बफर) साथ ही कई अन्य (उदाहरण के लिए, टुकड़े की मेज)। लेख पुराना है, लेकिन मेरा मानना ​​है कि यह अभी भी सभी प्रमुख विकल्पों को शामिल करता है, और यह प्रदर्शन, जटिलता और अंतरिक्ष के ऊपर के मामले में उनकी तुलना करता है।

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





theory