पाठ से, हम पेड़ की संरचना बनाने के लिए सभी प्रत्यय उत्पन्न कर सकते हैं। हम जानते हैं कि पाठ में प्रस्तुत प्रत्येक पैटर्न, पाठ में संभावित प्रत्ययों में से एक का उपसर्ग होना चाहिए। सभी प्रत्ययों के ट्री का निर्माण करके, हम रैखिक समय में कोई भी सबस्ट्रिंग पा सकते हैं। प्रत्येक प्रत्यय स्ट्रिंग टर्मिनेटिंग सिंबल के साथ समाप्त हो रहा है। प्रत्येक नोड से यदि कोई पथ है, तो वह आगे बढ़ता है, अन्यथा वापस लौटता है, वह पैटर्न नहीं मिलता है।
इस एल्गोरिथ्म के लिए, समय जटिलता O(m+k) है, जहां m स्ट्रिंग की लंबाई है और k पाठ में पैटर्न की आवृत्ति है।
इनपुट और आउटपुट
इनपुट:मुख्य स्ट्रिंग:"ABAAABCDBBABCDDEBCABC"। पैटर्न "एबीसी" आउटपुट:स्थिति पर पाया गया पैटर्न:स्थिति पर 4 पैटर्न मिला:स्थिति पर 10 पैटर्न मिला:18
एल्गोरिदम
इस एल्गोरिथम में, हम एक विशेष नोड का उपयोग करेंगे, जिसे ट्री नोड कहा जाता है। यह एक लिंक के रूप में सभी प्रत्ययों की अनुक्रमणिका और अन्य ट्री नोड्स पते को धारण करेगा।
ट्री बनाएं (रूट:ट्रीनोड, टेक्स्ट)
इनपुट: ट्राईनोड प्रकार का एक रूट नोड।
आउटपुट: मुख्य स्ट्रिंग का उपयोग करने वाला प्रत्यय ट्री
i के लिए शुरू करें:=0 टेक्स्ट की लंबाई तक, ith स्थिति से अंत तक प्रत्यय के रूप में सबस्ट्रिंग करें, और टायर में इंडेक्स i जोड़ें। किया समाप्त
findPat(पैटर्न, नोड)
इनपुट: पैटर्न खोजने और नोड करने के लिए, जिसका उपयोग इसके प्रत्यय उपट्री में जांचने के लिए किया जाता है
आउटपुट - इंडेक्स सूची जहां पैटर्न पाया गया था
शुरू करें यदि पैटर्न का आकार 0 है, तो नोड के प्रत्यय को वापस करें यदि node.suff[patten[0]] , फिर वापस node.suff[pattern[0]].findPat(1 से अंत ओ पैटर्न तक सबस्ट्रिंग) अन्य वापसी φअंत
सर्चपैट (पैटर्न)
इनपुट - वह पैटर्न जिसे खोजा जाएगा
आउटपुट - सूची जहां पाठ की अनुक्रमणिका, जहां पैटर्न पाया गया था
res को सूची के रूप में परिभाषित करना शुरू करें। res :=findPat(pattern) यदि res है, तो patLen:=i :=0 के लिए पैटर्न की लंबाई res सूची के अंत तक, उन सभी अनुक्रमणिकाओं को प्रिंट करें जहां पैटर्न पूर्ण पाया गया थाअंत
उदाहरण
#include#include #define MAXCHAR 256 नेमस्पेस एसटीडी का उपयोग कर; क्लास ट्राइनोड {// सभी प्रत्ययों को निजी रखने के लिए नोड:ट्राइनोड *सफ [मैक्सचर]; सूची
*suffIndex; सार्वजनिक:trieNode () {suffIndex =नई सूची ; के लिए (int i =0; i * searchPattern(string pat);};void trieNode::addSuffix(string suffix, int sIndex) {suffIndex->push_back(sIndex); // स्टोर इंडेक्स शुरू में अगर (प्रत्यय। आकार ()> 0) {चार cIndex =प्रत्यय [0]; अगर (suff [cIndex] ==NULL) // यदि इस चरित्र के लिए कोई उप वृक्ष मौजूद नहीं है [cIndex] =new trieNode (); // नया नोड बनाएँ प्रत्यय [cIndex] -> addSuffix (प्रत्यय.substr(1), sIndex+1); // अगले प्रत्यय के लिए }}सूची * trieNode::searchPattern(string pattern) { if (pattern.size() ==0) रिटर्न suffIndex; अगर (suff [पैटर्न [0]]! =NULL) वापसी (सफल [पैटर्न [0]]) -> searchPattern (pattern.substr (1)); // अगले नोड का अनुसरण करें अन्यथा NULL लौटाएं; // जब कूदने के लिए कोई नोड नहीं होता है} क्लास ट्राइसफिक्स {// सभी प्रत्ययों के लिए ट्राई नोड रूट; सार्वजनिक:trieSuffix(string mainString) {// प्रत्यय जोड़ें और trie for (int i =0; i *res =root.searchPattern(pattern); // जांचें कि क्या अनुक्रमणिका की सूची खाली है या नहीं अगर (res!=NULL) {सूची ::iterator it; int patLen =pattern.length (); के लिए (यह =res-> शुरू (); यह! =res-> अंत (); यह ++) {(* अनुक्रमणिका) ++; locArray[(*index)] =*it - patLen; } }}इंट मेन () {स्ट्रिंग मेनस्ट्रिंग ="एबीएएएबीसीडीबीबीएबीसीडीडीईबीसीएबीसी"; स्ट्रिंग पैटर्न ="एबीसी"; int locArray [mainString.size ()]; इंट इंडेक्स =-1; ट्राईसफिक्स ट्राई (मेनस्ट्रिंग); trie.searchPat (पैटर्न, locArray, और अनुक्रमणिका); for(int i =0; i <=index; i++) { cout <<"पैटर्न स्थिति पर पाया गया:" < आउटपुट
पैटर्न स्थिति में मिला:4Pattern स्थिति पर मिला:10Pattern स्थिति में मिला:18