स्ट्रिंग-सर्चिंग एल्गोरिदम

कंप्यूटर विज्ञान में, स्ट्रिंग-खोज एल्गोरिदम, जिसे कभी-कभी स्ट्रिंग-मिलान एल्गोरिदम भी कहा जाता है, स्ट्रिंग एल्गोरिदम का एक महत्वपूर्ण वर्ग है जो एक ऐसी जगह ढूंढने का प्रयास करता है जहां एक या कई स्ट्रिंग (कंप्यूटर विज्ञान) (जिसे पैटर्न भी कहा जाता है) एक बड़ी स्ट्रिंग के भीतर पाए जाते हैं या मूलपाठ।

स्ट्रिंग खोज का एक मूल उदाहरण तब होता है जब पैटर्न और खोजा गया पाठ वर्णमाला (कंप्यूटर विज्ञान) (परिमित सेट) के तत्वों की सरणी डेटा संरचना होती है। Σ एक मानव भाषा वर्णमाला हो सकती है, उदाहरण के लिए, अक्षर ए से लेकर जेड और अन्य अनुप्रयोग बाइनरी वर्णमाला (Σ = {0,1}) या डीएनए का उपयोग कर सकते हैं जैव सूचना विज्ञान में वर्णमाला'' (Σ = {ए,सी,जी,टी})।

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

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

कुछ किताबें चखने के लिए होती हैं, कुछ निगलने के लिए, और कुछ चबाने और पचाने के लिए होती हैं।

कोई व्यक्ति to की पहली घटना का अनुरोध कर सकता है, जो कि चौथा शब्द है; या सभी घटनाएँ, जिनमें से 3 हैं; या अंतिम, जो अंत से पाँचवाँ शब्द है।

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

एक अन्य सामान्य उदाहरण में सामान्यीकरण शामिल है। कई प्रयोजनों के लिए, होना जैसे वाक्यांश की खोज उन स्थानों पर भी सफल होनी चाहिए जहां to और be के बीच कुछ और हस्तक्षेप है:
 * एक से अधिक स्थान
 * अन्य व्हाइटस्पेस वर्ण जैसे टैब, नॉन-ब्रेकिंग स्पेस, लाइन-ब्रेक इत्यादि।
 * कम सामान्यतः, एक हाइफ़न या नरम हाइफ़न
 * संरचित पाठों में, मार्कअप भाषा या यहां तक ​​कि मनमाने ढंग से बड़ी लेकिन पैरेंटेटिकल चीजें जैसे फ़ुटनोट्स, सूची-संख्याएं या अन्य मार्कर, एम्बेडेड छवियां इत्यादि।

कई प्रतीक प्रणालियों में ऐसे वर्ण शामिल होते हैं जो पर्यायवाची होते हैं (कम से कम कुछ उद्देश्यों के लिए):
 * लैटिन-आधारित वर्णमाला लोअर-केस को अपर-केस से अलग करती है, लेकिन कई उद्देश्यों के लिए स्ट्रिंग खोज से इस अंतर को अनदेखा करने की उम्मीद की जाती है।
 * कई भाषाओं में मुद्रण संयुक्ताक्षर शामिल हैं, जहां एक मिश्रित वर्ण दो या दो से अधिक अन्य वर्णों के बराबर होता है।
 * कई लेखन प्रणालियों में उच्चारण या स्वर संकेत (बहुविकल्पी) जैसे विशेषक चिह्न शामिल होते हैं, जो उनके उपयोग में भिन्न हो सकते हैं, या मिलान में अलग-अलग महत्व के हो सकते हैं।
 * डीएनए अनुक्रमों में गैर-कोडिंग खंड शामिल हो सकते हैं जिन्हें कुछ उद्देश्यों के लिए अनदेखा किया जा सकता है, या बहुरूपताएं जो एन्कोडेड प्रोटीन में कोई बदलाव नहीं लाती हैं, जो कुछ अन्य उद्देश्यों के लिए वास्तविक अंतर के रूप में नहीं गिना जा सकता है।
 * कुछ भाषाओं में ऐसे नियम होते हैं जहां शब्दों के आरंभ, मध्य या अंत में एक अलग वर्ण या वर्ण के रूप का उपयोग किया जाना चाहिए।

अंततः, प्राकृतिक भाषा का प्रतिनिधित्व करने वाली स्ट्रिंग के लिए, भाषा के पहलू स्वयं शामिल हो जाते हैं। उदाहरण के लिए, कोई व्यक्ति वैकल्पिक वर्तनी, उपसर्ग या प्रत्यय आदि होने के बावजूद किसी शब्द की सभी घटनाओं को ढूंढना चाह सकता है।

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

रंग

जहां ? परंपरागत रूप से पूर्ववर्ती वर्ण (u) को वैकल्पिक बनाता है।

