इसे जल्दी करने के लिए बहुत सारी रणनीतियां हैं।
आइडिया 1
स्ट्रिंग आप खोज रहे हैं ले लो और कुछ स्तंभ में शुरुआत और पूरी स्ट्रिंग के माध्यम से जारी प्रत्येक संभव सबस्ट्रिंग की एक प्रतिलिपि बनाने। फिर प्रत्येक व्यक्ति को उस पत्र द्वारा अनुक्रमित सरणी में संग्रहीत करें जो इसके साथ शुरू होता है। (एक पत्र प्रयोग किया जाता है दो बार लंबे समय तक-स्ट्रिंग की दुकान
तो सरणी इस तरह दिखता है:।
a - substr[0] = "astringthatmustbechecked"
b - substr[1] = "bechecked"
c - substr[2] = "checked"
d - substr[3] = "d"
e - substr[4] = "echecked"
f - substr[5] = null // since there is no 'f' in it
... and so forth
फिर, शब्दकोश में प्रत्येक शब्द के लिए, सरणी तत्व में खोज अपना पहला पत्र ने संकेत दिया। यह उन सामानों की मात्रा को सीमित करता है जिन्हें खोजा जाना चाहिए। साथ ही आप स्ट्रिंग में पहले 'आर' से पहले कहीं भी 'आर' कहने से पहले एक शब्द नहीं ढूंढ सकते हैं। और कुछ शब्द खोज भी नहीं करेंगे यदि यह पत्र सभी को वहाँ में नहीं है।
आइडिया 2
शब्दकोश में सबसे लंबे शब्द को ध्यान में रखते हुए उस विचार पर विस्तार करें और उस दूरी से अधिक लंबे समय तक चलने वाले सरणी में उन तारों से अक्षरों से छुटकारा पाएं।
तो तुम सरणी में इस है:
a - substr[0] = "astri"
हैं:
a - substr[0] = "astringthatmustbechecked"
लेकिन अगर सूची में सबसे लंबा शब्द 5 पत्र है, रखने के लिए कोई जरूरत नहीं है किसी भी अधिक से अधिक पत्र कई बार आपको अधिक पत्र रखना है। इसलिए इसे पूरी स्ट्रिंग रखना है क्योंकि "ई" 5 अक्षर से कम दिखाता रहता है।
e - substr[4] = "echecked"
तारों को नियंत्रित करते समय आप किसी भी विशेष पत्र से शुरू होने वाले सबसे लंबे शब्दों का उपयोग करके इस पर विस्तार कर सकते हैं।
आइडिया 3
यह 1 और 2 इसका एक विचार है कि आप के बजाय इस्तेमाल कर सकते हैं के साथ कोई संबंध नहीं है।
आप शब्दकोश को एक लिंक की गई डेटा संरचना में संग्रहीत नियमित अभिव्यक्ति में बदल सकते हैं। नियमित अभिव्यक्ति भी लिखना संभव है और फिर इसे लागू करना संभव है।
मान लें इन शब्दकोश में शब्द हैं:
arun
bob
bill
billy
body
jose
बिल्ड जुड़ा हुआ संरचना इस तरह की। (इसका एक द्विआधारी पेड़, वास्तव में, इस तरह से कि मैं इसे कैसे उपयोग करने के लिए की व्याख्या कर सकते में प्रतिनिधित्व किया।)
a -> r -> u -> n -> *
|
b -> i -> l -> l -> *
| | |
| o -> b -> * y -> *
| |
| d -> y -> *
|
j -> o -> s -> e -> *
तीर एक पत्र एक अन्य पत्र का पालन किया है कि इंगित करते हैं। तो "आर" को "ए" के बाद होना चाहिए या यह मेल नहीं खा सकता है।
नीचे जाने वाली रेखाएं एक विकल्प को दर्शाती हैं। आपके पास "ए या बी या जे" संभावित अक्षर हैं और फिर "बी" के बाद "i या o" संभावित अक्षर हैं।
नियमित अभिव्यक्ति इस प्रकार दिखती है:/(अरुण) | (बी (बीमार (वाई +)) | (ओ (बी | डीई))) | (जोस)/(हालांकि मैंने एक पैर फिसल दिया हो सकता है)। यह इसे रेगेक्स के रूप में बनाने का सारांश देता है।
एक बार जब आप इस संरचना को बनाते हैं, तो आप इसे पहले कॉलम से शुरू करने वाली अपनी स्ट्रिंग पर लागू करते हैं। विकल्पों को जांचकर मैच चलाने की कोशिश करें और यदि कोई मेल खाता है, तो आगे की ओर आगे बढ़ें और तीर और उसके विकल्पों के बाद पत्र को आज़माएं। यदि आप स्टार/तारांकन तक पहुंचते हैं, तो यह मेल खाता है। यदि आप बैकट्रैकिंग सहित विकल्पों से बाहर निकलते हैं, तो आप अगले कॉलम पर जाते हैं।
यह बहुत काम है लेकिन कभी-कभी आसान हो सकता है।
साइड नोट मैंने कुछ कार्यक्रमों को एक प्रोग्राम लिखकर बनाया है जो कोड लिखता है जो बाइनरी पेड़ डेटा संरचना को देखने वाले कोड रखने के बजाय सीधे एल्गोरिदम चलाता है।
लंबवत बार विकल्पों के प्रत्येक सेट के बारे में सोचें switch
एक विशेष वर्ण स्तंभ के खिलाफ कथन और प्रत्येक तीर घोंसले में बदल रहा है। यदि केवल एक विकल्प है, तो आपको पूर्ण switch
कथन की आवश्यकता नहीं है, केवल if
।
यह कुछ तेज़ चरित्र मिलान था और वास्तव में कुछ कारणों से काम करता था जो आज मुझे बढ़ाता है।
क्या रिक्त स्थान से शब्दों को अलग करना संभव नहीं है? क्या आपको सभी अक्षरों को शब्दों को सत्यापित करना होगा, या यह पर्याप्त है कि कम से कम एक अंग्रेजी शब्द का पता लगाया जाए? क्या आप उपयोग की आवृत्ति के द्वारा शब्दों को ऑर्डर करते हैं और सबसे आम से शुरू करते हैं? –
आप वास्तव में क्या करने की कोशिश कर रहे हैं? क्या तारों में कभी भी रिक्त स्थान हैं? क्या आपको इसकी पूरी तरह से सटीक होने की आवश्यकता है या एक संभाव्य अनुमान अच्छा है? कचरा लाइन यादृच्छिक पात्र हैं या क्या? – DUman
मैं पहले बार-बार संदर्भित गैर-शब्दों का कैश उत्पन्न करता हूं - शायद 4-6 वर्णों के प्रीफेक्स जो वैध नहीं होते हैं। ऐसा करने के कई तरीके। –