सफिक्स ट्री: Difference between revisions

From Vigyanwiki
(Created page with "{{short description|Tree containing all suffixes of a given text}} Image:Suffix tree BANANA.svg|thumb|250px|right|पाठ के लिए प्रत्यय वृक...")
 
(minor changes)
Line 1: Line 1:
{{short description|Tree containing all suffixes of a given text}}
{{short description|Tree containing all suffixes of a given text}}
[[Image:Suffix tree BANANA.svg|thumb|250px|right|पाठ के लिए प्रत्यय वृक्ष <code>BANANA</code>. प्रत्येक सबस्ट्रिंग को विशेष वर्ण के साथ समाप्त किया जाता है <code>$</code>. जड़ से पत्तियों तक के छह रास्ते (बक्से के रूप में दिखाए गए) छह प्रत्ययों के अनुरूप हैं <code>A$</code>, <code>NA$</code>, <code>ANA$</code>, <code>NANA$</code>, <code>ANANA$</code> और <code>BANANA$</code>. पत्तों की संख्याएँ संबंधित प्रत्यय की आरंभिक स्थिति बताती हैं। निर्माण के दौरान धराशायी खींचे गए प्रत्यय लिंक का उपयोग किया जाता है।]][[कंप्यूटर विज्ञान]] में, एक प्रत्यय वृक्ष (जिसे पीएटी वृक्ष या, पहले के रूप में, स्थिति वृक्ष भी कहा जाता है) एक संपीड़ित त्रि है जिसमें दिए गए पाठ के सभी [[प्रत्यय (कंप्यूटर विज्ञान)]] उनकी कुंजी के रूप में और पाठ में उनके मूल्यों के रूप में स्थित होते हैं। प्रत्यय वृक्ष कई महत्वपूर्ण स्ट्रिंग ऑपरेशनों के विशेष रूप से तेज़ कार्यान्वयन की अनुमति देते हैं।
[[Image:Suffix tree BANANA.svg|thumb|250px|right|पाठ के लिए प्रत्यय वृक्ष <code>BANANA</code>. प्रत्येक सबस्ट्रिंग को विशेष वर्ण के साथ समाप्त किया जाता है <code>$</code>. जड़ से पत्तियों तक के छह रास्ते (बक्से के रूप में दिखाए गए) छह प्रत्ययों के अनुरूप हैं <code>A$</code>, <code>NA$</code>, <code>ANA$</code>, <code>NANA$</code>, <code>ANANA$</code> और <code>BANANA$</code>. पत्तों की संख्याएँ संबंधित प्रत्यय की आरंभिक स्थिति बताती हैं। निर्माण के दौरान धराशायी खींचे गए प्रत्यय लिंक का उपयोग किया जाता है।]][[कंप्यूटर विज्ञान]] में, एक प्रत्यय वृक्ष (जिसे पीएटी वृक्ष या, पहले के रूप में, स्थिति वृक्ष भी कहा जाता है) एक संपीड़ित त्रि है जिसमें दिए गए पाठ के सभी [[प्रत्यय (कंप्यूटर विज्ञान)|प्रत्ययों]] को उनकी कुंजी के रूप में और पाठ में उनके मूल्यों के रूप में स्थान दिया जाता है। प्रत्यय पेड़ कई महत्वपूर्ण स्ट्रिंग ऑपरेशनों के विशेष रूप से तेज़ कार्यान्वयन की अनुमति देते हैं।


