दिलचस्प पोस्ट
करना या नहीं करना है: एक डेटाबेस में छवियों को स्टोर करें मुझे शहरों की एक मैपिंग सूची की ज़रूरत है – समय-समय पर इसे प्राप्त करने का सर्वोत्तम तरीका है? SQL डेटाबेस तालिकाओं में बहुरूपता? HTTPS और SSL3_GET_SERVER_CERTIFICATE: प्रमाणपत्र विफल हो गया, CA ठीक है जावा में (360/24) / 60 = 0 … क्यों? उद्देश्य-सी 2.0 में अंडरस्कोर के साथ इंस्टेंस व्हेरिएबल्स और @ सिंटेटेज़ के साथ नाम बदलने से एक्सकोड 4 के 'एनालिस' टूल द्वारा अनुकूलन चेतावनियों की ओर जाता है शुद्ध जावा / जेएसएफ़ के कार्यान्वयन के लिए दोहरी रोकथाम सबमिट करें जेडीबीसी में डालने की आईडी कैसे प्राप्त करें? जांचें कि क्या एप्लिकेशन इंस्टॉल है – एंड्रॉइड स्वचालित रूप से पाठ बॉक्स नियंत्रण को खड़ी करना लैंपडा को एक पाश के अंदर बनाना सी # परीक्षा अगर उपयोगकर्ता ने किसी फ़ोल्डर में प्रवेश लिखना है माइक्रोसॉफ्ट एक्सेल ActiveX नियंत्रण अक्षम है? परियोजना निर्भरता के भाग के रूप में गतिशील रूप से जेनरेट की गई फ़ाइलों को कॉपी करने के लिए MSBuild मैं JavaScript में regex literals को कैसे जोड़ सकता हूं?

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

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

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

इनपुट स्ट्रिंग को देखते हुए – 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 *

Solutions Collecting From Web of "स्ट्रिंग में सबस्ट्रिंग के लिए खोज करने के लिए फास्ट एल्गोरिथ्म"

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

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

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

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

एक निर्धारक परिमित राज्य 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(); } }