सफिक्स ट्री: 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|पाठ के लिए प्रत्यय वृक...")
 
No edit summary
 
(8 intermediate revisions by 4 users not shown)
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|वेनर|1973}} द्वारा प्रस्तुत की गई थी। सफिक्स <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> में केवल एक बार होने वाली सबसे छोटी स्ट्रिंग होती है। उनका ''एल्गोरिदम'' ''डी''<math>S[k+1..n]</math> के लिए असम्पीडित (अनकप्रेस्सेड) ट्राई को लेता है<ref>i.e., with each branch labelled by a single character</ref> और इसे <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> [[डोनाल्ड नुथ]] ने इसे बाद में "वर्ष 1973 का एल्गोरिदम" के रूप में वर्णनित किया। पाठग्रंथ {{harvtxt|एएचओ|होपक्रॉफ्ट|उल्मन|1974|loc=Sect.9.5}} ने वेनर के परिणामों को सरल और और सुंदर रूप में पुनर्जीवित किया, ''पोजीशन ट्री'' के शब्द का परिचय कराया।
प्रत्यय के बजाय <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|मैकक्रेइट|1976}} <math>S</math> के सभी सफिक्स की एक (संपीड़ित (कंप्रेस्ड)) ट्राई बनाने वाले पहले व्यक्ति थे। हालाँकि <math>i</math> से शुरू होने वाला सफिक्स सामान्यतः प्रीफिक्स आइडेंटिफायर से अधिक लंबा होता है, संपीड़ित ट्राई में उनका पथ प्रतिनिधित्व साइज़ में भिन्न नहीं होता है। दूसरी ओर, मैकक्रेइट वेनर की अधिकांश सहायक डेटा संरचनाओं से दूर रह सकता है; केवल सफिक्स लिंक बचे हैं।


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


