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

From Vigyanwiki
No edit summary
(Work done)
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|वेनर|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 का एल्गोरिदम" के रूप में वर्णनित किया।{{cn|reason=Weiner gave several algorithms; Knuth probably referred to Algorithm C.|date=February 2020}} पाठग्रंथ {{harvtxt|एएचओ|होपक्रॉफ्ट|उल्मन|1974|loc=Sect.9.5}} ने वेनर के परिणामों को सरल और और सुंदर रूप में पुनर्जीवित किया, ''पोजीशन ट्री'' के शब्द का परिचय कराया।
यह अवधारणा पहली बार {{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 का एल्गोरिदम" के रूप में वर्णनित किया।{{cn|reason=Weiner gave several algorithms; Knuth probably referred to Algorithm C.|date=February 2020}} पाठग्रंथ {{harvtxt|एएचओ|होपक्रॉफ्ट|उल्मन|1974|loc=Sect.9.5}} ने वेनर के परिणामों को सरल और और सुंदर रूप में पुनर्जीवित किया, ''पोजीशन ट्री'' के शब्द का परिचय कराया।


{{harvtxt|मैकक्रेइट|1976}} <math>S</math> के सभी सफिक्स की एक (संपीड़ित (कंप्रेस्ड)) ट्राई बनाने वाले पहले व्यक्ति थे। हालाँकि <math>i</math> से शुरू होने वाला सफिक्स सामान्यतः प्रीफिक्स आइडेंटिफायर से अधिक लंबा होता है, संपीड़ित ट्राई में उनका पथ प्रतिनिधित्व साइज़ में भिन्न नहीं होता है। दूसरी ओर, मैकक्रेइट वेनर की अधिकांश सहायक डेटा संरचनाओं से दूर रह सकता है; केवल सफिक्स लिंक बचे हैं।
{{harvtxt|मैकक्रेइट|1976}} <math>S</math> के सभी सफिक्स की एक (संपीड़ित (कंप्रेस्ड)) ट्राई बनाने वाले पहले व्यक्ति थे। हालाँकि <math>i</math> से शुरू होने वाला सफिक्स सामान्यतः प्रीफिक्स आइडेंटिफायर से अधिक लंबा होता है, संपीड़ित ट्राई में उनका पथ प्रतिनिधित्व साइज़ में भिन्न नहीं होता है। दूसरी ओर, मैकक्रेइट वेनर की अधिकांश सहायक डेटा संरचनाओं से दूर रह सकता है; केवल सफिक्स लिंक बचे हैं।
Line 34: Line 34:
मान लें कि लंबाई <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>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</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>m</math> के पैटर्न <math>P_1,\dots,P_q</math> की <math>O(m)</math> बार में सबस्ट्रिंग के रूप में पहली घटना ज्ञात कीजिए।
**'''(Work done)'''
** <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>
** <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>\Theta(m)</math> समय में <math>P[i\dots m]</math> के प्रीफिक्स और <math>D</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>\Theta(n_i + n_j)</math> बार में स्ट्रिंग <math>S_i</math> और <math>S_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>\Theta(n)</math> समय में <math>D</math> में से <math>S_i</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>\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>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>O(k n + z)</math> बार में अधिकतम k बेमेल के साथ m लंबाई का एक पैटर्न P खोजें, जहां z हिट की संख्या है।<ref>{{harvtxt|Gusfield|1999}}, p.200.</ref>
Line 60: Line 59:
यदि लंबाई <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>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>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>


<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" />
सफिक्स ट्री का उपयोग टेक्स्ट-संपादन, फ्री-टेक्स्ट सर्च, [[कम्प्यूटेशनल बायोलॉजी|कम्प्यूटेशनल जीवविज्ञान]] और अन्य अनुप्रयोग क्षेत्रों में होने वाली कई स्ट्रिंग समस्याओं को हल करने के लिए किया जा सकता है।<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" />


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


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


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


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


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


मान लीजिए कि {{mvar|&sigma;}} वर्णमाला का साइज़ है। तो आपके पास निम्नलिखित लागतें होंगी:
मान लीजिए कि {{mvar|&sigma;}} वर्णमाला का साइज़ है। तो आपके पास निम्नलिखित लागतें होंगी:
Line 127: Line 124:
सम्मिलन लागत का परिशोधन किया गया है, और हैशिंग की लागत सही हैशिंग के लिए दी गई है।
सम्मिलन लागत का परिशोधन किया गया है, और हैशिंग की लागत सही हैशिंग के लिए दी गई है।


प्रत्येक किनारे और नोड में बड़ी मात्रा में जानकारी सफिक्स ट्री को बहुत महंगा बनाती है, जो अच्छे कार्यान्वयन में स्रोत पाठ की मेमोरी साइज़ का लगभग 10 से 20 गुना अधिक खपत करती है। सफिक्स ऐरे इस आवश्यकता को 8 का कारक तक कम करता है (32-बिट एड्रेस स्पेस और 8-बिट वर्णों के साथ निर्मित [[एलसीपी सरणी|एलसीपी]] मानों को शामिल करने वाले ऐरे के लिए।) यह कारक गुणवत्ताओं पर निर्भर करता है और 32-बिट सिस्टमों पर 4-बाइट चौड़े वर्णों का उपयोग करने के साथ 2 तक पहुंच सकता है (कुछ UNIX-जैसे सिस्टम में किसी भी प्रतीक को समाहित करने के लिए आवश्यक होते हैं, wchar_t देखें)। शोधकर्ताओं ने छोटे इंडेक्स संरचनाओं की खोज जारी रखी है।
प्रत्येक किनारे और नोड में बड़ी मात्रा में जानकारी सफिक्स ट्री को बहुत महंगा बनाती है, जो अच्छे कार्यान्वयन में स्रोत पाठ की मेमोरी साइज़ का लगभग 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}} हाल ही में, <math>O(n)</math> कार्य (अनुक्रमिक समय) और <math>O(\log^2 n)</math> स्पैन के साथ सफिक्स ट्री निर्माण के लिए एक व्यावहारिक समानांतर एल्गोरिदम विकसित किया गया है। एल्गोरिथ्म साझा-मेमोरी मल्टीकोर मशीनों पर अच्छी समानांतर स्केलेबिलिटी प्राप्त करता है और 40-कोर मशीन का उपयोग करके 3 मिनट से कम समय में [[मानव जीनोम]] - लगभग 3 [[गीगाबाइट|जीबी]] - को अनुक्रमित कर सकता है।{{sfnp|Shun|Blelloch|2014}}
सफिक्स ट्री निर्माण में तेजी लाने के लिए विभिन्न समानांतर एल्गोरिदम प्रस्तावित किए गए हैं।{{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}}


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


