किसी दिए गए स्ट्रिंग से, हम सभी संभव प्रत्यय प्राप्त कर सकते हैं। प्रत्ययों को शब्दावली क्रम में क्रमबद्ध करने के बाद, हम प्रत्यय सरणी प्राप्त कर सकते हैं। प्रत्यय सरणियों को प्रत्यय पेड़ों का उपयोग करके भी बनाया जा सकता है। प्रत्यय पेड़ों के डीएफएस ट्रैवर्सल का उपयोग करके, हम प्रत्यय सरणी प्राप्त कर सकते हैं। प्रत्यय सरणियाँ रैखिक समय में प्रत्यय खोजने में सहायक होती हैं। हम बाइनरी सर्च टाइप प्रक्रिया का उपयोग करके प्रत्यय सरणी का उपयोग करके सबस्ट्रिंग भी ढूंढ सकते हैं।
समय जटिलता O(m log n) है
इनपुट और आउटपुट
इनपुट:मुख्य स्ट्रिंग:"बनाना", पैटर्न:"नैन" आउटपुट:पैटर्न स्थिति पर मिला:2
एल्गोरिदम
fillSuffixArray (पाठ, प्रत्यय)
इनपुट: मुख्य स्ट्रिंग
आउटपुट: प्रत्ययों की सरणी
आरंभ n :=पाठ लंबाई प्रत्यय सरणी को सभी के रूप में परिभाषित करती है i के लिए आकार n का प्रत्यय :=0 से n-1, allSuffix[i].index :=i allSuffix[i].suff :=से टेक्स्ट का सबस्ट्रिंग करें ( i to end) suffArray.End में सभी प्रत्यय सरणी के सभी प्रत्यय सरणी स्टोर अनुक्रमणिका को सॉर्ट करें।प्रत्ययअरे खोज (पाठ, पैटर्न, प्रत्यय)
इनपुट: मुख्य स्ट्रिंग, पैटर्न और प्रत्यय सरणी
आउटपुट - वह स्थान जहाँ पैटर्न पाए जाते हैं
पेटलेन शुरू करें:=पैटर्न का आकार strLen:=टेक्स्ट का आकार बायां:=0 दाएं:=strLen -1 जबकि बाएं <=दाएं, मध्य करें:=बाएं + (दाएं-बाएं)/2 tempStr:=का सबस्ट्रिंग SuffArray [मध्य] से अंतिम परिणाम तक का पाठ:=पैटर्न लंबाई तक tempStr और पैटर्न की तुलना करें। यदि परिणाम =0 है, तो स्थान प्रिंट करें यदि रेस <0 है, तो दाएं:=मध्य -1 अन्य बाएं:=मध्य +1 किया गयाअंतउदाहरण
#include#include #include namespace std का उपयोग करके; स्ट्रिंग suff;}; int strCompare (स्ट्रिंग st1, स्ट्रिंग st2, int n) {int i =0; जबकि (एन--) { अगर (st1 [i]! =st2 [i]) रिटर्न st1 [i] - st2 [i]; मैं++; } रिटर्न 0;}बूल कंप (प्रत्यय प्रत्यय 1, प्रत्यय प्रत्यय 2) {// छांटने के लिए दो तारों की तुलना करें अगर (सफ 1.सफ <सफ 2.सफ) सही है; झूठी वापसी;} शून्य भरण प्रत्ययअरे (स्ट्रिंग मेनस्ट्रिंग, int suffArr []) { int n =mainString.size (); प्रत्यय सभी प्रत्यय [एन]; // सरणी सभी प्रत्ययों को रखने के लिए (int i =0; i आउटपुट
पैटर्न स्थिति में मिला:2