यह आलेख मुख्य रूप से सरल प्रकार की स्ट्रिंग खोज के लिए एल्गोरिदम पर चर्चा करता है।

जैव सूचना विज्ञान और जीनोमिक्स के क्षेत्र में पेश की गई एक समान समस्या अधिकतम सटीक मिलान (एमईएम) है। दो स्ट्रिंग्स को देखते हुए, एमईएम सामान्य सबस्ट्रिंग हैं जिन्हें बेमेल पैदा किए बिना बाएं या दाएं नहीं बढ़ाया जा सकता है।

अनुभवहीन स्ट्रिंग खोज
यह देखने का एक सरल और अप्रभावी तरीका है कि एक स्ट्रिंग दूसरे के अंदर कहां होती है, प्रत्येक सूचकांक को एक-एक करके जांचना। सबसे पहले, हम देखते हैं कि क्या भूसे के ढेर के पहले अक्षर से शुरू होने वाली सुई की कोई प्रति है; यदि नहीं, तो हम यह देखना चाहेंगे कि क्या भूसे के ढेर के दूसरे अक्षर से शुरू होने वाली सुई की कोई प्रतिलिपि है, इत्यादि। सामान्य मामले में, हमें यह देखने के लिए कि यह एक गलत स्थिति है, प्रत्येक गलत स्थिति के लिए केवल एक या दो वर्णों को देखना होगा, इसलिए औसत मामले में, यह बिग ओ अंकन  (एन + एम) चरण लेता है, जहां एन है घास के ढेर की लंबाई और मी सुई की लंबाई है; लेकिन सबसे खराब स्थिति में, आआआआआआआब जैसी स्ट्रिंग में आआआआब जैसी स्ट्रिंग की खोज करने पर बिग ओ नोटेशन(एनएम) की आवश्यकता होती है

परिमित-अवस्था-ऑटोमेटन-आधारित खोज
इस दृष्टिकोण में, एक नियतात्मक परिमित ऑटोमेटन (डीएफए) का निर्माण करके बैकट्रैकिंग से बचा जाता है जो संग्रहीत खोज स्ट्रिंग को पहचानता है। इन्हें बनाना महंगा है—ये आम तौर पर पावरसेट निर्माण का उपयोग करके बनाए जाते हैं—लेकिन इनका उपयोग बहुत जल्दी हो जाता है। उदाहरण के लिए, दाईं ओर दिखाया गया नियतात्मक परिमित ऑटोमेटन MOMMY शब्द को पहचानता है। मनमाने ढंग से नियमित अभिव्यक्तियों की खोज के लिए इस दृष्टिकोण को अक्सर अभ्यास में सामान्यीकृत किया जाता है।

स्टब्स
नुथ-मॉरिस-प्रैट एल्गोरिदम|नुथ-मॉरिस-प्रैट एक नियतात्मक परिमित ऑटोमेटन की गणना करता है जो प्रत्यय के रूप में खोज करने के लिए स्ट्रिंग के साथ इनपुट को पहचानता है, बॉयर-मूर स्ट्रिंग-खोज एल्गोरिदम|बॉयर-मूर सुई के अंत से खोज शुरू करता है, इसलिए यह आमतौर पर प्रत्येक चरण में पूरी सुई-लंबाई तक आगे कूद सकता है। बेज़ा-येट्स इस बात पर नज़र रखता है कि क्या पिछले j अक्षर खोज स्ट्रिंग का उपसर्ग थे, और इसलिए यह फ़ज़ी स्ट्रिंग खोज के लिए अनुकूल है। थकना बेज़ा-येट्स के दृष्टिकोण का एक अनुप्रयोग है।

सूचकांक विधियाँ
तेज़ खोज एल्गोरिदम टेक्स्ट को प्रीप्रोसेस करते हैं। एक सबस्ट्रिंग सूचकांक  बनाने के बाद, उदाहरण के लिए एक प्रत्यय वृक्ष या प्रत्यय सरणी, एक पैटर्न की घटनाओं को जल्दी से पाया जा सकता है। उदाहरण के तौर पर, एक प्रत्यय वृक्ष बनाया जा सकता है $$\Theta(n)$$ समय, और सब कुछ $$z$$ एक पैटर्न की घटनाएँ पाई जा सकती हैं $$O(m)$$ इस धारणा के तहत समय कि वर्णमाला का एक स्थिर आकार होता है और प्रत्यय वृक्ष के सभी आंतरिक नोड्स जानते हैं कि उनके नीचे कौन सी पत्तियाँ हैं। उत्तरार्द्ध को प्रत्यय वृक्ष की जड़ से गहराई-पहली खोज चलाकर पूरा किया जा सकता है।

