मैंने हाल ही में विकिपीडिया पर स्यूडोकोड से दमरेउ-लेवेंसाइट दूरी एल्गोरिथ्म को लागू किया है। मैं यह वास्तव में कैसे काम करता है का कोई स्पष्टीकरण नहीं नहीं पा सके और स्यूडोकोड की तरह पूरी तरह से uninformative चर नाम का उपयोग करता है DA
, DB
, i1
, और j1
कि छोड़ दिया मुझे मेरे सिर खरोंच।
यहाँ पायथन में मेरा कार्यान्वयन है: https://gist.github.com/badocelot/5327337
पायथन कार्यान्वयन ने मुझे कार्यक्रम के माध्यम से चलने और यह पता लगाने में मदद की कि क्या हो रहा है, चर का नाम बदलकर अधिक उपयोगी नाम है। मैं वैगनर-फिशर दृष्टिकोण के साथ पर्याप्त रूप से परिचित था जो कि लेवेन्सहाइट दूरी की गणना करता था जो मेरे पास संदर्भ का एक फ्रेम था।
अधिक लंबा होने के जोखिम पर, यहाँ मैं दमरेउ-लेवन्सहाइटिन को कैसे समझता हूँ:
रहस्य चर:
DA
(last_row
मेरे कोड में) अंतिम पंक्ति को पकड़े हुए एक प्रकार का नक्शा है, जिस पर प्रत्येक तत्व को देखा गया था; मेरे कोड में यह एक वास्तविक पायथन शब्दकोश हैDB
(last_match_col
) अंतिम पंक्ति रखता है जहां पत्र वर्तमान पंक्ति के लिए पत्र सेb
मेल खाता हैa
i1
(last_matching_row
)DA
वर्तमान अक्षर के लिए से पंक्ति संख्या हैb
j1
संभावित रूप से अपडेट होने से पहलेDB
/ के मूल्य की एक प्रति हैlast_match_col
; मेरे कोड में मैं अभी स्थानांतरित किया गया जहांlast_match_col
अद्यतन किया गया है और इस चर को समाप्त कर दिया है
ट्रांसपोजिशन लागत:
H[i1][j1] + (i-i1-1) + 1 + (j-j1-1)
b
अंतिम चरित्र के साथ वर्तमान चरित्र को स्वैप करने की लागत की गणना (अंतिम मैच) के रूप में b
ज्ञात करने के लिए की जाती है a
, या तो सभी वर्णों को जोड़ने या हटाने के बीच में।
लागत के घटक:
H[i1][j1]
ट्रांसपोज़ेशन से पहले की गणना में बेस कॉस्ट को वापस ले लेता है, क्योंकि ट्रांसपोज़िशन ढूंढने से पिछला काम अमान्य हो जाता है(i-i1-1)
वर्तमान पंक्ति और अंतिम पंक्ति के बीच की दूरी वर्तमान चरित्र से मेल खाती है, जो कि आवश्यक विलोपन की संख्या है(j-j1-1)
वर्तमान कॉलम और मैच के साथ अंतिम कॉलम के बीच की दूरी है, जो कि परिवर्धन की संख्या है- अतिरिक्त
+ 1
केवल ट्रांसपोज़िशन की लागत है
यदि यह विश्लेषण गलत है, तो मुझे यह जानकर अच्छा लगेगा कि मैं कहां गलत हो गया हूं। जैसा कि मैंने कहा, मैं कोई विस्तृत विवरण नहीं पा सका कि एल्गोरिथ्म ऑनलाइन कैसे काम करता है।
संशोधित संस्करण?
यह पता लगाने के बाद कि, इसने मुझ पर प्रहार किया कि ट्रांसपोज़्ड अक्षरों के बीच जोड़ और विलोपन दोनों की लागत की गणना करने में त्रुटिपूर्ण लग रहा था: एक जोड़ और एक विलोपन एक प्रतिस्थापन के बराबर है, जो इसके लिए जाँच नहीं कर रहा है।
यदि यह सब सही है, तो समाधान तुच्छ होना चाहिए: ट्रांसपोज्ड अक्षरों के बीच के अक्षरों की लागत अतिरिक्त और विलोपन से अधिक होनी चाहिए : जितना संभव हो उतने प्रतिस्थापन में रूपांतरित करें और किसी भी अतिरिक्त या विलोपन में जोड़ें।
तो लागत होगी:
H[i1][j1] + max((i-i1-1), (j-j1-1)) + 1
इस संस्करण के लिए मेरा कोड यहाँ है: https://gist.github.com/badocelot/5327427
कुछ सरल परीक्षणों से, यह सही लगता है। उदाहरण के लिए, "abcdef" -> "abcfad" 2 की एक संपादित दूरी देता है ("d" और "f" को स्थानांतरित करें, "e" को "a" में बदलें), जबकि मूल एल्गोरिथ्म 3 की दूरी (या तो तीन) देता है अक्षर प्रतिस्थापन हैं, या 1 स्थानान्तरण + 1 जोड़ + 1 विलोपन)।
अब, मैं ऐसा सोचने वाला पहला व्यक्ति नहीं हो सकता। तो, मैंने इसे क्यों नहीं चलाया? क्या मैंने अभी लंबे समय तक खोज नहीं की? या क्या कोई सूक्ष्म दोष है जो वास्तव में काम करने से रोकता है?