Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सी++ में पैटर्न खोज के लिए अहो-कोरासिक एल्गोरिथम

इस समस्या में, हमें एक इनपुट स्ट्रिंग और एक ऐरे एरर [] दिया जाता है। हमारा काम स्ट्रिंग में सरणी के सभी शब्दों की सभी घटनाओं को खोजना है। इसके लिए, हम पैटर्न खोज के लिए अहो-कोरासिक एल्गोरिथम का उपयोग करेंगे।

प्रोग्रामिंग में स्ट्रिंग और पैटर्न खोज एक महत्वपूर्ण चीज है। और प्रोग्रामिंग में, बेहतर एल्गोरिदम जितना अधिक व्यावहारिक उपयोग हो सकता है। अहो-कोरासिक एल्गोरिथम एक बहुत महत्वपूर्ण और शक्तिशाली एल्गोरिथम है जो स्ट्रिंग खोज को आसान बनाता है . यह एक तरह का डिक्शनरी मैचिंग एल्गोरिथम है, जो सभी स्ट्रिंग्स को एक साथ मिलाता है। एल्गोरिथम ट्राई डेटा संरचना . का उपयोग करता है इसके कार्यान्वयन के लिए।

ट्राई डेटा संरचना

ट्री एक प्रकार का उपसर्ग ट्री या एक डिजिटल सर्च ट्री है, जहां प्रत्येक किनारे पर किसी न किसी अक्षर का लेबल लगा होता है (प्रत्येक आउटगोइंग किनारे पर अलग-अलग अक्षर होते हैं)

आइए अहो-कोरासिक को समझने के लिए एक उदाहरण लेते हैं एल्गोरिथम

इनपुट

string ="bheythisghisanexample"arr[] ={"हे", "यह", "is", "an", "example"}

आउटपुट

हे शब्द 2 से शुरू होता हैशब्द यह 5 से शुरू होता हैशब्द 11 से शुरू होता हैशब्द और 13 से शुरू होता हैशब्द का उदाहरण 15 से शुरू होता है

इस एल्गोरिथम की समय जटिलता O(N+L+Z) . है , जहां N=स्ट्रिंग/पाठ के इनपुट की लंबाई

L=कीवर्ड की लंबाई (सरणी में शब्द)

Z=मैचों की संख्या।

कार्यान्वयन

अहो-कोरासिक एल्गोरिथम इन आसान चरणों के साथ बनाया जा सकता है

  • कतार का उपयोग करके त्रिभुज का निर्माण करें ताकि हम कतार में प्रत्येक वर्ण को नोड 'trie' के रूप में पॉप कर सकें।

  • एक सरणी के रूप में विफलता लिंक (प्रत्यय लिंक) का निर्माण करें जो अगले और वर्तमान वर्ण को संग्रहीत कर सकता है

  • मिलान करने वाले शब्दों को संग्रहीत करने के लिए एक सरणी के रूप में आउटपुट लिंक बनाएं

  • सभी वर्णों की जांच करने के लिए एक ट्रैवर्स फ़ंक्शन (FindNextState) बनाएं।

विफलता लिंक (प्रत्यय लिंक) - जब हम स्ट्रिंग के एक हिस्से को हिट करते हैं जहां हम वर्णों को पढ़ना जारी नहीं रख सकते हैं, तो हम अधिक से अधिक संदर्भ को संरक्षित करने का प्रयास करने के लिए प्रत्यय लिंक का अनुसरण करके पीछे हट जाते हैं। संक्षेप में, यह उन सभी किनारों को संग्रहीत करता है जिनका अनुसरण तब किया जाता है जब किसी वर्तमान वर्ण का Trie में कोई किनारा नहीं होता है।

आउटपुट लिंक - यह हमेशा वर्तमान स्थिति में मौजूद सबसे लंबे शब्द से संबंधित नोड को इंगित करता है, हम सुनिश्चित करते हैं कि हम आउटपुट लिंक का उपयोग करके सभी पैटर्न को एक साथ श्रृंखलाबद्ध करते हैं।

उदाहरण

