दिलचस्प पोस्ट
पांडों में सेटिंगविथकॉपी चेतावनी से निपटने के लिए कैसे? Android 4.1 और 4.2 पर एक सेवा के रूप में एंड्रॉइड भाषण मान्यता "Git branch -r" चलते समय "मूल / सिर" क्यों दिखाया गया है? क्या एक लॉक ऑब्जेक्ट लॉक किया जाता है अगर इसमें कोई अपवाद होता है? सीपी-डायरेक्ट डॉट उत्पाद की गणना करने का सदिश तरीका, सिस्पी के साथ दो मैट्रिक्स होम स्क्रीन पर प्रोग्राम की जा रही है Django डेटाबेस क्वेरी: दिनांक सीमा से वस्तुओं को कैसे फ़िल्टर करें? सीएसएस छवि आकार, कैसे भरने के लिए, खिंचाव नहीं? लिनक्स आधारित सर्वर पर एएसपी। नेट चलाना जावा में अप्रयुक्त आयात को साफ़ करने के अलावा, अव्यवस्था को कम करने के अलावा? जावा में, एक वर्ग स्थिर अंदर enum प्रकार हैं? LINQ तरीकों की रन-टाइम जटिलता (बिग-ओ) पर क्या गारंटी है? रनटाइम पर वेब। कॉन्फिग ऐप सेटिंग्स को कैसे संशोधित करें? रेट्रोफ़िट में डायनामिक जेसन को कैसे नियंत्रित किया जाए? मैं किस प्रकार के बदलावों को दिखाता हूं?

स्ट्रिंग में सबस्ट्रिंग के लिए खोज करने के लिए फास्ट एल्गोरिथ्म

मुझे एक कुशल एल्गोरिथ्म (या लाइब्रेरी) चाहिए जो मैं स्ट्रिंग में सबस्ट्रिंग के लिए जावा में उपयोग कर सकता हूं।

मैं क्या करना चाहूंगा:

इनपुट स्ट्रिंग को देखते हुए – INSTR :

"BCDEFGH"

और उम्मीदवार स्ट्रिंग का एक सेट – CAND :

"एबी", "सीडीई", "एफजी", "एच", "आईजे"

INSTR के भीतर सबस्ट्रिंग के रूप में मेल खाने वाले किसी भी CAND स्ट्रिंग खोजें

इस उदाहरण में मैं "सीडीई", "एफजी", और "एच" (लेकिन "एबी" और "आईजे" नहीं) से मेल खाऊंगा

वहाँ कई हजार उम्मीदवार स्ट्रिंग (CAND में) हो सकता है, लेकिन इससे भी महत्वपूर्ण बात यह है कि मैं इस खोज को कई लाखों बार कर दूंगा ताकि मुझे इसकी आवश्यकता होनी चाहिए फास्ट

मैं चार सरणी के साथ काम करना चाहता हूँ साथ ही, मुझे वास्तु समाधान में नहीं आंका जा रहा है, जैसे खोज को बांटना – बस स्थानीय रूप से करने के लिए सबसे कुशल कार्य / एल्गोरिथम।

इसके अतिरिक्त, CAND और INSTR में सभी तार अपेक्षाकृत छोटा (<50 वर्ण) होंगे – अर्थात लक्ष्य स्ट्रिंग INSTR लंबे समय से उम्मीदवार स्ट्रिंग के संबंध में नहीं है।


अद्यतन मुझे उल्लेख किया जाना चाहिए, CAND तारों का सेट INSTR के सभी मूल्यों में अपरिवर्तनीय है।

अपडेट मुझे केवल यह जानना होगा कि एक मैच था – और मुझे यह जानने की जरूरत नहीं है कि मैच क्या था।

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

मेरे परीक्षण में मैंने दो दस्तावेजों के समाचार पत्रों में 1000 पैटर्नों की खोज की, 1000 से अधिक इतिहादों में औसत … आदि को पूरा करने के लिए सामान्य समय थे:

अहोकोरिक : 1

रबीन कर्म : 1.8

निष्क्रिय खोज (प्रत्येक पैटर्न जांचें और स्ट्रिंग कैंटेन्स का उपयोग करें): 50


* नीचे दिए गए उत्तरों में वर्णित अल्गो का वर्णन करने वाले कुछ संसाधन:

http://www.seas.gwu.edu/~simhaweb/cs151/lectures/module5/module5.html

http://www.cs.princeton.edu/courses/archive/spr09/cos226/lectures/18SubstringSearch-2×2.pdf

http://www-igm.univ-mlv.fr/~lecroq/string/index.html *

वेब के समाधान से एकत्रित समाधान "स्ट्रिंग में सबस्ट्रिंग के लिए खोज करने के लिए फास्ट एल्गोरिथ्म"

अहो-कोरासिक एल्गोरिथम और राबिन-कार्प एल्गोरिदम पर पढ़ें।

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

कार्यान्वयन:

