सफिक्स ट्री: Difference between revisions
(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–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}} द्वारा पेश की गई थी। सूफ़िक्स <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 के परिणामों को सरल और और सुंदर रूप में पुनर्जीवित किया, पद पेड़ के शब्द का परिचय कराया। | |||
{{harvtxt|McCreight|1976}} सभी प्रत्ययों | {{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> है। | ||
ये एल्गोरिदम | |||
{{harvtxt|Farach|1997}} ने पहला प्रत्यय वृक्ष निर्माण | {{harvtxt|Farach|1997}} ने पहला प्रत्यय वृक्ष निर्माण एल्गोरिथ्म दिया जो सभी अक्षरों के लिए इष्टतम है। विशेष रूप से, बहुपद श्रेणी में पूर्णांकों की वर्णमाला से खींची गई स्ट्रिंग के लिए यह पहला रैखिक-समय एल्गोरिदम है। फ़राच का एल्गोरिदम प्रत्यय वृक्षों और प्रत्यय सरणियों दोनों के निर्माण के लिए नए एल्गोरिदम का आधार बन गया है, उदाहरण के लिए, बाहरी मेमोरी, संपीड़ित, संक्षिप्त, आदि में। | ||
बहुपद श्रेणी में पूर्णांकों की वर्णमाला से खींची गई स्ट्रिंग के | |||
==परिभाषा== | ==परिभाषा== | ||
लंबाई <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>S[i..n]</math> तक के पथ पर पाए जाने वाले सभी स्ट्रिंग-लेबलों को संयोजित करके प्राप्त स्ट्रिंग, प्रत्यय <math>i</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 ऐसे नोड्स हो सकते हैं, और कुल में 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>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>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>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>\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)</math> बार में लेम्पेल-ज़िव अपघटन का पता लगाएं।<ref>{{harvtxt|Gusfield|1999}}, p.166.</ref> | ||
** | ** <math>\Theta(n)</math> बार में सबसे लंबे समय तक दोहराया जाने वाला सबस्ट्रिंग खोजें। | ||
** | ** <math>\Theta(n)</math> बार में न्यूनतम लंबाई की सबसे अधिक बार आने वाली सबस्ट्रिंग खोजें। | ||
** | ** <math>\Sigma</math> में से सबसे छोटी स्ट्रिंग खोजें जो <math>D</math> में नहीं आती हैं, <math>O(n + z)</math> समय में, यदि ऐसी <math>z</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> समय में <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">{{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> | |||
==कार्यान्वयन== | ==कार्यान्वयन== | ||
यदि प्रत्येक नोड और किनारे को | यदि प्रत्येक नोड और किनारे को <math>\Theta(1)</math> स्पेस में दर्शाया जा सकता है, तो पूरे पेड़ को <math>\Theta(n)</math> स्पेस में दर्शाया जा सकता है। पेड़ के सभी किनारों पर सभी स्ट्रिंग्स की कुल लंबाई <math>O(n^2)</math> है, लेकिन प्रत्येक किनारे को {{mvar|S}} के एक सबस्ट्रिंग की स्थिति और लंबाई के रूप में संग्रहीत किया जा सकता है, जिससे कुल <math>\Theta(n)</math> कंप्यूटर शब्दों का स्थान उपयोग होता है। प्रत्यय पेड़ का सबसे खराब स्थिति वाला स्थान उपयोग एक [[फाइबोनैचि शब्द]] के साथ देखा जाता है, जो पूरे <math>2n</math> नोड्स देता है। | ||
प्रत्यय वृक्ष कार्यान्वयन करते समय एक महत्वपूर्ण विकल्प नोड्स के बीच | प्रत्यय वृक्ष कार्यान्वयन करते समय एक महत्वपूर्ण विकल्प नोड्स के बीच अभिभावक-बच्चे का संबंध है। सबसे आम लिंक्ड सूचियों का उपयोग है जिन्हें सिबलिंग सूचियाँ कहा जाता है। प्रत्येक नोड में उसके पहले बच्चे के लिए एक संकेतक होता है, और बच्चे की सूची में अगले नोड के लिए यह एक हिस्सा होता है। कुशल रनिंग टाइम गुणों वाले अन्य कार्यान्वयन [[हैश मैप|हैश मैप्स]], सॉर्ट किए गए या अनसॉर्टेड [[सरणी डेटा संरचना|एरेज़]] ([[गतिशील सरणी|एरे दोहरीकरण]] के साथ), या [[ स्व-संतुलन द्विआधारी खोज वृक्ष |संतुलित खोज पेड़ों]] का उपयोग करते हैं। हमें इसमें रुचि है: | ||
* किसी दिए गए चरित्र पर बच्चे को | |||
* किसी दिए गए चरित्र पर बच्चे को ढूंढने की लागत. | |||
* एक बच्चे को सम्मिलित करने की लागत. | * एक बच्चे को सम्मिलित करने की लागत. | ||
* | * किसी नोड के सभी बच्चों को सूचीबद्ध करने की लागत (नीचे तालिका में बच्चों की संख्या से विभाजित)। | ||
मान लीजिए कि {{mvar|σ}} वर्णमाला का आकार है। तो आपके पास निम्नलिखित लागतें होंगी: | |||
:<math> | :<math> | ||
\begin{array}{r|lll} | \begin{array}{r|lll} | ||
Line 125: | Line 124: | ||
\end{array} | \end{array} | ||
</math> | </math> | ||
सम्मिलन लागत का परिशोधन किया गया है, और हैशिंग की लागत सही हैशिंग के लिए दी गई है। | |||
प्रत्येक किनारे और नोड में बड़ी मात्रा में जानकारी प्रत्यय वृक्ष को बहुत महंगा बनाती है, अच्छे कार्यान्वयन में स्रोत पाठ की मेमोरी आकार का लगभग 10 से 20 गुना | प्रत्येक किनारे और नोड में बड़ी मात्रा में जानकारी प्रत्यय वृक्ष को बहुत महंगा बनाती है, जो अच्छे कार्यान्वयन में स्रोत पाठ की मेमोरी आकार का लगभग 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}} हाल ही में, <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> | |||
टीडीडी और ट्रेलिस पूरे मानव जीनोम तक फैलते हैं, जिसके परिणामस्वरूप दसियों गीगाबाइट आकार का एक डिस्क-आधारित प्रत्यय वृक्ष बनता है।<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}} | ||
पेड़ मुख्य मेमोरी में | |||
लेकिन इनपुट | |||
सबसे नवीनतम विधि, | |||
==यह भी देखें== | ==यह भी देखें== |
Revision as of 21:41, 15 July 2023
कंप्यूटर विज्ञान में, एक प्रत्यय वृक्ष (जिसे पीएटी वृक्ष या, पहले के रूप में, स्थिति वृक्ष भी कहा जाता है) एक संपीड़ित त्रि है जिसमें दिए गए पाठ के सभी प्रत्ययों को उनकी कुंजी के रूप में और पाठ में उनके मूल्यों के रूप में स्थान दिया जाता है। प्रत्यय पेड़ कई महत्वपूर्ण स्ट्रिंग ऑपरेशनों के विशेष रूप से तेज़ कार्यान्वयन की अनुमति देते हैं।
इस प्रकार के एक पेड़ का निर्माण स्ट्रिंग के लिए की लंबाई में समय और स्थान लीनियर लेता है। एक बार निर्मित होने के बाद, कई ऑपरेशन तेजी से किए जा सकते हैं, उदाहरण के लिए में एक सबस्ट्रिंग का पता लगाना, यदि कुछ गलतियाँ स्वीकार की जाती हैं तो एक सबस्ट्रिंग का पता लगाना, एक नियमित अभिव्यक्ति पैटर्न के लिए मिलान करना इत्यादि। सफेक्स ट्रीज़ ने सबसे लंबी सामान्य सबस्ट्रिंग समस्या के लिए पहले से ही लीनियर समय के समाधानों में से एक प्रदान किया।[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]
यह भी देखें
टिप्पणियाँ
- ↑ 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.
- ↑ 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).
- ↑ This term is used here to distinguish Weiner's precursor data structures from proper suffix trees as defined above and unconsidered before McCreight (1976).
- ↑ i.e., with each branch labelled by a single character
- ↑ See File:WeinerB aaaabbbbaaaabbbb.gif and File:WeinerC aaaabbbbaaaabbbb.gif for an uncompressed example tree and its compressed correspondant.
- ↑ Giegerich & Kurtz (1997).
- ↑ http://www.cs.uoi.gr/~kblekas/courses/bioinformatics/Suffix_Trees1.pdf[permanent dead link]
- ↑ Farach (1997).
- ↑ Gusfield (1999) , p.92.
- ↑ Gusfield (1999) , p.123.
- ↑ Baeza-Yates & Gonnet (1996).
- ↑ Gusfield (1999) , p.132.
- ↑ Gusfield (1999) , p.125.
- ↑ Gusfield (1999) , p.144.
- ↑ Gusfield (1999) , p.166.
- ↑ Gusfield (1999) , Chapter 8.
- ↑ Gusfield (1999) , p.196.
- ↑ Gusfield (1999) , p.200.
- ↑ Gusfield (1999) , p.198.
- ↑ Gusfield (1999) , p.201.
- ↑ Gusfield (1999) , p.204.
- ↑ Gusfield (1999) , p.205.
- ↑ Gusfield (1999) , pp.197–199.
- ↑ 24.0 24.1 Allison, L. "प्रत्यय वृक्ष". Archived from the original on 2008-10-13. Retrieved 2008-10-14.
- ↑ First introduced by Zamir & Etzioni (1998).
- ↑ Apostolico et al. (1988).
- ↑ Hariharan (1994).
- ↑ Sahinalp & Vishkin (1994).
- ↑ Farach & Muthukrishnan (1996).
- ↑ Iliopoulos & Rytter (2004).
- ↑ Shun & Blelloch (2014).
- ↑ Smyth (2003).
- ↑ 33.0 33.1 Tata, Hankins & Patel (2003).
- ↑ 34.0 34.1 Phoophakdee & Zaki (2007).
- ↑ 35.0 35.1 35.2 Barsky et al. (2008).
- ↑ 36.0 36.1 Barsky et al. (2009).
- ↑ Mansour et al. (2011).
संदर्भ
- Aho, Alfred V.; Hopcroft, John E.; Ullman, Jeffrey D. (1974), The Design and Analysis of Computer Algorithms, Reading/MA: Addison-Wesley, ISBN 0-201-00029-6.
- Apostolico, A.; Iliopoulos, C.; Landau, G. M.; Schieber, B.; Vishkin, U. (1988), "Parallel construction of a suffix tree with applications", Algorithmica, 3 (1–4): 347–365, doi:10.1007/bf01762122, S2CID 5024136.
- Baeza-Yates, Ricardo A.; Gonnet, Gaston H. (1996), "Fast text searching for regular expressions or automaton searching on tries", Journal of the ACM, 43 (6): 915–936, doi:10.1145/235809.235810, S2CID 1420298.
- Barsky, Marina; Stege, Ulrike; Thomo, Alex; Upton, Chris (2008), "A new method for indexing genomes using on-disk suffix trees", CIKM '08: Proceedings of the 17th ACM Conference on Information and Knowledge Management (PDF), New York, NY, USA: ACM, pp. 649–658.
- Barsky, Marina; Stege, Ulrike; Thomo, Alex; Upton, Chris (2009), "Suffix trees for very large genomic sequences", CIKM '09: Proceedings of the 18th ACM Conference on Information and Knowledge Management (PDF), New York, NY, USA: ACM.
- Farach, Martin (1997), "Optimal Suffix Tree Construction with Large Alphabets" (PDF), 38th IEEE Symposium on Foundations of Computer Science (FOCS '97), pp. 137–143.
- Farach, Martin; Muthukrishnan, S. (1996), "Optimal Logarithmic Time Randomized Suffix Tree Construction", International Colloquium on Automata Languages and Programming (PDF).
- Farach-Colton, Martin; Ferragina, Paolo; Muthukrishnan, S. (2000), "On the sorting-complexity of suffix tree construction.", Journal of the ACM, 47 (6): 987–1011, doi:10.1145/355541.355547, S2CID 8164822.
- Giegerich, R.; Kurtz, S. (1997), "From Ukkonen to McCreight and Weiner: A Unifying View of Linear-Time Suffix Tree Construction" (PDF), Algorithmica, 19 (3): 331–353, doi:10.1007/PL00009177, S2CID 18039097, archived from the original (PDF) on 2016-03-03, retrieved 2012-07-13.
- Gusfield, Dan (1997), Algorithms on Strings, Trees and Sequences: Computer Science and Computational Biology, Cambridge University Press, ISBN 0-521-58519-8.
- Hariharan, Ramesh (1994), "Optimal Parallel Suffix Tree Construction", ACM Symposium on Theory of Computing (PDF).
- Iliopoulos, Costas; Rytter, Wojciech (2004), "On Parallel Transformations of Suffix Arrays into Suffix Trees", 15th Australasian Workshop on Combinatorial Algorithms, CiteSeerX 10.1.1.62.6715.
- Mansour, Essam; Allam, Amin; Skiadopoulos, Spiros; Kalnis, Panos (2011), "ERA: Efficient Serial and Parallel Suffix Tree Construction for Very Long Strings" (PDF), Proceedings of the VLDB Endowment, 5 (1): 49–60, arXiv:1109.6884, Bibcode:2011arXiv1109.6884M, doi:10.14778/2047485.2047490, S2CID 7582116.
- McCreight, Edward M. (1976), "A Space-Economical Suffix Tree Construction Algorithm", Journal of the ACM, 23 (2): 262–272, CiteSeerX 10.1.1.130.8022, doi:10.1145/321941.321946, S2CID 9250303.
- Phoophakdee, Benjarath; Zaki, Mohammed J. (2007), "Genome-scale disk-based suffix tree indexing", SIGMOD '07: Proceedings of the ACM SIGMOD International Conference on Management of Data, New York, NY, USA: ACM, pp. 833–844, CiteSeerX 10.1.1.81.6031.
- Sahinalp, Cenk; Vishkin, Uzi (1994), "Symmetry breaking for suffix tree construction", ACM Symposium on Theory of Computing, doi:10.1145/195058.195164, S2CID 5985171
- Smyth, William (2003), Computing Patterns in Strings, Addison-Wesley.
- Shun, Julian; Blelloch, Guy E. (2014), "A Simple Parallel Cartesian Tree Algorithm and its Application to Parallel Suffix Tree Construction", ACM Transactions on Parallel Computing, 1: 1–20, doi:10.1145/2661653, S2CID 1912378.
- Tata, Sandeep; Hankins, Richard A.; Patel, Jignesh M. (2003), "Practical Suffix Tree Construction", VLDB '03: Proceedings of the 30th International Conference on Very Large Data Bases (PDF), Morgan Kaufmann, pp. 36–47.
- Ukkonen, E. (1995), "On-line construction of suffix trees" (PDF), Algorithmica, 14 (3): 249–260, doi:10.1007/BF01206331, S2CID 6027556.
- Weiner, P. (1973), "Linear pattern matching algorithms" (PDF), 14th Annual IEEE Symposium on Switching and Automata Theory, pp. 1–11, doi:10.1109/SWAT.1973.13.
- Zamir, Oren; Etzioni, Oren (1998), "Web document clustering: a feasibility demonstration", SIGIR '98: Proceedings of the 21st annual international ACM SIGIR conference on Research and development in information retrieval, New York, NY, USA: ACM, pp. 46–54, CiteSeerX 10.1.1.36.4719.
बाहरी संबंध
- Suffix Trees by Sartaj Sahni
- NIST's Dictionary of Algorithms and Data Structures: Suffix Tree
- Universal Data Compression Based on the Burrows-Wheeler Transformation: Theory and Practice, application of suffix trees in the BWT
- Theory and Practice of Succinct Data Structures, C++ implementation of a compressed suffix tree
- Ukkonen's Suffix Tree Implementation in C Part 1 Part 2 Part 3 Part 4 Part 5 Part 6
- Online Demo: Ukkonen's Suffix Tree Visualization