#शामिल करें;int FF[MaxStates];int GotoFunction[MaxStates][MaxChars];int BuildMatchingMachine(const vector &words, char LowChar ='a', char highChar ='z'){ memset(OccurenceOfWords, 0, sizeof OccurenceOfWords); मेमसेट (एफएफ, -1, आकार एफएफ); मेमसेट (गोटोफंक्शन, -1, गोटोफंक्शन का आकार); इंट स्टेट्स =1; for (int i =0; i  क्यू; के लिए (इंट सी =0; सी <=उच्चतम चार - निम्नतम चार; ++ सी) { अगर (गोटोफंक्शन [0] [सी]! =-1 &&गोटोफंक्शन [0] [सी]! =0) {एफएफ [गोटोफंक्शन [0] [सी]] =0; क्यू.पुश (गोटोफंक्शन [0] [सी]); } } जबकि (q.size ()){ int State =q.front (); क्यू.पॉप (); के लिए (इंट सी =0; सी <=उच्चतम चार - निम्नतम चार; ++ सी) {अगर (गोटोफंक्शन [राज्य] [सी]! =-1) {इंट विफलता =एफएफ [राज्य]; जबकि (गोटोफंक्शन [विफलता] [सी] ==-1) {विफलता =एफएफ [विफलता]; } विफलता =गोटोफंक्शन [विफलता] [सी]; एफएफ [गोटोफंक्शन [राज्य] [सी]] =विफलता; OccurenceOfWords[GotoFunction[state][c]] |=OccurenceOfWords[विफलता]; q.push (गोटोफंक्शन [राज्य] [सी]); } }} रिटर्न स्टेट्स;} इंट फाइंडनेक्स्टस्टेट (इंट करंटस्टेट, चार नेक्स्ट इनपुट, चार लोस्टचर ='ए') {इंट आंसर =करंटस्टेट; इंट सी =अगला इनपुट - निम्नतम चार; जबकि (गोटोफंक्शन [उत्तर] [सी] ==-1) {उत्तर =एफएफ [उत्तर]; } वापसी GotoFunction[answer][c];}vector FindWordCount(string str, vector कीवर्ड, char LowChar ='a', char highChar ='z') { BuildMatchingMachine(keywords, LowChar, उच्चतमChar); इंट करंटस्टेट =0; वेक्टर रेटवैल; के लिए (int i =0; i  कीवर्ड; कीवर्ड.पुश_बैक ("सभी"); कीवर्ड.पुश_बैक ("वह"); कीवर्ड.पुश_बैक ("है"); स्ट्रिंग str ="एलीशेल"; cout<<"स्ट्रिंग ' "< राज्य =FindWordCount (str, कीवर्ड); for(int i=0; i  

आउटपुट

स्ट्रिंग ' Allisheall ' में सभी शब्दों की घटनाएं हैंWord All 5 से शुरू होता है और 8Word पर समाप्त होता है, वह 4 से शुरू होता है और 7 पर समाप्त होता है। 
  1. C++ में डिस्कनेक्टेड ग्राफ़ के लिए BFS

    डिस्कनेक्ट किया गया ग्राफ़ एक ग्राफ़ है जिसमें एक या अधिक नोड ग्राफ़ के अंतिम बिंदु नहीं होते हैं अर्थात वे जुड़े नहीं होते हैं। डिस्कनेक्ट किया गया ग्राफ़… अब, साधारण बीएफएस केवल तभी लागू होता है जब ग्राफ जुड़ा होता है यानी ग्राफ के सभी कोने ग्राफ के एक नोड से पहुंच योग्य होते हैं। उपरोक्त डिस्

  1. C++ प्रोग्राम 2 हस्ताक्षरित संख्याओं के गुणन के लिए बूथ के गुणन एल्गोरिथम को लागू करने के लिए

    बूथ का एल्गोरिथ्म एक गुणन एल्गोरिथ्म है जो दो हस्ताक्षरित बाइनरी नंबरों को 2 के कॉम्प्लिमेंट नोटेशन में गुणा करता है। बूथ ने डेस्क कैलकुलेटर का इस्तेमाल किया जो जोड़ने की तुलना में शिफ्टिंग में तेज़ थे और उन्होंने अपनी गति बढ़ाने के लिए एल्गोरिदम बनाया। एल्गोरिदम Begin    Put multiplicand

  1. सी ++ प्रोग्राम एक विशिष्ट खोज अनुक्रम के लिए एक बाइनरी खोज एल्गोरिदम लागू करने के लिए

    इस कार्यक्रम में हमें एक सरणी में खोज अनुक्रम के अस्तित्व को खोजने के लिए द्विआधारी खोज को लागू करने की आवश्यकता है। द्विआधारी खोज की समय जटिलता O(log(n)) है। आवश्यक चरण और छद्म कोड Begin    BinarySearch() function has ‘arr’ the array of data and ‘n’ the number of v