अन्य प्रकार
कुछ खोज विधियाँ, उदाहरण के लिए ट्रिग्राम खोज, का उद्देश्य मिलान/गैर-मिलान के बजाय खोज स्ट्रिंग और पाठ के बीच निकटता स्कोर ढूंढना है। इन्हें कभी-कभी अनुमानित स्ट्रिंग मिलान कहा जाता है| अस्पष्ट खोजें.

कई पैटर्न द्वारा वर्गीकरण
विभिन्न कलन विधि को प्रत्येक उपयोग किए जाने वाले पैटर्न की संख्या के आधार पर वर्गीकृत किया जा सकता है।

एकल-पैटर्न एल्गोरिदम
निम्नलिखित संकलन में, m पैटर्न की लंबाई है, n खोजने योग्य पाठ की लंबाई है, और k = |Σ| वर्णमाला का आकार है.
 * 1.एसिम्प्टोटिक समय को बिग ओ नोटेशन|ओ, Ω, और Θ नोटेशन का उपयोग करके व्यक्त किया जाता है।
 * 2.ग्लिबैक में मेमम और सी स्ट्रिंग हैंडलिंग#फ़ंक्शन खोज फ़ंक्शन को कार्यान्वित करने के लिए उपयोग किया जाता है और माँसपेशियाँ सी मानक पुस्तकालय।
 * 3.अनुमानित स्ट्रिंग मिलान और (संभावित-अनंत) पैटर्न के सेट को नियमित भाषाओं के रूप में प्रदर्शित करने के लिए बढ़ाया जा सकता है।

बॉयर-मूर स्ट्रिंग-खोज एल्गोरिथ्म व्यावहारिक स्ट्रिंग-खोज साहित्य के लिए मानक बेंचमार्क रहा है।

पैटर्न के एक सीमित सेट का उपयोग करने वाले एल्गोरिदम
निम्नलिखित संकलन में, एम सबसे लंबे पैटर्न की लंबाई है, एम उनकी कुल लंबाई है, एन खोजे जाने योग्य पाठ की लंबाई है, ओ घटनाओं की संख्या है।

अनंत संख्या में पैटर्न का उपयोग करने वाले एल्गोरिदम
स्वाभाविक रूप से, इस मामले में पैटर्न को अंतिम रूप से गिना नहीं जा सकता है। इन्हें आमतौर पर नियमित व्याकरण या नियमित अभिव्यक्ति द्वारा दर्शाया जाता है।

प्रीप्रोसेसिंग प्रोग्राम के उपयोग द्वारा वर्गीकरण
अन्य वर्गीकरण दृष्टिकोण संभव हैं। सबसे आम में से एक मुख्य मानदंड के रूप में प्रीप्रोसेसिंग का उपयोग करता है।

मिलान रणनीतियों द्वारा वर्गीकरण
एक अन्य एल्गोरिदम को उनकी मिलान रणनीति के आधार पर वर्गीकृत करता है:
 * पहले उपसर्ग का मिलान करें (नुथ-मॉरिस-प्रैट, शिफ्ट-एंड, अहो-कोरासिक)
 * पहले प्रत्यय का मिलान करें (बॉयर-मूर और वेरिएंट, कमेंट्ज़-वाल्टर)
 * सबसे पहले सर्वोत्तम कारक का मिलान करें (बीएनडीएम, बीओएम, सेट-बीओएम)
 * अन्य रणनीति (भोले, राबिन-कार्प)

यह भी देखें

 * अनुक्रम संरेखण
 * ग्राफ़ मिलान
 * पैटर्न मिलान
 * संपीड़ित पैटर्न मिलान
 * वाइल्डकार्ड का मिलान
 * पूरा पाठ खोजें

संदर्भ

 * R. S. Boyer and J. S. Moore, A fast string searching algorithm, Carom. ACM 20, (10), 262–272(1977).
 * Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, Third Edition. MIT Press and McGraw-Hill, 2009. ISBN 0-262-03293-7. Chapter 32: String Matching, pp. 985–1013.

बाहरी संबंध

 * Huge list of pattern matching links Last updated: 12/27/2008 20:18:38
 * Large (maintained) list of string-matching algorithms
 * NIST list of string-matching algorithms
 * StringSearch – high-performance pattern matching algorithms in Java – Implementations of many String-Matching-Algorithms in Java (BNDM, Boyer-Moore-Horspool, Boyer-Moore-Horspool-Raita, Shift-Or)
 * StringsAndChars – Implementations of many String-Matching-Algorithms (for single and multiple patterns) in Java
 * Exact String Matching Algorithms — Animation in Java, Detailed description and C implementation of many algorithms.
 * (PDF) Improved Single and Multiple Approximate String Matching
 * Kalign2: high-performance multiple alignment of protein and nucleotide sequences allowing external features
 * NyoTengu – high-performance pattern matching algorithm in C – Implementations of Vector and Scalar String-Matching-Algorithms in C