सफिक्स ट्री: Difference between revisions
No edit summary |
No edit summary |
||
(6 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| | [[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}}.}} ये गति वृद्धि का लाभ है: एक स्ट्रिंग के सफिक्स ट्री को संग्रहीत करने के लिए सामान्यतः स्ट्रिंग की तुलना में बहुत अधिक स्थान की आवश्यकता होती है। | इस प्रकार के एक ट्री का निर्माण <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|वेनर|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|वेनर|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}} ने वेनर के परिणामों को सरल और और सुंदर रूप में पुनर्जीवित किया, ''पोजीशन ट्री'' के शब्द का परिचय कराया। | ||
{{harvtxt|मैकक्रेइट|1976}} <math>S</math> के सभी सफिक्स की एक (संपीड़ित (कंप्रेस्ड)) ट्राई बनाने वाले पहले व्यक्ति थे। हालाँकि <math>i</math> से शुरू होने वाला सफिक्स सामान्यतः प्रीफिक्स आइडेंटिफायर से अधिक लंबा होता है, संपीड़ित ट्राई में उनका पथ प्रतिनिधित्व साइज़ में भिन्न नहीं होता है। दूसरी ओर, मैकक्रेइट वेनर की अधिकांश सहायक डेटा संरचनाओं से दूर रह सकता है; केवल सफिक्स लिंक बचे हैं। | {{harvtxt|मैकक्रेइट|1976}} <math>S</math> के सभी सफिक्स की एक (संपीड़ित (कंप्रेस्ड)) ट्राई बनाने वाले पहले व्यक्ति थे। हालाँकि <math>i</math> से शुरू होने वाला सफिक्स सामान्यतः प्रीफिक्स आइडेंटिफायर से अधिक लंबा होता है, संपीड़ित ट्राई में उनका पथ प्रतिनिधित्व साइज़ में भिन्न नहीं होता है। दूसरी ओर, मैकक्रेइट वेनर की अधिकांश सहायक डेटा संरचनाओं से दूर रह सकता है; केवल सफिक्स लिंक बचे हैं। | ||
Line 28: | Line 28: | ||
[[सामान्यीकृत प्रत्यय वृक्ष|सामान्यीकृत सफिक्स ट्री]] एक सफिक्स ट्री होता है जो एकल स्ट्रिंग के बजाय स्ट्रिंग के एक सेट के लिए बनाया गया है। यह तारों के इस सेट से सभी सफिक्स का प्रतिनिधित्व करता है। प्रत्येक स्ट्रिंग को एक अलग समाप्ति चिह्न द्वारा समाप्त किया जाना चाहिए। | [[सामान्यीकृत प्रत्यय वृक्ष|सामान्यीकृत सफिक्स ट्री]] एक सफिक्स ट्री होता है जो एकल स्ट्रिंग के बजाय स्ट्रिंग के एक सेट के लिए बनाया गया है। यह तारों के इस सेट से सभी सफिक्स का प्रतिनिधित्व करता है। प्रत्येक स्ट्रिंग को एक अलग समाप्ति चिह्न द्वारा समाप्त किया जाना चाहिए। | ||
== | ==कार्यात्मकता (फंक्शनलिटी)== | ||
लंबाई <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>\Theta(n)</math> समय में बनाया जा सकता है, यदि अक्षर बहुपद श्रेणी में पूर्णांकों के वर्णमाला से आते हैं (विशेष रूप से, यह स्थिर साइज़ के अक्षरों के लिए सच है)।{{sfnp|Farach|1997}} बड़े वर्णमालाओं के लिए, चलन समय का मुख्य भाग पहले अक्षरों को [[छँटाई एल्गोरिथ्म|सॉर्ट]] करके उन्हें साइज़ <math>O(n)</math> के रेंज में लाने का होता है; सामान्यतः, इसके लिए <math>O(n\log n)</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> बार में सबस्ट्रिंग के रूप में पहली घटना ज्ञात कीजिए। | ||
** <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> में अपेक्षित [[सबलाइनियर टाइम एल्गोरिदम| | ** <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> की सबसे लंबी सामान्य | ** <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> समय में सभी अधिकतम जोड़े, अधिकतम | ** <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> के बीच | <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(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" /> | ||
* स्ट्रिंग | * स्ट्रिंग सर्च, ''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|σ}} वर्णमाला का साइज़ है। तो आपके पास निम्नलिखित लागतें होंगी: | मान लीजिए कि {{mvar|σ}} वर्णमाला का साइज़ है। तो आपके पास निम्नलिखित लागतें होंगी: | ||
Line 127: | Line 124: | ||
सम्मिलन लागत का परिशोधन किया गया है, और हैशिंग की लागत सही हैशिंग के लिए दी गई है। | सम्मिलन लागत का परिशोधन किया गया है, और हैशिंग की लागत सही हैशिंग के लिए दी गई है। | ||
प्रत्येक किनारे और नोड में बड़ी मात्रा में जानकारी सफिक्स ट्री को बहुत महंगा बनाती है, जो अच्छे कार्यान्वयन में स्रोत पाठ की मेमोरी साइज़ का लगभग 10 से 20 गुना अधिक खपत करती है। सफिक्स ऐरे इस आवश्यकता को 8 का कारक तक कम करता है (32-बिट एड्रेस स्पेस और 8-बिट वर्णों के साथ निर्मित [[एलसीपी सरणी|एलसीपी]] मानों को शामिल करने वाले ऐरे के लिए।) यह कारक गुणवत्ताओं पर निर्भर करता है और 32-बिट सिस्टमों पर 4-बाइट चौड़े वर्णों का उपयोग करने के साथ 2 तक पहुंच सकता है (कुछ | प्रत्येक किनारे और नोड में बड़ी मात्रा में जानकारी सफिक्स ट्री को बहुत महंगा बनाती है, जो अच्छे कार्यान्वयन में स्रोत पाठ की मेमोरी साइज़ का लगभग 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> स्पैन के साथ सफिक्स ट्री निर्माण के लिए एक व्यावहारिक समानांतर एल्गोरिदम विकसित किया गया है। एल्गोरिथ्म | सफिक्स ट्री निर्माण में तेजी लाने के लिए विभिन्न समानांतर एल्गोरिदम प्रस्तावित किए गए हैं।{{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| | बाहरी मेमोरी में सफिक्स ट्री के निर्माण के सैद्धांतिक परिणाम हैं। {{harvtxt|फ़राच-कोल्टन|फ़रागिना|मुथुकृष्णन|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> | ||
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}} | ||
==यह भी देखें== | ==यह भी देखें== | ||
Line 150: | Line 147: | ||
==टिप्पणियाँ== | ==टिप्पणियाँ== | ||
{{Reflist|colwidth=30em}} | {{Reflist|colwidth=30em}} | ||
==संदर्भ== | ==संदर्भ== | ||
*{{citation | *{{citation | ||
Line 378: | 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 387: | 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] | ||
{{DEFAULTSORT:Suffix Tree}} | |||
{{DEFAULTSORT:Suffix Tree}} | |||
[[Category: | [[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
कंप्यूटर विज्ञान में, एक सफिक्स ट्री (पीएटी ट्री या पहले के रूप में पोजीशन ट्री के रूप में भी जाना जाता है) दिए गए पाठ के सभी सफिक्स को उनकी कुंजी और पाठ में उनकी स्थानों को उनके मान के रूप में संग्रहीत करने वाला एक सकसिंक्ट ट्राई होता है। ससफिक्स ट्री कई महत्वपूर्ण स्ट्रिंग ऑपरेशनों के विशेष रूप से तेज़ कार्यान्वयन की अनुमति देते हैं।
इस प्रकार के एक ट्री का निर्माण स्ट्रिंग के लिए की लंबाई में समय और स्थान लीनियर होता है। एक बार निर्मित होने के बाद, कई ऑपरेशन तेजी से किए जा सकते हैं, उदाहरण के लिए में एक सबस्ट्रिंग के स्थान को ज्ञात करना, यदि एक निश्चित संख्या की गलतियों की अनुमति हो, एक नियमित व्यंजक (रेगुलर एक्सप्रेशन) पैटर्न के लिए मिलान करना इत्यादि। सफेक्स ट्रीज़ ने दीर्घतम सामान्य सबस्ट्रिंग समस्या के लिए पहले से ही लीनियर समय के समाधानों में से एक प्रदान किया।[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]
यह भी देखें
टिप्पणियाँ
- ↑ 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