बाहरी मेमोरी में सफिक्स ट्री के निर्माण के सैद्धांतिक परिणाम हैं। {{harvtxt|Farach-Colton|Ferragina|Muthukrishnan|2000}} द्वारा एल्गोरिदम सैद्धांतिक रूप से इष्टतम है, जिसमें सॉर्टिंग के बराबर I/O जटिलता है। हालाँकि, इस एल्गोरिथम की समग्र जटिलता ने अब तक इसके व्यावहारिक कार्यान्वयन को रोका है।{{sfnp|Smyth|2003}}
बाहरी मेमोरी में सफिक्स ट्री के निर्माण के सैद्धांतिक परिणाम हैं। {{harvtxt|फ़राच-कोल्टन|फ़रागिना|मुथुकृष्णन|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>
दूसरी ओर, डिस्क-आधारित सफिक्स ट्री के निर्माण के लिए व्यावहारिक कार्य किए गए हैं जो (कुछ) GB/hours के पैमाने पर हैं। अत्याधुनिक विधियाँ हैं TDD,<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" /><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" />


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


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

Revision as of 09:26, 17 July 2023

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

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

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

इतिहास

यह अवधारणा पहली बार वेनर (1973) द्वारा प्रस्तुत की गई थी। सफिक्स के बजाय, वेनर ने अपने ट्राई[3] में प्रत्येक स्थान के लिए प्रीफिक्स आइडेंटिफायर संग्रहित की, अर्थात्, से प्रारंभ होने और में केवल एक बार होने वाली सबसे छोटी स्ट्रिंग होती है। उनका एल्गोरिदम डी के लिए असम्पीडित (अनकप्रेस्सेड) ट्राई को लेता है[4] और इसे के लिए एक ट्राई में बढ़ाता है। इस विधि से, ट्राईवियल ट्राई से के लिए ट्राई को के लिए एल्गोरिदम डी को लगातार कॉल करके बनाया जा सकता है; हालांकि, कुल मान्य समय होता है। वेनर का एल्गोरिदम बी कई सहायक डेटा संरचनाओं को बनाए रखने के लिए उपयोग करता है, जिससे निर्मित ट्राई के साइज़ में संगठन का चलन औसत करार दिया जा सकता है। यह अंतिम रूप से नोड हो सकता है, जैसे के लिए। वेनर का एल्गोरिदम सी अंततः संपीडित ट्राई का उपयोग करता है, जिससे साइज़ और संचालन का चलन लीनियर समग्र संचय साइज़ और समय होता है।[5] डोनाल्ड नुथ ने इसे बाद में "वर्ष 1973 का एल्गोरिदम" के रूप में वर्णनित किया।[citation needed] पाठग्रंथ एएचओ, होपक्रॉफ्ट & उल्मन (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 के पैमाने पर हैं। अत्याधुनिक विधियाँ हैं TDD,[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).


संदर्भ


बाहरी संबंध