algorithm - Fast way to find strings in set of strings containing substring -


कार्य

मेरे पास एस का n = 10,000,000 स्ट्रिंग s और s p स्ट्रिंग वाले s को खोजने की आवश्यकता है S एस में पी .

सरल समाधान

जैसा कि मैंने सी # का उपयोग कर रहा हूँ यह है LINQ का उपयोग करने वाला एक साधारण कार्य:

  स्ट्रिंग [] S = new string [] {"हैलो", "विश्व"}; स्ट्रिंग पी = "ll"; IEnumerable & LT; स्ट्रिंग & gt; S_p = S.Where (s => s.Contains (पी));   

समस्या

यदि एस में कई स्ट्रिंग्स हैं (जैसे कि 10,000,000 स्ट्रिंग उल्लिखित हैं) यह बहुत धीमी गति से हो जाता है.

प्रश्न पी < p> H1>

इस कार्य के लिए एस सूचकांक का सबसे अच्छा तरीका क्या है और क्या आपके पास सी # में कोई क्रियान्वयन है?

इसे करने का एक तरीका है: Portuguese 1. एक स्ट्रिंग T = S [ 0] + sep_0 + S [1] + sep_1 + ... + बनाएँ. एस [एन -1] + सेप_एन -1 (जहां सेप_आई एक अनूठा चरित्र है जो कभी भी S [j] में j (यह वास्तव में एक पूर्णांक संख्या हो सकता है अगर पात्रों का सेट बड़ा नहीं है). 2. प्रत्येक प्रत्यय पेड़ बनाएं (यह रैखिक समय में किया जा सकता है). क्वेरी स्ट्रिंग के लिए Q प्रत्यय पेड़ को पार करें (यह O (लंबाई (क्यू)) समय लेता है). तब भ भ उत उत थ थ थ थ थ थ थ थ थ थ थ थ थ थ थ थ थ थ. तो आप इन सभी पत्तों को पार कर सकते हैं अगर क्यू बहुत लंबा है, तो इस उपशीर्षक में पत्तियों की संख्या n से बहुत कम होने की संभावना है.
4. यदि Q वास्तव में कम है, तो एक उपखंड में पत्तियों की संख्या बहुत बड़ी हो सकती है यही कारण है कि आप छोटी क्वेरी स्ट्रिंग के लिए एक और रणनीति का उपयोग कर सकते हैं: एस [0] ... एस [एन -1] के सभी लघु सबस्ट्रिंगों को प्रीकंपुपुट करें और उनमें से प्रत्येक के लिए इंडेक्स के एक सेट को स्टोर करें जहां यह है हुई. फिर आप किसी दिए गए Q के लिए इन सूचकांकों को प्रिंट कर सकते हैं यह कहना मुश्किल है कि 'संक्षिप्त' का बिल्कुल अर्थ क्या है, लेकिन इसे प्रयोगात्मक रूप से पाया जा सकता है.

Comments

Popular posts from this blog

Out of index C/C++ -

regex - PatternSyntaxException: while using String.ReplaceAll function in java? -

java - Projects which are accessed via multiple (different) IDEs: Ant or Maven? -