प्रस्तुतियाँ:

एक निर्धारक परिमित राज्य automaton में उम्मीदवार स्ट्रिंग के सेट को परिवर्तित करें और फिर रैखिक समय में इनपुट स्ट्रिंग के माध्यम से चलाएं। एक एकल स्ट्रिंग को डीएफएस में परिवर्तित करना मानक पुस्तकों में अच्छी तरह से कवर किया गया है। आप पहली बार एक गैर-नियतात्मक automaton का निर्माण करके तारों का एक सेट बदल सकते हैं और फिर उसे निर्धारित कर सकते हैं। यही कारण है कि automaton के आकार में सबसे खराब स्थिति में झंखाव पैदा कर सकता है, लेकिन बाद में खोज तेज है; खासकर यदि लक्ष्य स्ट्रिंग लंबा है और कम उम्मीदवार कम से कम काम कर रहे हैं।

इस के लिए नियमित अभिव्यक्ति क्या है जैसा कि ऊपर उल्लेख किया गया है, परिमित राज्य ऑटोमेटा आप की जरूरत है, लेकिन यह वास्तव में एक मानक regexp-matcher कैसे लागू किया जाता है।

जावा में आप कुछ लिख सकते हैं:

StringBuilder sb = new StringBuilder(); bool first = true; for (String subStr : substrings) { if (first) first = false; else sb.append('|'); sb.append(escape(subStr)); } Pattern p = Pattern.compile(sb.toString()); 

विधि से escape से किसी भी ऐसे पात्रों को बचाना चाहिए जो एक regexp में विशेष अर्थ हैं।

राबिन-कार्प कई पैटर्न खोज सबसे तेज़ी से प्रतीत होता है

आप एहो-कोरासिक एल्गोरिथम और संबंधित एल्गोरिदम देख सकते हैं। मैं किसी भी पुस्तकालयों के बारे में नहीं जानता, जो इसे लागू करते हैं, लेकिन यह समस्या हल करने का क्लासिक तरीका है।

एकल-स्ट्रिंग पैटर्न मिलान के लिए बॉयर-मूर एल्गोरिदम भी जांचें।

स्मृति के मूल्य पर, हम इस मामले के लिए सुपर फास्ट एल्गो बनाने के लिए तारों के छोटे आकार (<50 वर्णों) का लाभ उठा सकते हैं।

हम एक हैश में आईएनआरएसआरएस की सभी संभावित सबस्ट्रिंग को एक समय में लगा सकते हैं जो ओ (एन ^ 2) समय की लागत आएगी। फिर CAND स्ट्रिंग की संख्या की परवाह किए बिना, लुकअप ओ (1) हो जाएगा। इसे CAND स्ट्रिंग्स की एक बहुत बड़ी संख्या के लिए मूल्य।

यदि INSTR बड़ी है, तो हम एक प्रत्यय एरे का निर्माण कर सकते हैं और इसे सॉर्ट नहीं कर सकते हैं, ताकि शीर्ष वस्तु सबसे लंबे समय तक (= एन) हो और निम्न आइटम INSTR का अंतिम अक्षर है। अब प्रत्येक कैंड स्ट्रिंग के लिए, केवल लम्बाई (सीएडीडी) <= लम्बाई (प्रत्यय) के रूप में शीर्ष पर से खोजें। उन तुलनाियों में से प्रत्येक ओ (एन) होगा।

एक और समाधान INSTR के लिए एक प्रत्यय एरे का उपयोग करना है
चूंकि INSTR छोटा है, आप इसे बुलबुले सॉर्ट के साथ सॉर्ट कर सकते हैं।

इसके बाद आप ओ (लॉगएन) समय में एक विशिष्ट CAND स्ट्रिंग खोज सकते हैं,
जहां एन = लंबाई (प्रत्यय_अरे) = लंबाई (INSTR)

जावा में तेज स्ट्रिंग खोज एल्गोरिदम के कुछ कार्यान्वयन यहां दिए गए हैं।

 import java.util.Scanner; public class StringMatch { static int temp,i=0,j=0; static boolean flag=true,matcher=false; static String str=null,mstr=null;static char astr[],amstr[]; static void getter(){ Scanner sc = new Scanner(System.in); str = sc.nextLine(); //String str="today is Monday"; astr=str.toCharArray(); mstr = sc.nextLine(); //String mstr="is"; amstr=mstr.toCharArray(); } static void stringMatch(){ while(i<astr.length){ if(astr[i]==amstr[j]){ while((j!=amstr.length)&&flag){temp=i; if(astr[i]!=amstr[j]) {flag=false;matcher=false;} else{matcher=true;} i++;j++; //System.out.println(i+"\t"+j); }if(matcher==true)break;i=temp;}i++;j=0;flag=true; } if(matcher==true) {System.out.println("true");} else {System.out.println("false");} } public static void main(String[] args) { StringMatch.getter(); StringMatch.stringMatch(); } }