यदि आपको लगता है कि मामले को अनदेखा करने की अनुमति है, तो मुझे अपने शब्दकोष में सभी शब्द और सभी खोज शब्द किसी और चीज़ से पहले एक ही मामले में करें। ऊपरी या निचले मामले में कोई फर्क नहीं पड़ता। यदि आपके पास कुछ शब्द हैं जो केस संवेदनशील हैं और अन्य जो नहीं हैं, तो शब्दों को दो समूहों में विभाजित करें और प्रत्येक को अलग से खोजें।
आप केवल मिलान करने वाले शब्द हैं, इसलिए आप शब्दकोश को तारों की एक सरणी में तोड़ सकते हैं। चूंकि आप केवल ज्ञात लंबाई के खिलाफ सटीक मिलान कर रहे हैं, इसलिए प्रत्येक शब्द की लंबाई के लिए शब्द सरणी को एक अलग सरणी में विभाजित करें। तो बाईथेंथ [3] लंबाई 3 के साथ सभी शब्दों को सरणी है। प्रत्येक शब्द सरणी को सॉर्ट किया जाना चाहिए।
अब आपके पास शब्दों की एक सरणी है और संभावित जंगली कार्ड्स खोजने वाला शब्द है। गीलेर और जहां वाइल्डकार्ड हैं, के आधार पर कुछ दृष्टिकोण हैं।
यदि खोज शब्द में कोई जंगली कार्ड नहीं है, तो अपने सॉर्ट किए गए सरणी में एक बाइनरी खोज करें। आप इस बिंदु पर एक हैश कर सकते हैं, जो तेजी से होगा लेकिन ज्यादा नहीं। यदि आपके खोज शब्दों के विशाल बहुमत में वाइल्डकार्ड नहीं हैं, तो हैश द्वारा कुंजी वाली एक हैश तालिका या एक सहयोगी सरणी पर विचार करें।
यदि खोज शब्द में कुछ शाब्दिक पात्रों के बाद वाइल्डकार्ड हैं, तो ऊपरी और निचले बाउंड को खोजने के लिए क्रमबद्ध सरणी में बाइनरी खोज करें, फिर उस बाउंड में एक रैखिक खोज करें। यदि वाइल्डकार्ड सभी पीछे हैं तो एक खाली खाली सीमा खोजना पर्याप्त है।
यदि सर्च टर्म वाइल्ड कार्ड्स से शुरू होता है, तो सॉर्टेड सरणी कोई मदद नहीं है और आपको एक रैखिक खोज करने की आवश्यकता होगी जब तक कि आप पीछे की तारों से क्रमबद्ध सरणी की एक प्रति न रखें। यदि आप ऐसा सरणी बनाते हैं, तो किसी भी समय अग्रणी साहित्यिक से अधिक पीछे की ओर चयन करें। यदि आप अग्रणी वाइल्डकार्ड की अनुमति नहीं देते हैं तो इसकी कोई आवश्यकता नहीं है।
यदि खोज शब्द दोनों वाइल्डकार्ड के साथ शुरू होता है और समाप्त होता है, तो आप बराबर लंबाई वाले शब्दों के भीतर एक रैखिक खोज के साथ अटक जाते हैं।
तो तारों के सरणी की एक सरणी। तारों की प्रत्येक सरणी को क्रमबद्ध किया जाता है, और इसमें समान लंबाई के तार होते हैं। वैकल्पिक वाइल्डकार्ड के मामले के लिए पिछड़े तारों के आधार पर सॉर्टिंग के साथ पूरी संरचना को वैकल्पिक रूप से डुप्लिकेट करें।
कुल स्थान प्रति शब्द एक या दो पॉइंटर्स है, साथ ही शब्दों। यदि आपकी भाषा अनुमति देता है तो आपको सभी शब्दों को एक ही बफर में स्टोर करने में सक्षम होना चाहिए। बेशक, अगर आपकी भाषा अनुमति नहीं देती है, तो grep शायद वैसे भी तेज है। दस लाख शब्दों के लिए, यह सरणी के लिए 4-16 एमबी है और वास्तविक शब्दों के समान है।
कोई वाइल्डकार्ड वाले खोज शब्द के लिए, प्रदर्शन बहुत अच्छा होगा।वाइल्डकार्ड के साथ, कभी-कभी शब्दों के बड़े समूहों में रैखिक खोज होती है। लंबाई और एक प्रमुख चरित्र के टूटने के साथ, आपको सबसे खराब मामले में भी कुल शब्दकोश के कुछ प्रतिशत से अधिक खोजना नहीं चाहिए। ज्ञात लंबाई के केवल पूरे शब्दों की तुलना सामान्य जेनरेट स्ट्रिंग मिलान से हमेशा तेज होगी।
मुझे यकीन नहीं है, लेकिन मुझे लगता है कि एक प्रत्यय वृक्ष आप जो खोज रहे हैं वह हो सकता है - http://en.wikipedia.org/wiki/Suffix_tree – Rubys
क्या आपको सभी grep शैली वाइल्डकार्ड का समर्थन करना है या बस ? (आपके मामले में अंडरस्कोर _)? –
क्या वाइल्डकार्ड केवल एक ही वर्ण से मेल खाते हैं या क्या वे मनमानी लंबाई की एक स्ट्रिंग से मेल खाते हैं? – drawnonward