एक अनुमानित स्ट्रिंग खोज प्रारंभिक बिंदु लेवेंसहाइट दूरी है । यह एल्गोरिथम एक शब्द को दूसरे में बदलने के लिए एकल वर्ण संपादन (सम्मिलित करें, हटाएं और प्रतिस्थापन) की संख्या को गिनाता है।
इसका एक उदाहरण है kitten
-> sitting
जिसमें तीन की संपादित दूरी है
- k itten -> s itten ('k' के लिए 'विकल्प')
- sitt e n -> sitt i n ('ई' के लिए 'विकल्प')
- sittin -> sittin g (अंत में 'g' जोड़ें)
इस एल्गोरिथ्म में भिन्नताएं हैं, विशेष रूप से दमेराऊ-लेवेन्शिन दूरी जो दो आसन्न पात्रों के ट्रांसपोज़न की अनुमति देती है ('हेट' से 'के लिए' में एक डीएल की दूरी 1 है और एक लेवेनशेटिन की दूरी 2 है) और इस तरह अक्सर अधिक उपयुक्त है वर्तनी जांच। अन्य भिन्नताएं उन अनुप्रयोगों के लिए मौजूद हैं जहां अंतराल महत्वपूर्ण हैं (डीएनए स्ट्रिंग्स)।
लेवेंसहाइट दूरी अच्छी तरह से ज्ञात है और इसे खोजने के लिए बहुत मुश्किल नहीं है (मैंने एक बार इसे एक कार्यान्वयन के रूप में शिकार करने का कारण बना दिया था, जो कि अलंकरण में एक समारोह के रूप में था - यह सभी डेटा को खींचने और फिर क्वेरी कोड पक्ष को चलाने की तुलना में बहुत तेज़ था)। Rosettacode की implemntations की एक भीड़ (54) है Levenshtein दूरी (- अगर आप जावा, पर नज़र कर रहे हैं टिप्पणी कुछ भाषाओं स्ट्रिंग पुस्तकालय कहीं के हिस्से के रूप में इस है कि Apache Commons लैंग )। विकीबूक में 31 कार्यान्वयन हैं और दोनों में एक सरसरी नज़र एक ही भाषा के लिए समान कोड नहीं दिखाती है।
जिस तरह से यह काम करता है वह एक मैट्रिक्स का निर्माण करता है जो दो तारों के बीच संबंधों से मेल खाता है:
.kitten
.0123456
s1123456
i2212345
t3321234
t4432123
i5543223
n6654332
g7765443
.
पंक्ति और स्तंभ दर्शाते हैं कि आप द्वारा 'सिर्फ' एक खाली स्ट्रिंग से प्रत्येक अक्षर डालने लक्ष्य स्ट्रिंग के लिए मिल सकता है। यह आदर्श मामला नहीं है, लेकिन यह एल्गोरिथ्म को बीज करने के लिए है।
यदि मान उसी स्थान ('i' == 'i') पर है, तो मान बाईं ओर तिरछे मूल्य के समान है। यदि दो धब्बे असमान हैं ('s'! = 'K') मान न्यूनतम है:
- विकर्ण ऊपर और बाईं ओर + 1 (एक प्रतिस्थापन)
- सीधे + 1 से ऊपर (एक प्रविष्टि)
- सीधे बाईं ओर + 1 (एक विलोपन)
मैट्रिक्स के निचले दाएं हिस्से में एडिट डिस्टेंस रिटर्न वैल्यू है।
यदि आप निचले दाएं से ऊपरी बाएँ से न्यूनतम के साथ अनुसरण करते हैं, तो आप किए गए संपादन देख सकते हैं:
.kitten
.0. .
s.1 .
i 1 .
t 1 .
t 1.
i.....2
n 2
g......3
ध्यान दें कि यह बल्कि स्मृति गहन दृष्टिकोण है। पूर्ण मैट्रिक्स का निर्माण नहीं करने से इसे मेमोरी स्कोप में कम किया जा सकता है - सभी एल्गोरिथ्म के बारे में परवाह है डेटा का एक सबसेट है और इसे पिछली पंक्ति को संग्रहीत करके अंतरिक्ष से N*M
अंतरिक्ष में कम किया जा सकता है 2*max(N,M)
(और वर्तमान में क्या गणना की गई है? पंक्ति)। कोड प्रोजेक्ट दिखाता है कि यह कैसे किया जा सकता है (डाउनलोड करने के लिए C # कोड के साथ)।