डोरी के लिए ऐसे वृक्ष का निर्माण <math>S</math> की लंबाई में समय और स्थान को रैखिक लेता है <math>S</math>. एक बार निर्माण हो जाने के बाद, कई ऑपरेशन तुरंत किए जा सकते हैं, उदाहरण के लिए एक [[सबस्ट्रिंग]] का पता लगाना <math>S</math>, यदि एक निश्चित संख्या में गलतियों की अनुमति है तो एक सबस्ट्रिंग का पता लगाना, [[नियमित अभिव्यक्ति]] पैटर्न के लिए मिलान का पता लगाना आदि। प्रत्यय पेड़ों ने [[सबसे लंबी सामान्य सबस्ट्रिंग समस्या]] के लिए पहले रैखिक-समय समाधानों में से एक भी प्रदान किया।{{#tag:ref|[[Donald Knuth|Knuth]] conjectured in 1970 that the problem could not be solved in linear time.<ref>{{cite journal | author1=Donald E. Knuth | author2=James H. Morris | author3=Vaughan R. Pratt | title=Fast Pattern Matching in Strings | journal=SIAM Journal on Computing | volume=6 | number=2 | pages=323&ndash;350 | date=Jun 1977 | doi=10.1137/0206024 | url=https://www.cs.jhu.edu/~misha/ReadingSeminar/Papers/Knuth77.pdf }} Here: p.339 bottom.</ref> In 1973, this was refuted by Weiner's suffix-tree algorithm {{harvtxt|Weiner|1973}}.}} ये स्पीडअप लागत पर आते हैं: एक स्ट्रिंग के प्रत्यय वृक्ष को संग्रहीत करने के लिए आमतौर पर स्ट्रिंग को संग्रहीत करने की तुलना में काफी अधिक स्थान की आवश्यकता होती है।
इस प्रकार के एक पेड़ का निर्माण <math>S</math> स्ट्रिंग के लिए <math>S</math> की लंबाई में समय और स्थान लीनियर लेता है। एक बार निर्मित होने के बाद, कई ऑपरेशन तेजी से किए जा सकते हैं, उदाहरण के लिए <math>S</math>  में एक [[सबस्ट्रिंग]] का पता लगाना, यदि कुछ गलतियाँ स्वीकार की जाती हैं तो एक सबस्ट्रिंग का पता लगाना, एक [[नियमित अभिव्यक्ति]] पैटर्न के लिए मिलान करना इत्यादि। सफेक्स ट्रीज़ ने [[सबसे लंबी सामान्य सबस्ट्रिंग समस्या]] के लिए पहले से ही लीनियर समय के समाधानों में से एक प्रदान किया।{{#tag:ref|[[Donald Knuth|Knuth]] conjectured in 1970 that the problem could not be solved in linear time.<ref>{{cite journal | author1=Donald E. Knuth | author2=James H. Morris | author3=Vaughan R. Pratt | title=Fast Pattern Matching in Strings | journal=SIAM Journal on Computing | volume=6 | number=2 | pages=323&ndash;350 | date=Jun 1977 | doi=10.1137/0206024 | url=https://www.cs.jhu.edu/~misha/ReadingSeminar/Papers/Knuth77.pdf }} Here: p.339 bottom.</ref> In 1973, this was refuted by Weiner's suffix-tree algorithm {{harvtxt|Weiner|1973}}.}} ये गति वृद्धि खर्च पर आती है: एक स्ट्रिंग के सफेक्स ट्री को संग्रह करना आमतौर पर स्ट्रिंग खुद को संग्रह करने से बहुत अधिक स्थान की आवश्यकता होती है।


==इतिहास==
==इतिहास==
इस अवधारणा को सबसे पहले पेश किया गया था {{harvtxt|Weiner|1973}}.
यह अवधारणा पहली बार {{harvtxt|Weiner|1973}} द्वारा पेश की गई थी। सूफ़िक्स <math>S[i..n]</math> के बजाय, Weiner ने अपने trie<ref>This term is used here to distinguish Weiner's precursor data structures from proper suffix trees as defined [[#Definition|above]] and unconsidered before {{harvtxt|McCreight|1976}}.</ref> में प्रत्येक स्थान के लिए प्रत्याधिकारी पहचानकर्ता संग्रहित की, अर्थात्, <math>i</math> से प्रारंभ होने और <math>S</math> में केवल एक बार होने वाली सबसे छोटी स्ट्रिंग। उनका एल्गोरिदम डी <math>S[k+1..n]</math> के लिए एक अप्रेस्स किए गए trie को लेता है<ref>i.e., with each branch labelled by a single character</ref> और इसे <math>S[k..n]</math> के लिए एक trie में बढ़ाता है। इस तरीके से, ट्रिवियल trie से <math>S[n..n]</math> के लिए trie को <math>S[1..n]</math> के लिए एल्गोरिदम डी को <math>n - 1</math> लगातार कॉल करके बनाया जा सकता है; हालांकि, कुल मान्य समय <math>O(n^2)</math> होता है। Weiner का एल्गोरिदम बी कई सहायक डेटा संरचनाओं को बनाए रखने के लिए उपयोग करता है, जिससे निर्मित trie के आकार में संगठन का चलन औसत करार दिया जा सकता है। यह अंतिम रूप से <math>O(n^2)</math> नोड हो सकता है, जैसे <math>S = a^n b^n a^n b^n \$ .</math> के लिए। Weiner का एल्गोरिदम सी अंततः संपीडित trie का उपयोग करता है, जिससे आकार और संचालन का चलन लीनियर समग्र संचय आकार और समय होता है।<ref>See [[:File:WeinerB aaaabbbbaaaabbbb.gif]] and [[:File:WeinerC aaaabbbbaaaabbbb.gif]] for an uncompressed example tree and its compressed correspondant.</ref> [[डोनाल्ड नुथ]] ने इसे बाद में "वर्ष 1973 का एल्गोरिदम" के रूप में वर्णनित किया।{{cn|reason=Weiner gave several algorithms; Knuth probably referred to Algorithm C.|date=February 2020}} पाठग्रंथ {{harvtxt|Aho|Hopcroft|Ullman|1974|loc=Sect.9.5}} ने Weiner के परिणामों को सरल और और सुंदर रूप में पुनर्जीवित किया, पद पेड़ के शब्द का परिचय कराया।
प्रत्यय के बजाय <math>S[i..n]</math>, वेनर ने अपनी तिकड़ी में संग्रहित किया<ref>This term is used here to distinguish Weiner's precursor data structures from proper suffix trees as defined [[#Definition|above]] and unconsidered before {{harvtxt|McCreight|1976}}.</ref> प्रत्येक स्थिति के लिए उपसर्ग पहचानकर्ता, अर्थात, प्रारंभ होने वाली सबसे छोटी स्ट्रिंग <math>i</math> और केवल एक बार घटित होता है <math>S</math>. उसका एल्गोरिदम डी एक असम्पीडित लेता है<ref>i.e., with each branch labelled by a single character</ref> के लिए प्रयास करें <math>S[k+1..n]</math> और इसे एक प्रयास में विस्तारित करता है <math>S[k..n]</math>. इस तरह, के लिए तुच्छ प्रयास से शुरू करते हैं <math>S[n..n]</math>, के लिए एक प्रयास <math>S[1..n]</math> द्वारा बनाया जा सकता है <math>n - 1</math> एल्गोरिथम डी को लगातार कॉल; हालाँकि, कुल मिलाकर रन टाइम है <math>O(n^2)</math>. वेनर का एल्गोरिथम बी निर्मित ट्राइ के आकार में समग्र रन टाइम रैखिक प्राप्त करने के लिए कई सहायक डेटा संरचनाओं को बनाए रखता है। उत्तरार्द्ध अभी भी हो सकता है <math>O(n^2)</math> नोड्स, उदा. के लिए <math>S = a^n b^n a^n b^n \$ .</math> वेनर का एल्गोरिदम सी अंततः रैखिक समग्र भंडारण आकार और रन टाइम प्राप्त करने के लिए संपीड़ित प्रयासों का उपयोग करता है।<ref>See [[:File:WeinerB aaaabbbbaaaabbbb.gif]] and [[:File:WeinerC aaaabbbbaaaabbbb.gif]] for an uncompressed example tree and its compressed correspondant.</ref>
बाद में [[डोनाल्ड नुथ]] ने बाद की विशेषता बताई<!---guessed---> वर्ष 1973 के एल्गोरिदम के रूप में।{{cn|reason=Weiner gave several algorithms; Knuth probably referred to Algorithm C.|date=February 2020}}
पाठ्यपुस्तक {{harvtxt|Aho|Hopcroft|Ullman|1974|loc=Sect.9.5}} वेनर के परिणामों को एक सरलीकृत और अधिक सुंदर रूप में पुन: प्रस्तुत किया गया, जिसमें पोजीशन ट्री शब्द का परिचय दिया गया।


{{harvtxt|McCreight|1976}} सभी प्रत्ययों का एक (संपीड़ित) त्रि बनाने वाला पहला व्यक्ति था <math>S</math>. यद्यपि प्रत्यय प्रारंभ हो रहा है <math>i</math> आमतौर पर उपसर्ग पहचानकर्ता से अधिक लंबा होता है, संपीड़ित ट्राई में उनका पथ प्रतिनिधित्व आकार में भिन्न नहीं होता है। दूसरी ओर, मैकक्रेइट वेनर की अधिकांश सहायक डेटा संरचनाओं को छोड़ सकता है; केवल प्रत्यय कड़ियाँ ही रह गईं।
{{harvtxt|McCreight|1976}} <math>S</math> के सभी प्रत्ययों की एक (संपीड़ित) त्रि बनाने वाले पहले व्यक्ति थे। हालाँकि <math>i</math> से शुरू होने वाला प्रत्यय आमतौर पर उपसर्ग पहचानकर्ता से अधिक लंबा होता है, एक संपीड़ित त्रि में उनका पथ प्रतिनिधित्व आकार में भिन्न नहीं होता है। दूसरी ओर, मैकक्रेइट वेनर की अधिकांश सहायक डेटा संरचनाओं से दूर रह सकता है; केवल प्रत्यय लिंक बचे हैं।


{{harvtxt|Ukkonen|1995}} निर्माण को और सरल बनाया।{{sfnp|Giegerich|Kurtz|1997}} उन्होंने प्रत्यय पेड़ों का पहला ऑनलाइन-निर्माण प्रदान किया, जिसे अब उक्कोनेन के एल्गोरिदम के रूप में जाना जाता है, जिसमें चलने का समय तत्कालीन सबसे तेज़ एल्गोरिदम से मेल खाता था।
{{harvtxt|Ukkonen|1995}} ने निर्माण को और सरल बनाया।{{sfnp|Giegerich|Kurtz|1997}} उन्होंने प्रत्यय वृक्षों का पहला ऑनलाइन-निर्माण प्रदान किया, जिसे अब उक्कोनेन के एल्गोरिदम के रूप में जाना जाता है, जिसमें चलने का समय तत्कालीन सबसे तेज़ एल्गोरिदम से मेल खाता था। ये सभी एल्गोरिदम स्थिर आकार के वर्णमाला के लिए रैखिक-समय हैं, और सामान्य तौर पर सबसे खराब स्थिति में चलने का समय <math>O(n\log n)</math> है।
ये एल्गोरिदम सभी स्थिर-आकार वर्णमाला के लिए रैखिक-समय हैं, और सबसे खराब स्थिति में चलने का समय है <math>O(n\log n)</math> सामान्य रूप में।


{{harvtxt|Farach|1997}} ने पहला प्रत्यय वृक्ष निर्माण एल्गोरिदम दिया जो सभी वर्णमालाओं के लिए इष्टतम है। विशेष रूप से, यह पहला रैखिक-समय एल्गोरिदम है
{{harvtxt|Farach|1997}} ने पहला प्रत्यय वृक्ष निर्माण एल्गोरिथ्म दिया जो सभी अक्षरों के लिए इष्टतम है। विशेष रूप से, बहुपद श्रेणी में पूर्णांकों की वर्णमाला से खींची गई स्ट्रिंग के लिए यह पहला रैखिक-समय एल्गोरिदम है। फ़राच का एल्गोरिदम प्रत्यय वृक्षों और प्रत्यय सरणियों दोनों के निर्माण के लिए नए एल्गोरिदम का आधार बन गया है, उदाहरण के लिए, बाहरी मेमोरी, संपीड़ित, संक्षिप्त, आदि में।
बहुपद श्रेणी में पूर्णांकों की वर्णमाला से खींची गई स्ट्रिंग के लिए। फ़राच का एल्गोरिदम प्रत्यय वृक्षों और प्रत्यय सरणियों दोनों के निर्माण के लिए नए एल्गोरिदम का आधार बन गया है, उदाहरण के लिए, बाहरी मेमोरी में, संपीड़ित, संक्षिप्त, आदि।


==परिभाषा==
==परिभाषा==
स्ट्रिंग के लिए प्रत्यय वृक्ष <math>S</math> लम्बाई का <math>n</math> इसे एक पेड़ के रूप में परिभाषित किया गया है जैसे:<ref>http://www.cs.uoi.gr/~kblekas/courses/bioinformatics/Suffix_Trees1.pdf{{Dead link|date=June 2018 |bot=InternetArchiveBot |fix-attempted=no }}</ref><!-- ref>{{harvtxt|Gusfield|1999}}, p.90.</ref -->
लंबाई <math>n</math> की स्ट्रिंग <math>S</math> के लिए प्रत्यय पेड़ को एक पेड़ के रूप में परिभाषित किया गया है:<ref>http://www.cs.uoi.gr/~kblekas/courses/bioinformatics/Suffix_Trees1.pdf{{Dead link|date=June 2018 |bot=InternetArchiveBot |fix-attempted=no }}</ref>
* पेड़ में बिल्कुल n पत्तियाँ क्रमांकित हैं <math>1</math> को <math>n</math>.
* जड़ को छोड़कर, प्रत्येक पेड़ (डेटा संरचना)#शब्दावली में कम से कम दो बच्चे होते हैं।
* प्रत्येक किनारे को एक गैर-रिक्त सबस्ट्रिंग के साथ लेबल किया गया है <math>S</math>.
* किसी नोड से शुरू होने वाले किसी भी दो किनारों में एक ही वर्ण से शुरू होने वाले स्ट्रिंग-लेबल नहीं हो सकते हैं।
* जड़ से पत्ती तक पथ पर पाए जाने वाले सभी स्ट्रिंग-लेबलों को संयोजित करके प्राप्त स्ट्रिंग <math>i</math> प्रत्यय का उच्चारण करता है <math>S[i..n]</math>, के लिए <math>i</math> से <math>1</math> को <math>n</math>.


चूँकि ऐसा पेड़ सभी तारों के लिए मौजूद नहीं है, <math>S</math> एक टर्मिनल प्रतीक के साथ गद्देदार है जो स्ट्रिंग में नहीं देखा जाता है (आमतौर पर दर्शाया जाता है)। <code>$</code>). यह सुनिश्चित करता है कि कोई भी प्रत्यय दूसरे का उपसर्ग नहीं है, और रहेगा <math>n</math> लीफ नोड्स, प्रत्येक के लिए एक <math>n</math> के प्रत्यय <math>S</math>. चूंकि सभी आंतरिक गैर-रूट नोड्स शाखाएं हैं, इसलिए अधिकतम n − 1 ऐसे नोड हो सकते हैं, और n + (n − 1) + 1 = 2n नोड्स कुल मिलाकर (n पत्तियां, n − 1 आंतरिक गैर-रूट नोड्स, 1) जड़)।
* पेड़ में बिल्कुल n पत्तियाँ हैं जिनकी संख्या <math>1</math> से <math>n</math> है।
* रूट को छोड़कर, हर आंतरिक नोड में कम से कम दो बच्चे होते हैं।
* प्रत्येक किनारे को <math>S</math> की एक गैर-रिक्त सबस्ट्रिंग के साथ लेबल किया गया है।
* किसी नोड से शुरू होने वाले किसी भी दो किनारों में समान वर्ण से शुरू होने वाले स्ट्रिंग-लेबल नहीं हो सकते हैं।
* जड़ से पत्ती <math>S[i..n]</math> तक के पथ पर पाए जाने वाले सभी स्ट्रिंग-लेबलों को संयोजित करके प्राप्त स्ट्रिंग, प्रत्यय <math>i</math> का उच्चारण करती है, <math>i</math> के लिए <math>1</math> से <math>n</math> तक।


'प्रत्यय लिंक' पुराने रैखिक-समय निर्माण एल्गोरिदम के लिए एक प्रमुख विशेषता है, हालांकि अधिकांश नए एल्गोरिदम, जो फ़राच के एल्गोरिदम पर आधारित हैं, प्रत्यय लिंक से दूर हैं। एक पूर्ण प्रत्यय वृक्ष में, सभी आंतरिक गैर-रूट नोड्स में किसी अन्य आंतरिक नोड के लिए एक प्रत्यय लिंक होता है। यदि रूट से नोड तक का पथ स्ट्रिंग को वर्तनी देता है <math>\chi\alpha</math>, कहाँ <math>\chi</math> एक एकल वर्ण है और <math>\alpha</math> एक स्ट्रिंग है (संभवतः खाली), इसमें आंतरिक नोड का प्रतिनिधित्व करने वाला एक प्रत्यय लिंक है <math>\alpha</math>. उदाहरण के लिए नोड से प्रत्यय लिंक देखें <code>ANA</code> के लिए नोड के लिए <code>NA</code> उपरोक्त चित्र में. ट्री पर चलने वाले कुछ एल्गोरिदम में प्रत्यय लिंक का भी उपयोग किया जाता है।
ऐसे पेड़ का अस्तित्व सभी स्ट्रिंग्स के लिए नहीं होता है, इसलिए <math>S</math> को स्ट्रिंग में देखा जाने वाला कोई टर्मिनल सिम्बल (आमतौर पर <code>$</code> से दर्शाया जाता है) के साथ पैड किया जाता है। इससे यह सुनिश्चित होता है कि कोई सफिक्स किसी अन्य सफिक्स का प्रारंभ नहीं है, और <math>n</math> के <math>n</math> सफिक्स के लिए प्रत्येक के लिए <math>S</math> पत्ती के नोड होंगे। सभी आंतरिक गैर-रूट नोड्स ब्रांचिंग होने के कारण, अधिकतम n - 1 ऐसे नोड्स हो सकते हैं, और कुल में 2n नोड्स होते हैं (n पत्तियाँ, n - 1 आंतरिक गैर-रूट नोड्स, 1 रूट)।


एक [[सामान्यीकृत प्रत्यय वृक्ष]] एक एकल स्ट्रिंग के बजाय तारों के एक सेट के लिए बनाया गया एक प्रत्यय वृक्ष है। यह स्ट्रिंग के इस सेट से सभी प्रत्ययों का प्रतिनिधित्व करता है। प्रत्येक स्ट्रिंग को एक अलग समाप्ति प्रतीक द्वारा समाप्त किया जाना चाहिए।
सफिक्स लिंक पुराने लीनियर समय के निर्माण एल्गोरिदमों के लिए एक मुख्य सुविधा हैं, हालांकि अधिकांश नवीनतम एल्गोरिदम, जो फराक एल्गोरिदम पर आधारित हैं, सफिक्स लिंक के बिना काम करते हैं। पूर्ण सफिक्स पेड़ में, सभी आंतरिक गैर-रूट नोड्स के पास एक सफिक्स लिंक होता है जो दूसरे आंतरिक नोड की ओर जाता है। यदि रूट से एक नोड तक का पथ <math>\chi\alpha</math> स्ट्रिंग को बनाता है, जहां <math>\chi</math> एकल अक्षर है और <math>\alpha</math> एक स्ट्रिंग है (संभवतः रिक्त), तो इसके पास सफिक्स लिंक होता है जो <math>\alpha</math> को प्रतिनिधित्व करने वाले आंतरिक नोड की ओर जाता है। ऊपर दिए गए आकृति में <code>ANA</code>के नोड से <code>NA</code> के नोड के लिए सफिक्स लिंक देखें। सफिक्स लिंक भी पेड़ पर चल रहे कुछ एल्गोरिदमों में उपयोग किए जाते हैं।
 
एक [[सामान्यीकृत प्रत्यय वृक्ष]] एक प्रत्यय वृक्ष है जो एकल स्ट्रिंग के बजाय स्ट्रिंग के एक सेट के लिए बनाया गया है। यह तारों के इस सेट से सभी प्रत्ययों का प्रतिनिधित्व करता है। प्रत्येक स्ट्रिंग को एक अलग समाप्ति चिह्न द्वारा समाप्त किया जाना चाहिए।


==कार्यक्षमता==
==कार्यक्षमता==


एक स्ट्रिंग के लिए एक प्रत्यय वृक्ष <math>S</math> लम्बाई का <math>n</math> में बनाया जा सकता है <math>\Theta(n)</math> समय, यदि अक्षर बहुपद श्रेणी में पूर्णांकों की वर्णमाला से आते हैं (विशेष रूप से, यह स्थिर आकार के वर्णमाला के लिए सच है)।{{sfnp|Farach|1997}}
लंबाई <math>n</math> की स्ट्रिंग <math>S</math> के लिए एक प्रत्यय वृक्ष <math>\Theta(n)</math> समय में बनाया जा सकता है, यदि अक्षर बहुपद श्रेणी में पूर्णांकों के वर्णमाला से आते हैं (विशेष रूप से, यह स्थिर आकार के अक्षरों के लिए सच है)।{{sfnp|Farach|1997}} बड़े अक्षरों के लिए, पहले अक्षरों को क्रमबद्ध करके उन्हें आकार <math>O(n)</math> की श्रेणी में लाने के लिए चलने के समय का प्रभुत्व होता है; सामान्यतः इसमें <math>O(n\log n)</math> समय लगता है। नीचे दी गई लागत इस धारणा के तहत दी गई है कि वर्णमाला स्थिर है।[[छँटाई एल्गोरिथ्म]]
बड़े अक्षरों के लिए, अक्षरों को आकार की एक सीमा में लाने के लिए चलने का समय पहले [[छँटाई एल्गोरिथ्म]] पर हावी होता है <math>O(n)</math>; सामान्य तौर पर, यह लगता है <math>O(n\log n)</math> समय।
नीचे लागतें इस धारणा के तहत दी गई हैं कि वर्णमाला स्थिर है।


मान लें कि स्ट्रिंग के लिए एक प्रत्यय वृक्ष बनाया गया है <math>S</math> लम्बाई का <math>n</math>, या कि स्ट्रिंग्स के सेट के लिए एक [[सामान्यीकृत प्रत्यय वृक्ष]] बनाया गया है <math>D=\{S_1,S_2,\dots,S_K\}</math> कुल लंबाई का <math>n=n_1+n_2+\cdots+n_K</math>.
मान लें कि लंबाई <math>n</math> की स्ट्रिंग <math>S</math> के लिए एक प्रत्यय वृक्ष बनाया गया है, या कुल लंबाई <math>n=n_1+n_2+\cdots+n_K</math> की स्ट्रिंग <math>D=\{S_1,S_2,\dots,S_K\}</math> के सेट के लिए एक [[सामान्यीकृत प्रत्यय वृक्ष]] बनाया गया है। आप यह कर सकते हैं:
तुम कर सकते हो:


* तार खोजें:
* तार खोजें:
** जांचें कि क्या कोई स्ट्रिंग है <math>P</math> लम्बाई का <math>m</math> में एक सबस्ट्रिंग है <math>O(m)</math> समय।<ref>{{harvtxt|Gusfield|1999}}, p.92.</ref>
** जांचें कि क्या लंबाई <math>m</math> की स्ट्रिंग <math>P</math>, <math>O(m)</math> बार में एक सबस्ट्रिंग है।<ref>{{harvtxt|Gusfield|1999}}, p.92.</ref>
** पैटर्न की पहली घटना का पता लगाएं <math>P_1,\dots,P_q</math> कुल लंबाई का <math>m</math> में सबस्ट्रिंग के रूप में <math>O(m)</math> समय।
** कुल लंबाई <math>m</math> के पैटर्न <math>P_1,\dots,P_q</math> की <math>O(m)</math> बार में सबस्ट्रिंग के रूप में पहली घटना ज्ञात कीजिए।
** सब ढूँढ़ो <math>z</math> पैटर्न की घटनाएँ <math>P_1,\dots,P_q</math> कुल लंबाई का <math>m</math> में सबस्ट्रिंग के रूप में <math>O(m + z)</math> समय।<ref>{{harvtxt|Gusfield|1999}}, p.123.</ref>
** <math>O(m + z)</math> समय में सबस्ट्रिंग के रूप में कुल लंबाई <math>m</math> के पैटर्न <math>P_1,\dots,P_q</math> की सभी <math>z</math> घटनाएँ ज्ञात करें।<ref>{{harvtxt|Gusfield|1999}}, p.123.</ref>
<!-- ** Search for a pattern <math>P</math> of length <math>m</math> with at most <math>k</math> mismatches in <math>O(m \sum_{r=0}^k * {m \choose r} (|\Sigma| - 1)^k + z)</math> time.-->
<!-- ** Search for a pattern <math>P</math> of length <math>m</math> with at most <math>k</math> mismatches in <math>O(m \sum_{r=0}^k * {m \choose r} (|\Sigma| - 1)^k + z)</math> time.-->
** समय अपेक्षित [[सबलाइनियर टाइम एल्गोरिदम]] में नियमित अभिव्यक्ति पी की खोज करें <math>n</math>.{{sfnp|Baeza-Yates|Gonnet|1996}}
** <math>n</math> में अपेक्षित [[सबलाइनियर टाइम एल्गोरिदम|सबलाइनियर टाइम]] में एक नियमित अभिव्यक्ति पी खोजें।{{sfnp|Baeza-Yates|Gonnet|1996}}
** एक पैटर्न के प्रत्येक प्रत्यय के लिए खोजें <math>P</math>, के उपसर्ग के बीच सबसे लंबे मिलान की लंबाई <math>P[i\dots m]</math> और एक सबस्ट्रिंग <math>D</math> में <math>\Theta(m)</math> समय।<ref>{{harvtxt|Gusfield|1999}}, p.132.</ref> इसे मिलान आँकड़े कहा जाता है <math>P</math>.
** पैटर्न <math>P</math> के प्रत्येक प्रत्यय के लिए, <math>\Theta(m)</math> समय में <math>P[i\dots m]</math> के उपसर्ग और <math>D</math> में एक सबस्ट्रिंग के बीच सबसे लंबे मिलान की लंबाई ज्ञात करें।<ref>{{harvtxt|Gusfield|1999}}, p.132.</ref> इसे <math>P</math> के मिलान आँकड़े कहा जाता है।
* स्ट्रिंग्स के गुण खोजें:
*स्ट्रिंग्स के गुण खोजें:
** स्ट्रिंग की सबसे लंबी सामान्य सबस्ट्रिंग समस्या ढूंढें <math>S_i</math> और <math>S_j</math> में <math>\Theta(n_i + n_j)</math> समय।<ref>{{harvtxt|Gusfield|1999}}, p.125.</ref>
** <math>\Theta(n_i + n_j)</math> बार में स्ट्रिंग <math>S_i</math> और <math>S_j</math> की सबसे लंबी सामान्य उपस्ट्रिंग्स खोजें।<ref>{{harvtxt|Gusfield|1999}}, p.125.</ref>
** सभी अधिकतम जोड़े, अधिकतम दोहराव या सुपरमैक्सिमल दोहराव खोजें <math>\Theta(n + z)</math> समय।<ref>{{harvtxt|Gusfield|1999}}, p.144.</ref>
** <math>\Theta(n + z)</math> समय में सभी अधिकतम जोड़े, अधिकतम दोहराव या सुपरमैक्सिमल दोहराव खोजें।<ref>{{harvtxt|Gusfield|1999}}, p.144.</ref>
** लेम्पेल-ज़िव अपघटन का पता लगाएं <math>\Theta(n)</math> समय।<ref>{{harvtxt|Gusfield|1999}}, p.166.</ref>
** <math>\Theta(n)</math> बार में लेम्पेल-ज़िव अपघटन का पता लगाएं।<ref>{{harvtxt|Gusfield|1999}}, p.166.</ref>
** सबसे लंबी बार-बार दोहराई जाने वाली सबस्ट्रिंग समस्या ढूंढें <math>\Theta(n)</math> समय।
** <math>\Theta(n)</math> बार में सबसे लंबे समय तक दोहराया जाने वाला सबस्ट्रिंग खोजें।
** न्यूनतम लंबाई की सबसे अधिक बार आने वाली सबस्ट्रिंग खोजें <math>\Theta(n)</math> समय।
** <math>\Theta(n)</math> बार में न्यूनतम लंबाई की सबसे अधिक बार आने वाली सबस्ट्रिंग खोजें।
** से सबसे छोटी तार खोजें <math>\Sigma</math> जो कि घटित नहीं होता है <math>D</math>, में <math>O(n + z)</math> समय, अगर वहाँ हैं <math>z</math> ऐसे तार.
** <math>\Sigma</math> में से सबसे छोटी स्ट्रिंग खोजें जो <math>D</math> में नहीं आती हैं, <math>O(n + z)</math> समय में, यदि ऐसी <math>z</math> स्ट्रिंग हैं।
** केवल एक बार आने वाली सबसे छोटी सबस्ट्रिंग ढूंढें <math>\Theta(n)</math> समय।
** <math>\Theta(n)</math> बार में केवल एक बार आने वाली सबसे छोटी उपस्ट्रिंग ज्ञात कीजिए।
** प्रत्येक के लिए खोजें <math>i</math>, का सबसे छोटा उपस्ट्रिंग <math>S_i</math> में अन्यत्र नहीं घटित हो रहा है <math>D</math> में <math>\Theta(n)</math> समय।
**प्रत्येक <math>i</math> के लिए, <math>\Theta(n)</math> समय में <math>D</math> में से <math>S_i</math> की सबसे छोटी उपस्ट्रिंग खोजें जो कहीं और न हों।
 
प्रत्यय वृक्ष को <math>\Theta(n)</math> समय में नोड्स के बीच निरंतर समय न्यूनतम सामान्य पूर्वज पुनर्प्राप्ति के लिए तैयार किया जा सकता है।<ref>{{harvtxt|Gusfield|1999}}, Chapter 8.</ref> तब कोई भी यह कर सकता है:
 
<math>S_j[q..n_j]</math> में प्रत्यय <math>\Theta(1)</math> और <math>S_i[p..n_i]</math> के बीच सबसे लंबा सामान्य उपसर्ग खोजें।<ref>{{harvtxt|Gusfield|1999}}, p.196.</ref>
 
<math>O(k n + z)</math> बार में अधिकतम k बेमेल के साथ m लंबाई का एक पैटर्न P खोजें, जहां z हिट की संख्या है।<ref>{{harvtxt|Gusfield|1999}}, p.200.</ref>
 
यदि लंबाई <math>g</math> के अंतराल की अनुमति है, या <math>\Theta(k n)</math> यदि <math>k</math> बेमेल की [[विलोमपद]] अनुमति है, तो <math>\Theta(n)</math>,<ref>{{harvtxt|Gusfield|1999}}, p.198.</ref> या <math>\Theta(g n)</math> बार में सभी <math>z</math> अधिकतम पैलिन्ड्रोम खोजें।<ref>{{harvtxt|Gusfield|1999}}, p.201.</ref>
 
<math>O(n \log n + z)</math> में सभी <math>z</math> [[अग्रानुक्रम दोहराता है|अग्रानुक्रम दोहराव]] खोजें, और के-बेमेल अग्रानुक्रम <math>O(k n \log (n/k) + z)</math> में दोहराएँ।<ref>{{harvtxt|Gusfield|1999}}, p.204.</ref>


प्रत्यय वृक्ष को नोड्स के बीच निरंतर समय न्यूनतम सामान्य पूर्वज पुनर्प्राप्ति के लिए तैयार किया जा सकता है <math>\Theta(n)</math> समय।<ref>{{harvtxt|Gusfield|1999}}, Chapter 8.</ref> तब कोई यह भी कर सकता है:
<math>\Theta(n)</math> समय में <math>k=2,\dots,K</math> के लिए <math>D</math> में कम से कम <math>k</math> स्ट्रिंग्स के लिए सबसे लंबी आम सबस्ट्रिंग्स खोजें।<ref>{{harvtxt|Gusfield|1999}}, p.205.</ref>
* प्रत्ययों के बीच सबसे लंबा सामान्य उपसर्ग खोजें <math>S_i[p..n_i]</math> और <math>S_j[q..n_j]</math> में <math>\Theta(1)</math>.<ref>{{harvtxt|Gusfield|1999}}, p.196.</ref>
 
* अधिकतम k बेमेल के साथ लंबाई m का एक पैटर्न P खोजें <math>O(k n + z)</math> समय, जहां z हिट्स की संख्या है।<ref>{{harvtxt|Gusfield|1999}}, p.200.</ref>
रैखिक समय में किसी दिए गए स्ट्रिंग का [[सबसे लंबा पैलिंड्रोमिक सबस्ट्रिंग]] (स्ट्रिंग के सामान्यीकृत प्रत्यय ट्री और उसके रिवर्स का उपयोग करके) खोजें।<ref>{{harvtxt|Gusfield|1999}}, pp.197–199.</ref>
* सब ढूँढ़ो <math>z</math> अधिकतम [[विलोमपद]] <math>\Theta(n)</math>,<ref>{{harvtxt|Gusfield|1999}}, p.198.</ref> या <math>\Theta(g n)</math> यदि लंबाई का अंतराल हो तो समय <math>g</math> अनुमति है, या <math>\Theta(k n)</math> अगर <math>k</math> बेमेल की अनुमति है.<ref>{{harvtxt|Gusfield|1999}}, p.201.</ref>
* सब ढूँढ़ो <math>z</math> [[अग्रानुक्रम दोहराता है]] <math>O(n \log n + z)</math>, और k-बेमेल अग्रानुक्रम दोहराता है <math>O(k n \log (n/k) + z)</math>.<ref>{{harvtxt|Gusfield|1999}}, p.204.</ref>
* कम से कम सबसे लंबी सामान्य सबस्ट्रिंग समस्या ढूंढें <math>k</math> में तार <math>D</math> के लिए <math>k=2,\dots,K</math> में <math>\Theta(n)</math> समय।<ref>{{harvtxt|Gusfield|1999}}, p.205.</ref>
* रैखिक समय में किसी दिए गए स्ट्रिंग का [[सबसे लंबा पैलिंड्रोमिक सबस्ट्रिंग]] (स्ट्रिंग के सामान्यीकृत प्रत्यय ट्री और उसके रिवर्स का उपयोग करके) ढूंढें।<ref>{{harvtxt|Gusfield|1999}}, pp.197–199.</ref>




== अनुप्रयोग ==
== अनुप्रयोग ==
प्रत्यय वृक्षों का उपयोग पाठ-संपादन, मुक्त-पाठ खोज, [[कम्प्यूटेशनल बायोलॉजी]] विज्ञान और अन्य अनुप्रयोग क्षेत्रों में होने वाली बड़ी संख्या में स्ट्रिंग समस्याओं को हल करने के लिए किया जा सकता है।<ref name="allisons"/>प्राथमिक अनुप्रयोगों में शामिल हैं:<ref name="allisons">{{cite web|url=http://www.allisons.org/ll/AlgDS/Tree/Suffix/|title=प्रत्यय वृक्ष|last=Allison|first=L.|access-date=2008-10-14|url-status=live|archive-url=https://web.archive.org/web/20081013124759/http://allisons.org/ll/AlgDS/Tree/Suffix/|archive-date=2008-10-13}}</ref>
प्रत्यय वृक्षों का उपयोग पाठ-संपादन, मुक्त-पाठ खोज, [[कम्प्यूटेशनल बायोलॉजी]] और अन्य अनुप्रयोग क्षेत्रों में होने वाली बड़ी संख्या में स्ट्रिंग समस्याओं को हल करने के लिए किया जा सकता है।<ref name="allisons">{{cite web|url=http://www.allisons.org/ll/AlgDS/Tree/Suffix/|title=प्रत्यय वृक्ष|last=Allison|first=L.|access-date=2008-10-14|url-status=live|archive-url=https://web.archive.org/web/20081013124759/http://allisons.org/ll/AlgDS/Tree/Suffix/|archive-date=2008-10-13}}</ref> प्राथमिक अनुप्रयोगों में शामिल हैं:<ref name="allisons" />
* स्ट्रिंग खोज # इंडेक्स विधियां, ओ (एम) जटिलता में, जहां एम उप-स्ट्रिंग की लंबाई है (लेकिन प्रारंभिक ओ (एन) समय के साथ स्ट्रिंग के लिए प्रत्यय पेड़ बनाने के लिए आवश्यक है)
* सबसे लंबी दोहराई जाने वाली सबस्ट्रिंग ढूँढना
* सबसे लंबी सामान्य उपस्ट्रिंग ढूँढना
* एक स्ट्रिंग में सबसे लंबा पैलिंड्रोम ढूँढना


प्रत्यय वृक्षों का उपयोग अक्सर जैव सूचना विज्ञान अनुप्रयोगों में किया जाता है, [[डीएनए]] या [[प्रोटीन]] अनुक्रमों में पैटर्न की खोज की जाती है (जिन्हें वर्णों की लंबी श्रृंखला के रूप में देखा जा सकता है)। बेमेल के साथ कुशलतापूर्वक खोज करने की क्षमता उनकी सबसे बड़ी ताकत मानी जा सकती है। प्रत्यय वृक्षों का उपयोग डेटा संपीड़न में भी किया जाता है; उनका उपयोग बार-बार डेटा खोजने के लिए किया जा सकता है, और बरोज़-व्हीलर ट्रांसफ़ॉर्म के सॉर्टिंग चरण के लिए भी किया जा सकता है। [[LZW]] संपीड़न योजनाओं के वेरिएंट प्रत्यय वृक्ष ([[LZSS]]) का उपयोग करते हैं। प्रत्यय ट्री का उपयोग [[प्रत्यय वृक्ष समूहन]] में भी किया जाता है, जो कुछ खोज इंजनों में उपयोग किया जाने वाला [[डेटा क्लस्टरिंग]] एल्गोरिदम है।<ref>First introduced by {{harvtxt|Zamir|Etzioni|1998}}.</ref>
* स्ट्रिंग खोज, (एम) जटिलता में, जहां एम उप-स्ट्रिंग की लंबाई है (लेकिन स्ट्रिंग के लिए प्रत्यय वृक्ष बनाने के लिए प्रारंभिक ओ(एन) समय की आवश्यकता होती है)
* सबसे लंबे समय तक दोहराई जाने वाली सबस्ट्रिंग ढूँढना
* सबसे लंबी उभयनिष्ठ उपस्ट्रिंग ढूँढना
* एक स्ट्रिंग में सबसे लंबा पैलिन्ड्रोम ढूँढना


प्रत्यय वृक्षों का उपयोग अक्सर जैव सूचना विज्ञान अनुप्रयोगों में किया जाता है, जो [[डीएनए]] या [[प्रोटीन]] अनुक्रमों में पैटर्न की खोज करते हैं (जिन्हें वर्णों की लंबी श्रृंखला के रूप में देखा जा सकता है)। बेमेल के साथ कुशलता से खोज करने की क्षमता को उनकी सबसे बड़ी ताकत माना जा सकता है। प्रत्यय पेड़ों का उपयोग डेटा संपीड़न में भी किया जाता है; उनका उपयोग बार-बार डेटा ढूंढने के लिए किया जा सकता है, और बरोज़-व्हीलर ट्रांसफॉर्म के सॉर्टिंग चरण के लिए भी किया जा सकता है। [[LZW]] संपीड़न योजनाओं के प्रकार प्रत्यय वृक्ष ([[LZSS]]) का उपयोग करते हैं। प्रत्यय ट्री का उपयोग [[प्रत्यय वृक्ष समूहन|प्रत्यय ट्री क्लस्टरिंग]] में भी किया जाता है, कुछ खोज इंजनों में उपयोग किया जाने वाला [[डेटा क्लस्टरिंग]] एल्गोरिदम।<ref>First introduced by {{harvtxt|Zamir|Etzioni|1998}}.</ref>


==कार्यान्वयन==
==कार्यान्वयन==
यदि प्रत्येक नोड और किनारे को दर्शाया जा सकता है <math>\Theta(1)</math> अंतरिक्ष में, पूरे पेड़ का प्रतिनिधित्व किया जा सकता है <math>\Theta(n)</math> अंतरिक्ष। पेड़ के सभी किनारों पर सभी तारों की कुल लंबाई है <math>O(n^2)</math>, लेकिन प्रत्येक किनारे को एक सबस्ट्रिंग की स्थिति और लंबाई के रूप में संग्रहीत किया जा सकता है {{mvar|S}}, का कुल स्थान उपयोग दे रहा है <math>\Theta(n)</math> कंप्यूटर शब्द. प्रत्यय वृक्ष का सबसे खराब स्थिति वाला स्थान उपयोग एक [[फाइबोनैचि शब्द]] के साथ देखा जाता है, जो पूर्ण देता है <math>2n</math> नोड्स.
यदि प्रत्येक नोड और किनारे को <math>\Theta(1)</math> स्पेस में दर्शाया जा सकता है, तो पूरे पेड़ को <math>\Theta(n)</math> स्पेस में दर्शाया जा सकता है। पेड़ के सभी किनारों पर सभी स्ट्रिंग्स की कुल लंबाई <math>O(n^2)</math> है, लेकिन प्रत्येक किनारे को {{mvar|S}} के एक सबस्ट्रिंग की स्थिति और लंबाई के रूप में संग्रहीत किया जा सकता है, जिससे कुल <math>\Theta(n)</math> कंप्यूटर शब्दों का स्थान उपयोग होता है। प्रत्यय पेड़ का सबसे खराब स्थिति वाला स्थान उपयोग एक [[फाइबोनैचि शब्द]] के साथ देखा जाता है, जो पूरे <math>2n</math> नोड्स देता है।


प्रत्यय वृक्ष कार्यान्वयन करते समय एक महत्वपूर्ण विकल्प नोड्स के बीच माता-पिता-बच्चे का संबंध है। सबसे आम है लिंक्ड सूचियों का उपयोग करना जिन्हें सिबलिंग सूचियाँ कहा जाता है। प्रत्येक नोड में उसके पहले बच्चे के लिए एक सूचक होता है, और बच्चे की सूची में अगले नोड के लिए वह इसका एक हिस्सा होता है। कुशल रनिंग टाइम गुणों वाले अन्य कार्यान्वयन [[हैश मैप]]्स, सॉर्ट किए गए या अनसॉर्टेड [[सरणी डेटा संरचना]] ([[गतिशील सरणी]] के साथ), या [[ स्व-संतुलन द्विआधारी खोज वृक्ष ]] का उपयोग करते हैं। हम इसमें रुचि रखते हैं:
प्रत्यय वृक्ष कार्यान्वयन करते समय एक महत्वपूर्ण विकल्प नोड्स के बीच अभिभावक-बच्चे का संबंध है। सबसे आम लिंक्ड सूचियों का उपयोग है जिन्हें सिबलिंग सूचियाँ कहा जाता है। प्रत्येक नोड में उसके पहले बच्चे के लिए एक संकेतक होता है, और बच्चे की सूची में अगले नोड के लिए यह एक हिस्सा होता है। कुशल रनिंग टाइम गुणों वाले अन्य कार्यान्वयन [[हैश मैप|हैश मैप्स]], सॉर्ट किए गए या अनसॉर्टेड [[सरणी डेटा संरचना|एरेज़]] ([[गतिशील सरणी|एरे दोहरीकरण]] के साथ), या [[ स्व-संतुलन द्विआधारी खोज वृक्ष |संतुलित खोज पेड़ों]] का उपयोग करते हैं। हमें इसमें रुचि है:
* किसी दिए गए चरित्र पर बच्चे को खोजने की लागत।
 
* किसी दिए गए चरित्र पर बच्चे को ढूंढने की लागत.
* एक बच्चे को सम्मिलित करने की लागत.
* एक बच्चे को सम्मिलित करने की लागत.
* एक नोड के सभी बच्चों को सूचीबद्ध करने की लागत (नीचे दी गई तालिका में बच्चों की संख्या से विभाजित)।
* किसी नोड के सभी बच्चों को सूचीबद्ध करने की लागत (नीचे तालिका में बच्चों की संख्या से विभाजित)।
 
होने देना {{mvar|&sigma;}} वर्णमाला का आकार हो. तब आपकी निम्नलिखित लागतें होंगी:


मान लीजिए कि {{mvar|&sigma;}} वर्णमाला का आकार है। तो आपके पास निम्नलिखित लागतें होंगी:
:<math>
:<math>
\begin{array}{r|lll}
\begin{array}{r|lll}
Line 125: Line 124:
\end{array}
\end{array}
</math>
</math>
प्रविष्टि लागत का परिशोधन किया जाता है, और हैशिंग की लागत सही हैशिंग के लिए दी जाती है।
सम्मिलन लागत का परिशोधन किया गया है, और हैशिंग की लागत सही हैशिंग के लिए दी गई है।


प्रत्येक किनारे और नोड में बड़ी मात्रा में जानकारी प्रत्यय वृक्ष को बहुत महंगा बनाती है, अच्छे कार्यान्वयन में स्रोत पाठ की मेमोरी आकार का लगभग 10 से 20 गुना उपभोग करती है। प्रत्यय सरणी इस आवश्यकता को 8 के कारक तक कम कर देती है (32-बिट एड्रेस स्पेस और 8-बिट वर्णों के भीतर निर्मित [[एलसीपी सरणी]] मानों सहित सरणी के लिए।) यह कारक गुणों पर निर्भर करता है और 4-बाइट चौड़े वर्णों के उपयोग के साथ 2 तक पहुंच सकता है। (कुछ UNIX-जैसी प्रणालियों में कोई प्रतीक शामिल करने की आवश्यकता है, wchar_t देखें<!--- Don't replace by "wchar t": the type name in the C programming language uses the "_". --->) 32-बिट सिस्टम पर। शोधकर्ताओं ने छोटी अनुक्रमणिका संरचनाओं को ढूंढना जारी रखा है।
प्रत्येक किनारे और नोड में बड़ी मात्रा में जानकारी प्रत्यय वृक्ष को बहुत महंगा बनाती है, जो अच्छे कार्यान्वयन में स्रोत पाठ की मेमोरी आकार का लगभग 10 से 20 गुना अधिक खपत करती है। सफिक्स ऐरे इस आवश्यकता को 8 का कारक तक कम करता है (32-बिट एड्रेस स्पेस और 8-बिट वर्णों के साथ निर्मित [[एलसीपी सरणी|एलसीपी]] मानों को शामिल करने वाले ऐरे के लिए।) यह कारक गुणवत्ताओं पर निर्भर करता है और 32-बिट सिस्टमों पर 4-बाइट चौड़े वर्णों का उपयोग करने के साथ 2 तक पहुंच सकता है (कुछ UNIX-जैसे सिस्टम में किसी भी प्रतीक को समाहित करने के लिए आवश्यक होते हैं, wchar_t देखें)शोधकर्ताओं ने छोटे इंडेक्स संरचनाओं की खोज जारी रखी है।


==समानांतर निर्माण==
==समानांतर निर्माण==


प्रत्यय वृक्ष निर्माण को गति देने के लिए विभिन्न समानांतर एल्गोरिदम प्रस्तावित किए गए हैं।{{sfnp|Apostolico|Iliopoulos|Landau|Schieber|1988}}{{sfnp|Hariharan|1994}}{{sfnp|Sahinalp|Vishkin|1994}}{{sfnp|Farach|Muthukrishnan|1996}}{{sfnp|Iliopoulos|Rytter|2004}}
प्रत्यय वृक्ष निर्माण में तेजी लाने के लिए विभिन्न समानांतर एल्गोरिदम प्रस्तावित किए गए हैं।{{sfnp|Apostolico|Iliopoulos|Landau|Schieber|1988}}{{sfnp|Hariharan|1994}}{{sfnp|Sahinalp|Vishkin|1994}}{{sfnp|Farach|Muthukrishnan|1996}}{{sfnp|Iliopoulos|Rytter|2004}} हाल ही में, <math>O(n)</math> कार्य (अनुक्रमिक समय) और <math>O(\log^2 n)</math> स्पैन के साथ प्रत्यय वृक्ष निर्माण के लिए एक व्यावहारिक समानांतर एल्गोरिदम विकसित किया गया है। एल्गोरिथ्म साझा-मेमोरी मल्टीकोर मशीनों पर अच्छी समानांतर स्केलेबिलिटी प्राप्त करता है और 40-कोर मशीन का उपयोग करके 3 मिनट से कम समय में [[मानव जीनोम]] - लगभग 3 [[गीगाबाइट|जीबी]] - को अनुक्रमित कर सकता है।{{sfnp|Shun|Blelloch|2014}}
हाल ही में, प्रत्यय वृक्ष निर्माण के लिए एक व्यावहारिक समानांतर एल्गोरिदम <math>O(n)</math> समानांतर एल्गोरिदम (अनुक्रमिक समय) का विश्लेषण और <math>O(\log^2 n)</math> समानांतर एल्गोरिदम का विश्लेषण विकसित किया गया है। एल्गोरिदम साझा-मेमोरी मल्टीकोर मशीनों पर अच्छी समानांतर स्केलेबिलिटी प्राप्त करता है और 40-कोर मशीन का उपयोग करके 3 मिनट से कम समय में [[मानव जीनोम]] - लगभग 3 [[गीगाबाइट]] - को अनुक्रमित कर सकता है।{{sfnp|Shun|Blelloch|2014}}


==बाहरी निर्माण==
==बाहरी निर्माण==


यद्यपि रैखिक, प्रत्यय वृक्ष का मेमोरी उपयोग काफी अधिक है
रैखिक होते हुए भी, प्रत्यय वृक्ष का स्मृति उपयोग अनुक्रम संग्रह के वास्तविक आकार से काफी अधिक है। बड़े पाठ के लिए, निर्माण के लिए बाह्य मेमोरी दृष्टिकोण की आवश्यकता हो सकती है।
अनुक्रम संग्रह के वास्तविक आकार की तुलना में। एक बड़े पाठ के लिए,
 
निर्माण के लिए बाह्य मेमोरी दृष्टिकोण की आवश्यकता हो सकती है।
बाहरी मेमोरी में प्रत्यय वृक्षों के निर्माण के सैद्धांतिक परिणाम हैं। {{harvtxt|Farach-Colton|Ferragina|Muthukrishnan|2000}} द्वारा एल्गोरिदम सैद्धांतिक रूप से इष्टतम है, जिसमें सॉर्टिंग के बराबर I/O जटिलता है। हालाँकि, इस एल्गोरिथम की समग्र जटिलता ने अब तक इसके व्यावहारिक कार्यान्वयन को रोका है।{{sfnp|Smyth|2003}}


बाह्य में प्रत्यय वृक्षों के निर्माण के सैद्धांतिक परिणाम हैं
दूसरी ओर, डिस्क-आधारित प्रत्यय पेड़ों के निर्माण के लिए व्यावहारिक कार्य किए गए हैं जो (कुछ) जीबी/घंटे के पैमाने पर हैं। अत्याधुनिक विधियाँ हैं टीडीडी,<ref name="tdd">{{harvtxt|Tata|Hankins|Patel|2003}}.</ref> ट्रेलिस,<ref name="trellis">{{harvtxt|Phoophakdee|Zaki|2007}}.</ref> डिजेएसटी,<ref name="digest">{{harvtxt|Barsky|Stege|Thomo|Upton|2008}}.</ref> और बी2एसटी।<ref name="b2st">{{harvtxt|Barsky|Stege|Thomo|Upton|2009}}.</ref>
याद।
एल्गोरिथ्म द्वारा {{harvtxt|Farach-Colton|Ferragina|Muthukrishnan|2000}}
सैद्धांतिक रूप से इष्टतम है, सॉर्टिंग के बराबर I/O जटिलता के साथ।
हालाँकि, इस एल्गोरिथम की समग्र जटिलता ने अब तक इसे रोका है
व्यावहारिक कार्यान्वयन।{{sfnp|Smyth|2003}}


दूसरी ओर, निर्माण के लिए व्यावहारिक कार्य भी हुए हैं
टीडीडी और ट्रेलिस पूरे मानव जीनोम तक फैलते हैं, जिसके परिणामस्वरूप दसियों गीगाबाइट आकार का एक डिस्क-आधारित प्रत्यय वृक्ष बनता है।<ref name="tdd" /><ref name="trellis" /> हालाँकि, ये विधियाँ 3GB से अधिक अनुक्रमों के संग्रह को कुशलता से संभाल नहीं सकती हैं।<ref name="digest" /> DiGeST काफी बेहतर प्रदर्शन करता है और लगभग 6 घंटों में 6GB के क्रम में अनुक्रमों के संग्रह को संभालने में सक्षम है।<ref name="digest" />
डिस्क-आधारित प्रत्यय वृक्ष
जो (कुछ) जीबी/घंटे का पैमाना है।
अत्याधुनिक विधियां टीडीडी हैं,<ref name="tdd">{{harvtxt|Tata|Hankins|Patel|2003}}.</ref>
ट्रेलिस,<ref name="trellis">{{harvtxt|Phoophakdee|Zaki|2007}}.</ref>
डिजेएसटी,<ref name="digest">{{harvtxt|Barsky|Stege|Thomo|Upton|2008}}.</ref>
और
बी<sup>2</sup>ST.<ref name="b2st">{{harvtxt|Barsky|Stege|Thomo|Upton|2009}}.</ref>
टीडीडी और ट्रेलिस पूरे मानव जीनोम तक स्केल करते हैं जिसके परिणामस्वरूप दसियों गीगाबाइट आकार का एक डिस्क-आधारित प्रत्यय वृक्ष बनता है।<ref name="tdd" /><ref name="trellis" />हालाँकि, ये विधियाँ 3GB से अधिक अनुक्रमों के संग्रह को कुशलतापूर्वक संभाल नहीं सकती हैं।<ref name="digest" /> DiGeST काफी बेहतर प्रदर्शन करता है और लगभग 6 घंटों में 6GB के क्रम में अनुक्रमों के संग्रह को संभालने में सक्षम है।<ref name="digest" />


ये सभी विधियाँ उस मामले के लिए कुशलतापूर्वक प्रत्यय वृक्षों का निर्माण कर सकती हैं जब
ये सभी विधियां उस स्थिति के लिए कुशलतापूर्वक प्रत्यय पेड़ बना सकती हैं जब पेड़ मुख्य मेमोरी में फिट नहीं होता है, लेकिन इनपुट होता है। सबसे नवीनतम विधि, B2ST,<ref name="b2st" /> उन इनपुट को संभालने के लिए स्केल करती है जो मुख्य मेमोरी में फिट नहीं होते हैं। ईआरए एक हालिया समानांतर प्रत्यय वृक्ष निर्माण विधि है जो काफी तेज़ है। ईआरए 16 जीबी रैम के साथ 8-कोर डेस्कटॉप कंप्यूटर पर 19 मिनट में पूरे मानव जीनोम को अनुक्रमित कर सकता है। 16 नोड्स (4 जीबी रैम प्रति नोड) वाले एक साधारण लिनक्स क्लस्टर पर, ईआरए 9 मिनट से भी कम समय में पूरे मानव जीनोम को अनुक्रमित कर सकता है।{{sfnp|Mansour|Allam|Skiadopoulos|Kalnis|2011}}
पेड़ मुख्य मेमोरी में फ़िट नहीं होता,
लेकिन इनपुट करता है.
सबसे नवीनतम विधि, बी<sup>2</sup>ST,<ref name="b2st" />संभालने के लिए तराजू
ऐसे इनपुट जो मुख्य मेमोरी में फिट नहीं होते। ईआरए एक हालिया समानांतर प्रत्यय वृक्ष निर्माण विधि है जो काफी तेज़ है। ईआरए 16 जीबी रैम वाले 8-कोर डेस्कटॉप कंप्यूटर पर 19 मिनट में संपूर्ण मानव जीनोम को अनुक्रमित कर सकता है। 16 नोड्स (प्रति नोड 4 जीबी रैम) वाले एक साधारण लिनक्स क्लस्टर पर, ईआरए 9 मिनट से भी कम समय में पूरे मानव जीनोम को अनुक्रमित कर सकता है।{{sfnp|Mansour|Allam|Skiadopoulos|Kalnis|2011}}


==यह भी देखें==
==यह भी देखें==

Revision as of 21:41, 15 July 2023

पाठ के लिए प्रत्यय वृक्ष BANANA. प्रत्येक सबस्ट्रिंग को विशेष वर्ण के साथ समाप्त किया जाता है $. जड़ से पत्तियों तक के छह रास्ते (बक्से के रूप में दिखाए गए) छह प्रत्ययों के अनुरूप हैं A$, NA$, ANA$, NANA$, ANANA$ और BANANA$. पत्तों की संख्याएँ संबंधित प्रत्यय की आरंभिक स्थिति बताती हैं। निर्माण के दौरान धराशायी खींचे गए प्रत्यय लिंक का उपयोग किया जाता है।

कंप्यूटर विज्ञान में, एक प्रत्यय वृक्ष (जिसे पीएटी वृक्ष या, पहले के रूप में, स्थिति वृक्ष भी कहा जाता है) एक संपीड़ित त्रि है जिसमें दिए गए पाठ के सभी प्रत्ययों को उनकी कुंजी के रूप में और पाठ में उनके मूल्यों के रूप में स्थान दिया जाता है। प्रत्यय पेड़ कई महत्वपूर्ण स्ट्रिंग ऑपरेशनों के विशेष रूप से तेज़ कार्यान्वयन की अनुमति देते हैं।

इस प्रकार के एक पेड़ का निर्माण स्ट्रिंग के लिए की लंबाई में समय और स्थान लीनियर लेता है। एक बार निर्मित होने के बाद, कई ऑपरेशन तेजी से किए जा सकते हैं, उदाहरण के लिए में एक सबस्ट्रिंग का पता लगाना, यदि कुछ गलतियाँ स्वीकार की जाती हैं तो एक सबस्ट्रिंग का पता लगाना, एक नियमित अभिव्यक्ति पैटर्न के लिए मिलान करना इत्यादि। सफेक्स ट्रीज़ ने सबसे लंबी सामान्य सबस्ट्रिंग समस्या के लिए पहले से ही लीनियर समय के समाधानों में से एक प्रदान किया।[2] ये गति वृद्धि खर्च पर आती है: एक स्ट्रिंग के सफेक्स ट्री को संग्रह करना आमतौर पर स्ट्रिंग खुद को संग्रह करने से बहुत अधिक स्थान की आवश्यकता होती है।

इतिहास

यह अवधारणा पहली बार Weiner (1973) द्वारा पेश की गई थी। सूफ़िक्स के बजाय, Weiner ने अपने trie[3] में प्रत्येक स्थान के लिए प्रत्याधिकारी पहचानकर्ता संग्रहित की, अर्थात्, से प्रारंभ होने और में केवल एक बार होने वाली सबसे छोटी स्ट्रिंग। उनका एल्गोरिदम डी के लिए एक अप्रेस्स किए गए trie को लेता है[4] और इसे के लिए एक trie में बढ़ाता है। इस तरीके से, ट्रिवियल trie से के लिए trie को के लिए एल्गोरिदम डी को लगातार कॉल करके बनाया जा सकता है; हालांकि, कुल मान्य समय होता है। Weiner का एल्गोरिदम बी कई सहायक डेटा संरचनाओं को बनाए रखने के लिए उपयोग करता है, जिससे निर्मित trie के आकार में संगठन का चलन औसत करार दिया जा सकता है। यह अंतिम रूप से नोड हो सकता है, जैसे के लिए। Weiner का एल्गोरिदम सी अंततः संपीडित trie का उपयोग करता है, जिससे आकार और संचालन का चलन लीनियर समग्र संचय आकार और समय होता है।[5] डोनाल्ड नुथ ने इसे बाद में "वर्ष 1973 का एल्गोरिदम" के रूप में वर्णनित किया।[citation needed] पाठग्रंथ Aho, Hopcroft & Ullman (1974, Sect.9.5) ने Weiner के परिणामों को सरल और और सुंदर रूप में पुनर्जीवित किया, पद पेड़ के शब्द का परिचय कराया।

McCreight (1976) के सभी प्रत्ययों की एक (संपीड़ित) त्रि बनाने वाले पहले व्यक्ति थे। हालाँकि से शुरू होने वाला प्रत्यय आमतौर पर उपसर्ग पहचानकर्ता से अधिक लंबा होता है, एक संपीड़ित त्रि में उनका पथ प्रतिनिधित्व आकार में भिन्न नहीं होता है। दूसरी ओर, मैकक्रेइट वेनर की अधिकांश सहायक डेटा संरचनाओं से दूर रह सकता है; केवल प्रत्यय लिंक बचे हैं।

Ukkonen (1995) ने निर्माण को और सरल बनाया।[6] उन्होंने प्रत्यय वृक्षों का पहला ऑनलाइन-निर्माण प्रदान किया, जिसे अब उक्कोनेन के एल्गोरिदम के रूप में जाना जाता है, जिसमें चलने का समय तत्कालीन सबसे तेज़ एल्गोरिदम से मेल खाता था। ये सभी एल्गोरिदम स्थिर आकार के वर्णमाला के लिए रैखिक-समय हैं, और सामान्य तौर पर सबसे खराब स्थिति में चलने का समय है।

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

परिभाषा

लंबाई की स्ट्रिंग के लिए प्रत्यय पेड़ को एक पेड़ के रूप में परिभाषित किया गया है:[7]

  • पेड़ में बिल्कुल n पत्तियाँ हैं जिनकी संख्या से है।
  • रूट को छोड़कर, हर आंतरिक नोड में कम से कम दो बच्चे होते हैं।
  • प्रत्येक किनारे को की एक गैर-रिक्त सबस्ट्रिंग के साथ लेबल किया गया है।
  • किसी नोड से शुरू होने वाले किसी भी दो किनारों में समान वर्ण से शुरू होने वाले स्ट्रिंग-लेबल नहीं हो सकते हैं।
  • जड़ से पत्ती तक के पथ पर पाए जाने वाले सभी स्ट्रिंग-लेबलों को संयोजित करके प्राप्त स्ट्रिंग, प्रत्यय का उच्चारण करती है, के लिए से तक।

ऐसे पेड़ का अस्तित्व सभी स्ट्रिंग्स के लिए नहीं होता है, इसलिए को स्ट्रिंग में देखा जाने वाला कोई टर्मिनल सिम्बल (आमतौर पर $ से दर्शाया जाता है) के साथ पैड किया जाता है। इससे यह सुनिश्चित होता है कि कोई सफिक्स किसी अन्य सफिक्स का प्रारंभ नहीं है, और के सफिक्स के लिए प्रत्येक के लिए पत्ती के नोड होंगे। सभी आंतरिक गैर-रूट नोड्स ब्रांचिंग होने के कारण, अधिकतम n - 1 ऐसे नोड्स हो सकते हैं, और कुल में 2n नोड्स होते हैं (n पत्तियाँ, n - 1 आंतरिक गैर-रूट नोड्स, 1 रूट)।

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

एक सामान्यीकृत प्रत्यय वृक्ष एक प्रत्यय वृक्ष है जो एकल स्ट्रिंग के बजाय स्ट्रिंग के एक सेट के लिए बनाया गया है। यह तारों के इस सेट से सभी प्रत्ययों का प्रतिनिधित्व करता है। प्रत्येक स्ट्रिंग को एक अलग समाप्ति चिह्न द्वारा समाप्त किया जाना चाहिए।

कार्यक्षमता

लंबाई की स्ट्रिंग के लिए एक प्रत्यय वृक्ष समय में बनाया जा सकता है, यदि अक्षर बहुपद श्रेणी में पूर्णांकों के वर्णमाला से आते हैं (विशेष रूप से, यह स्थिर आकार के अक्षरों के लिए सच है)।[8] बड़े अक्षरों के लिए, पहले अक्षरों को क्रमबद्ध करके उन्हें आकार की श्रेणी में लाने के लिए चलने के समय का प्रभुत्व होता है; सामान्यतः इसमें समय लगता है। नीचे दी गई लागत इस धारणा के तहत दी गई है कि वर्णमाला स्थिर है।छँटाई एल्गोरिथ्म

मान लें कि लंबाई की स्ट्रिंग के लिए एक प्रत्यय वृक्ष बनाया गया है, या कुल लंबाई की स्ट्रिंग के सेट के लिए एक सामान्यीकृत प्रत्यय वृक्ष बनाया गया है। आप यह कर सकते हैं:

  • तार खोजें:
    • जांचें कि क्या लंबाई की स्ट्रिंग , बार में एक सबस्ट्रिंग है।[9]
    • कुल लंबाई के पैटर्न की बार में सबस्ट्रिंग के रूप में पहली घटना ज्ञात कीजिए।
    • समय में सबस्ट्रिंग के रूप में कुल लंबाई के पैटर्न की सभी घटनाएँ ज्ञात करें।[10]
    • में अपेक्षित सबलाइनियर टाइम में एक नियमित अभिव्यक्ति पी खोजें।[11]
    • पैटर्न के प्रत्येक प्रत्यय के लिए, समय में के उपसर्ग और में एक सबस्ट्रिंग के बीच सबसे लंबे मिलान की लंबाई ज्ञात करें।[12] इसे के मिलान आँकड़े कहा जाता है।
  • स्ट्रिंग्स के गुण खोजें:
    • बार में स्ट्रिंग और की सबसे लंबी सामान्य उपस्ट्रिंग्स खोजें।[13]
    • समय में सभी अधिकतम जोड़े, अधिकतम दोहराव या सुपरमैक्सिमल दोहराव खोजें।[14]
    • बार में लेम्पेल-ज़िव अपघटन का पता लगाएं।[15]
    • बार में सबसे लंबे समय तक दोहराया जाने वाला सबस्ट्रिंग खोजें।
    • बार में न्यूनतम लंबाई की सबसे अधिक बार आने वाली सबस्ट्रिंग खोजें।
    • में से सबसे छोटी स्ट्रिंग खोजें जो में नहीं आती हैं, समय में, यदि ऐसी स्ट्रिंग हैं।
    • बार में केवल एक बार आने वाली सबसे छोटी उपस्ट्रिंग ज्ञात कीजिए।
    • प्रत्येक के लिए, समय में में से की सबसे छोटी उपस्ट्रिंग खोजें जो कहीं और न हों।

प्रत्यय वृक्ष को समय में नोड्स के बीच निरंतर समय न्यूनतम सामान्य पूर्वज पुनर्प्राप्ति के लिए तैयार किया जा सकता है।[16] तब कोई भी यह कर सकता है:

में प्रत्यय और के बीच सबसे लंबा सामान्य उपसर्ग खोजें।[17]

बार में अधिकतम k बेमेल के साथ m लंबाई का एक पैटर्न P खोजें, जहां z हिट की संख्या है।[18]

यदि लंबाई के अंतराल की अनुमति है, या यदि बेमेल की विलोमपद अनुमति है, तो ,[19] या बार में सभी अधिकतम पैलिन्ड्रोम खोजें।[20]

में सभी अग्रानुक्रम दोहराव खोजें, और के-बेमेल अग्रानुक्रम में दोहराएँ।[21]

समय में के लिए में कम से कम स्ट्रिंग्स के लिए सबसे लंबी आम सबस्ट्रिंग्स खोजें।[22]

रैखिक समय में किसी दिए गए स्ट्रिंग का सबसे लंबा पैलिंड्रोमिक सबस्ट्रिंग (स्ट्रिंग के सामान्यीकृत प्रत्यय ट्री और उसके रिवर्स का उपयोग करके) खोजें।[23]


अनुप्रयोग

प्रत्यय वृक्षों का उपयोग पाठ-संपादन, मुक्त-पाठ खोज, कम्प्यूटेशनल बायोलॉजी और अन्य अनुप्रयोग क्षेत्रों में होने वाली बड़ी संख्या में स्ट्रिंग समस्याओं को हल करने के लिए किया जा सकता है।[24] प्राथमिक अनुप्रयोगों में शामिल हैं:[24]

  • स्ट्रिंग खोज, ओ(एम) जटिलता में, जहां एम उप-स्ट्रिंग की लंबाई है (लेकिन स्ट्रिंग के लिए प्रत्यय वृक्ष बनाने के लिए प्रारंभिक ओ(एन) समय की आवश्यकता होती है)
  • सबसे लंबे समय तक दोहराई जाने वाली सबस्ट्रिंग ढूँढना
  • सबसे लंबी उभयनिष्ठ उपस्ट्रिंग ढूँढना
  • एक स्ट्रिंग में सबसे लंबा पैलिन्ड्रोम ढूँढना

प्रत्यय वृक्षों का उपयोग अक्सर जैव सूचना विज्ञान अनुप्रयोगों में किया जाता है, जो डीएनए या प्रोटीन अनुक्रमों में पैटर्न की खोज करते हैं (जिन्हें वर्णों की लंबी श्रृंखला के रूप में देखा जा सकता है)। बेमेल के साथ कुशलता से खोज करने की क्षमता को उनकी सबसे बड़ी ताकत माना जा सकता है। प्रत्यय पेड़ों का उपयोग डेटा संपीड़न में भी किया जाता है; उनका उपयोग बार-बार डेटा ढूंढने के लिए किया जा सकता है, और बरोज़-व्हीलर ट्रांसफॉर्म के सॉर्टिंग चरण के लिए भी किया जा सकता है। LZW संपीड़न योजनाओं के प्रकार प्रत्यय वृक्ष (LZSS) का उपयोग करते हैं। प्रत्यय ट्री का उपयोग प्रत्यय ट्री क्लस्टरिंग में भी किया जाता है, कुछ खोज इंजनों में उपयोग किया जाने वाला डेटा क्लस्टरिंग एल्गोरिदम।[25]

कार्यान्वयन

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

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

  • किसी दिए गए चरित्र पर बच्चे को ढूंढने की लागत.
  • एक बच्चे को सम्मिलित करने की लागत.
  • किसी नोड के सभी बच्चों को सूचीबद्ध करने की लागत (नीचे तालिका में बच्चों की संख्या से विभाजित)।

मान लीजिए कि σ वर्णमाला का आकार है। तो आपके पास निम्नलिखित लागतें होंगी:

सम्मिलन लागत का परिशोधन किया गया है, और हैशिंग की लागत सही हैशिंग के लिए दी गई है।

प्रत्येक किनारे और नोड में बड़ी मात्रा में जानकारी प्रत्यय वृक्ष को बहुत महंगा बनाती है, जो अच्छे कार्यान्वयन में स्रोत पाठ की मेमोरी आकार का लगभग 10 से 20 गुना अधिक खपत करती है। सफिक्स ऐरे इस आवश्यकता को 8 का कारक तक कम करता है (32-बिट एड्रेस स्पेस और 8-बिट वर्णों के साथ निर्मित एलसीपी मानों को शामिल करने वाले ऐरे के लिए।) यह कारक गुणवत्ताओं पर निर्भर करता है और 32-बिट सिस्टमों पर 4-बाइट चौड़े वर्णों का उपयोग करने के साथ 2 तक पहुंच सकता है (कुछ UNIX-जैसे सिस्टम में किसी भी प्रतीक को समाहित करने के लिए आवश्यक होते हैं, wchar_t देखें)। शोधकर्ताओं ने छोटे इंडेक्स संरचनाओं की खोज जारी रखी है।

समानांतर निर्माण

प्रत्यय वृक्ष निर्माण में तेजी लाने के लिए विभिन्न समानांतर एल्गोरिदम प्रस्तावित किए गए हैं।[26][27][28][29][30] हाल ही में, कार्य (अनुक्रमिक समय) और स्पैन के साथ प्रत्यय वृक्ष निर्माण के लिए एक व्यावहारिक समानांतर एल्गोरिदम विकसित किया गया है। एल्गोरिथ्म साझा-मेमोरी मल्टीकोर मशीनों पर अच्छी समानांतर स्केलेबिलिटी प्राप्त करता है और 40-कोर मशीन का उपयोग करके 3 मिनट से कम समय में मानव जीनोम - लगभग 3 जीबी - को अनुक्रमित कर सकता है।[31]

बाहरी निर्माण

रैखिक होते हुए भी, प्रत्यय वृक्ष का स्मृति उपयोग अनुक्रम संग्रह के वास्तविक आकार से काफी अधिक है। बड़े पाठ के लिए, निर्माण के लिए बाह्य मेमोरी दृष्टिकोण की आवश्यकता हो सकती है।

बाहरी मेमोरी में प्रत्यय वृक्षों के निर्माण के सैद्धांतिक परिणाम हैं। Farach-Colton, Ferragina & Muthukrishnan (2000) द्वारा एल्गोरिदम सैद्धांतिक रूप से इष्टतम है, जिसमें सॉर्टिंग के बराबर I/O जटिलता है। हालाँकि, इस एल्गोरिथम की समग्र जटिलता ने अब तक इसके व्यावहारिक कार्यान्वयन को रोका है।[32]

दूसरी ओर, डिस्क-आधारित प्रत्यय पेड़ों के निर्माण के लिए व्यावहारिक कार्य किए गए हैं जो (कुछ) जीबी/घंटे के पैमाने पर हैं। अत्याधुनिक विधियाँ हैं टीडीडी,[33] ट्रेलिस,[34] डिजेएसटी,[35] और बी2एसटी।[36]

टीडीडी और ट्रेलिस पूरे मानव जीनोम तक फैलते हैं, जिसके परिणामस्वरूप दसियों गीगाबाइट आकार का एक डिस्क-आधारित प्रत्यय वृक्ष बनता है।[33][34] हालाँकि, ये विधियाँ 3GB से अधिक अनुक्रमों के संग्रह को कुशलता से संभाल नहीं सकती हैं।[35] DiGeST काफी बेहतर प्रदर्शन करता है और लगभग 6 घंटों में 6GB के क्रम में अनुक्रमों के संग्रह को संभालने में सक्षम है।[35]

ये सभी विधियां उस स्थिति के लिए कुशलतापूर्वक प्रत्यय पेड़ बना सकती हैं जब पेड़ मुख्य मेमोरी में फिट नहीं होता है, लेकिन इनपुट होता है। सबसे नवीनतम विधि, B2ST,[36] उन इनपुट को संभालने के लिए स्केल करती है जो मुख्य मेमोरी में फिट नहीं होते हैं। ईआरए एक हालिया समानांतर प्रत्यय वृक्ष निर्माण विधि है जो काफी तेज़ है। ईआरए 16 जीबी रैम के साथ 8-कोर डेस्कटॉप कंप्यूटर पर 19 मिनट में पूरे मानव जीनोम को अनुक्रमित कर सकता है। 16 नोड्स (4 जीबी रैम प्रति नोड) वाले एक साधारण लिनक्स क्लस्टर पर, ईआरए 9 मिनट से भी कम समय में पूरे मानव जीनोम को अनुक्रमित कर सकता है।[37]

यह भी देखें

टिप्पणियाँ

  1. Donald E. Knuth; James H. Morris; Vaughan R. Pratt (Jun 1977). "Fast Pattern Matching in Strings" (PDF). SIAM Journal on Computing. 6 (2): 323–350. doi:10.1137/0206024. Here: p.339 bottom.
  2. Knuth conjectured in 1970 that the problem could not be solved in linear time.[1] In 1973, this was refuted by Weiner's suffix-tree algorithm Weiner (1973).
  3. This term is used here to distinguish Weiner's precursor data structures from proper suffix trees as defined above and unconsidered before McCreight (1976).
  4. i.e., with each branch labelled by a single character
  5. See File:WeinerB aaaabbbbaaaabbbb.gif and File:WeinerC aaaabbbbaaaabbbb.gif for an uncompressed example tree and its compressed correspondant.
  6. Giegerich & Kurtz (1997).
  7. http://www.cs.uoi.gr/~kblekas/courses/bioinformatics/Suffix_Trees1.pdf[permanent dead link]
  8. Farach (1997).
  9. Gusfield (1999), p.92.
  10. Gusfield (1999), p.123.
  11. Baeza-Yates & Gonnet (1996).
  12. Gusfield (1999), p.132.
  13. Gusfield (1999), p.125.
  14. Gusfield (1999), p.144.
  15. Gusfield (1999), p.166.
  16. Gusfield (1999), Chapter 8.
  17. Gusfield (1999), p.196.
  18. Gusfield (1999), p.200.
  19. Gusfield (1999), p.198.
  20. Gusfield (1999), p.201.
  21. Gusfield (1999), p.204.
  22. Gusfield (1999), p.205.
  23. Gusfield (1999), pp.197–199.
  24. 24.0 24.1 Allison, L. "प्रत्यय वृक्ष". Archived from the original on 2008-10-13. Retrieved 2008-10-14.
  25. First introduced by Zamir & Etzioni (1998).
  26. Apostolico et al. (1988).
  27. Hariharan (1994).
  28. Sahinalp & Vishkin (1994).
  29. Farach & Muthukrishnan (1996).
  30. Iliopoulos & Rytter (2004).
  31. Shun & Blelloch (2014).
  32. Smyth (2003).
  33. 33.0 33.1 Tata, Hankins & Patel (2003).
  34. 34.0 34.1 Phoophakdee & Zaki (2007).
  35. 35.0 35.1 35.2 Barsky et al. (2008).
  36. 36.0 36.1 Barsky et al. (2009).
  37. Mansour et al. (2011).


संदर्भ


बाहरी संबंध