{{harvtxt|Farach|1997}} ने पहला प्रत्यय वृक्ष निर्माण एल्गोरिदम दिया जो सभी वर्णमालाओं के लिए इष्टतम है। विशेष रूप से, यह पहला रैखिक-समय एल्गोरिदम है
{{harvtxt|फाराच|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>S</math> के <math>n</math> सफिक्स के प्रत्येक के लिए एक होंगे। मूल से भिन्न आंतरिक नोड सभी ब्रांचिंग होने के कारण, अधिकतम n - 1 ऐसे नोड हो सकते हैं, और कुल n + (n - 1) + 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>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>\Theta(n)</math> समय में बनाया जा सकता है, यदि अक्षर बहुपद श्रेणी में पूर्णांकों के वर्णमाला से आते हैं (विशेष रूप से, यह स्थिर साइज़ के अक्षरों के लिए सच है)।{{sfnp|Farach|1997}} बड़े वर्णमालाओं के लिए, चलन समय का मुख्य भाग पहले अक्षरों को [[छँटाई एल्गोरिथ्म|सॉर्ट]] करके उन्हें साइज़ <math>O(n)</math> के रेंज में लाने का होता है; सामान्यतः, इसके लिए <math>O(n\log n)</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>P_1,\dots,P_q</math> कुल लंबाई का <math>m</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>m</math> लंबाई की एक स्ट्रिंग <math>P</math> को <math>O(m)</math> समय में उपस्थिति जांचें।<ref>{{harvtxt|Gusfield|1999}}, p.92.</ref>
** कुल लंबाई <math>m</math> के पैटर्न <math>P_1,\dots,P_q</math> की <math>O(m)</math> बार में सबस्ट्रिंग के रूप में पहली घटना ज्ञात कीजिए।
** <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> में अपेक्षित [[सबलाइनियर टाइम एल्गोरिदम|सब-लीनियर]] समय में एक नियमित व्यंजक '''P''<nowiki/>' की सर्च करें।{{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>\Theta(n)</math> समय।<ref>{{harvtxt|Gusfield|1999}}, Chapter 8.</ref> तब कोई यह भी कर सकता है:
<math>O(k n + z)</math> बार में अधिकतम k बेमेल के साथ m लंबाई का एक पैटर्न P खोजें, जहां z हिट की संख्या है।<ref>{{harvtxt|Gusfield|1999}}, p.200.</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>
* सब ढूँढ़ो <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>


यदि लंबाई <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> समय में <math>k=2,\dots,K</math> के लिए <math>D</math> में कम से कम <math>k</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>
* स्ट्रिंग सर्च, ''O(m)'' जटिलता में, जहां ''m'' सबस्ट्रिंग की लंबाई है (लेकिन स्ट्रिंग के लिए सफिक्स ट्री बनाने के लिए प्रारंभिक ''O(n)'' समय की आवश्यकता होती है)
* सबसे लंबे समय तक दोहराई जाने वाली सबस्ट्रिंग प्राप्त करना
* सबसे लंबी उभयनिष्ठ सबस्ट्रिंग प्राप्त करना
* किसी स्ट्रिंग में दीर्घतम पैलिन्ड्रोम प्राप्त करना


सफिक्स ट्री का उपयोग अक्सर जैव सूचना विज्ञान अनुप्रयोगों में किया जाता है, जो [[डीएनए]] या [[प्रोटीन]] अनुक्रमों में पैटर्न की सर्च करते हैं (जिन्हें वर्णों की लंबी श्रृंखला के रूप में देखा जा सकता है)। बेमेल के साथ कुशलता से सर्च करने की क्षमता को उनकी सबसे बड़ी ताकत माना जा सकता है। सफिक्स ट्री का उपयोग डेटा संपीड़न में भी किया जाता है; उनका उपयोग बार-बार डेटा ढूंढने के लिए किया जा सकता है, और बरोज़-व्हीलर ट्रांसफॉर्म के सॉर्टिंग चरण के लिए भी किया जा सकता है। [[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 122:
\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 तक पहुंच सकता है (कुछ युएनआईएक्स-लाइक सिस्टम में किसी भी प्रतीक को समाहित करने के लिए आवश्यक होते हैं, 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 [[गीगाबाइट|GB]] - को अनुक्रमित कर सकता है।{{sfnp|Shun|Blelloch|2014}}
हाल ही में, प्रत्यय वृक्ष निर्माण के लिए एक व्यावहारिक समानांतर एल्गोरिदम <math>O(n)</math> समानांतर एल्गोरिदम (अनुक्रमिक समय) का विश्लेषण और <math>O(\log^2 n)</math> समानांतर एल्गोरिदम का विश्लेषण विकसित किया गया है। एल्गोरिदम साझा-मेमोरी मल्टीकोर मशीनों पर अच्छी समानांतर स्केलेबिलिटी प्राप्त करता है और 40-कोर मशीन का उपयोग करके 3 मिनट से कम समय में [[मानव जीनोम]] - लगभग 3 [[गीगाबाइट]] - को अनुक्रमित कर सकता है।{{sfnp|Shun|Blelloch|2014}}


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


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


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


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


ये सभी विधियाँ उस मामले के लिए कुशलतापूर्वक प्रत्यय वृक्षों का निर्माण कर सकती हैं जब
TDD और TRELLIS पूरे मानव जीनोम तक फैलते हैं, जिसके परिणामस्वरूप दसियों गीगाबाइट साइज़ का एक डिस्क-आधारित सफिक्स ट्री बनता है।<ref name="tdd" /><ref name="trellis" /> हालाँकि, ये विधियाँ 3GB से अधिक अनुक्रमों के संग्रह को कुशलता से संभाल नहीं सकती हैं।<ref name="digest" /> DiGeST काफी बेहतर प्रदर्शन करता है और लगभग 6 घंटों में 6GB के क्रम में अनुक्रमों के संग्रह को संभालने में सक्षम है।<ref name="digest" />
पेड़ मुख्य मेमोरी में फ़िट नहीं होता,
 
लेकिन इनपुट करता है.
ये सभी विधियां उस स्थिति के लिए कुशलतापूर्वक सफिक्स ट्री बना सकती हैं जब ट्री मुख्य मेमोरी में फिट नहीं होता है, लेकिन इनपुट होता है। सबसे नवीनतम विधि, B<sup>2</sup>ST,<ref name="b2st" /> उन इनपुट को संभालने के लिए स्केल करती है जो मुख्य मेमोरी में फिट नहीं होते हैं। ईआरए एक हालिया समानांतर सफिक्स ट्री निर्माण विधि है जो काफी तेज़ है। ईआरए 16 GB रैम के साथ 8-कोर डेस्कटॉप कंप्यूटर पर 19 मिनट में पूरे मानव जीनोम को अनुक्रमित कर सकता है। 16 नोड्स (4 GB रैम प्रति नोड) वाले एक साधारण लिनक्स क्लस्टर पर, ईआरए 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}}


==यह भी देखें==
==यह भी देखें==
* [[प्रत्यय ऑटोमेटन]]
* [[प्रत्यय ऑटोमेटन|सफिक्स ऑटोमेटन]]


==टिप्पणियाँ==
==टिप्पणियाँ==
{{Reflist|colwidth=30em}}
{{Reflist|colwidth=30em}}
==संदर्भ==
==संदर्भ==
*{{citation
*{{citation
Line 396: Line 373:
  | citeseerx = 10.1.1.36.4719
  | citeseerx = 10.1.1.36.4719
  }}.
  }}.
== बाहरी संबंध ==
== बाहरी संबंध ==
* [http://www.cise.ufl.edu/~sahni/dsaaj/enrich/c16/suffix.htm Suffix Trees] by [[Sartaj Sahni]]
* [http://www.cise.ufl.edu/~sahni/dsaaj/enrich/c16/suffix.htm Suffix Trees] by [[Sartaj Sahni]]
Line 405: Line 380:
* Ukkonen's Suffix Tree Implementation in C [http://www.geeksforgeeks.org/ukkonens-suffix-tree-construction-part-1/ Part 1] [http://www.geeksforgeeks.org/ukkonens-suffix-tree-construction-part-2/ Part 2] [http://www.geeksforgeeks.org/ukkonens-suffix-tree-construction-part-3/ Part 3] [http://www.geeksforgeeks.org/ukkonens-suffix-tree-construction-part-4/ Part 4] [http://www.geeksforgeeks.org/ukkonens-suffix-tree-construction-part-5/ Part 5] [http://www.geeksforgeeks.org/ukkonens-suffix-tree-construction-part-6/ Part 6]
* Ukkonen's Suffix Tree Implementation in C [http://www.geeksforgeeks.org/ukkonens-suffix-tree-construction-part-1/ Part 1] [http://www.geeksforgeeks.org/ukkonens-suffix-tree-construction-part-2/ Part 2] [http://www.geeksforgeeks.org/ukkonens-suffix-tree-construction-part-3/ Part 3] [http://www.geeksforgeeks.org/ukkonens-suffix-tree-construction-part-4/ Part 4] [http://www.geeksforgeeks.org/ukkonens-suffix-tree-construction-part-5/ Part 5] [http://www.geeksforgeeks.org/ukkonens-suffix-tree-construction-part-6/ Part 6]
* [https://brenden.github.io/ukkonen-animation/ Online Demo: Ukkonen's Suffix Tree Visualization]
* [https://brenden.github.io/ukkonen-animation/ Online Demo: Ukkonen's Suffix Tree Visualization]
{{CS-Trees}}
{{DEFAULTSORT:Suffix Tree}}
{{Strings}}
 
{{DEFAULTSORT:Suffix Tree}}[[Category: पेड़ (डेटा संरचनाएं)]] [[Category: सबस्ट्रिंग सूचकांक]] [[Category: स्ट्रिंग डेटा संरचनाएँ]] [[Category: कंप्यूटर विज्ञान प्रत्यय]]
 
 


[[Category: Machine Translated Page]]
[[Category:All articles with dead external links]]
[[Category:Created On 10/07/2023]]
[[Category:Articles with dead external links from June 2018]]
[[Category:Articles with permanently dead external links]]
[[Category:Created On 10/07/2023|Suffix Tree]]
[[Category:Lua-based templates|Suffix Tree]]
[[Category:Machine Translated Page|Suffix Tree]]
[[Category:Pages with script errors|Suffix Tree]]
[[Category:Templates Vigyan Ready|Suffix Tree]]
[[Category:Templates that add a tracking category|Suffix Tree]]
[[Category:Templates that generate short descriptions|Suffix Tree]]
[[Category:Templates using TemplateData|Suffix Tree]]
[[Category:कंप्यूटर विज्ञान प्रत्यय|Suffix Tree]]
[[Category:पेड़ (डेटा संरचनाएं)|Suffix Tree]]
[[Category:सबस्ट्रिंग सूचकांक|Suffix Tree]]
[[Category:स्ट्रिंग डेटा संरचनाएँ|Suffix Tree]]

Latest revision as of 14:05, 28 July 2023

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

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

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

इतिहास

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

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

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

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

परिभाषा

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

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

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

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

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

कार्यात्मकता (फंक्शनलिटी)

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

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

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

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

में सफिक्स और के बीच दीर्घतम सामान्य प्रीफिक्स खोजें।[17]

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

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

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

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

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

अनुप्रयोग

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

  • स्ट्रिंग सर्च, O(m) जटिलता में, जहां m सबस्ट्रिंग की लंबाई है (लेकिन स्ट्रिंग के लिए सफिक्स ट्री बनाने के लिए प्रारंभिक O(n) समय की आवश्यकता होती है)
  • सबसे लंबे समय तक दोहराई जाने वाली सबस्ट्रिंग प्राप्त करना
  • सबसे लंबी उभयनिष्ठ सबस्ट्रिंग प्राप्त करना
  • किसी स्ट्रिंग में दीर्घतम पैलिन्ड्रोम प्राप्त करना

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

कार्यान्वयन

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

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

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

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

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

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

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

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

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

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

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

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

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

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

संदर्भ

बाहरी संबंध