7

2 तार s और t को देखते हुए की संपादन दूरी खोजने के लिए। मुझे s संपादन दूरी (लेवेनशेटिन दूरी) में t में प्रत्येक सबस्ट्रिंग के लिए खोजने की आवश्यकता है। असल में मुझे s में प्रत्येक i स्थिति के बारे में जानने की आवश्यकता है i पर सभी सबस्ट्रिंग्स के लिए न्यूनतम संपादन दूरी क्या है।एल्गोरिथ्म सभी सबस्ट्रिंग

उदाहरण के लिए:

t = "ab"  
s = "sdabcb" 

और मैं की तरह कुछ प्राप्त करने की आवश्यकता:

{2,1,0,2,2}

स्पष्टीकरण:

1st position: 
distance("ab", "sd") = 4 (2*subst) 
distance("ab", "sda") = 3(2*delete + insert) 
distance("ab", "sdab") = 2 (2 * delete) 
distance("ab", "sdabc") = 3 (3 * delete) 
distance("ab", "sdabcb") = 4 (4 * delete) 
So, minimum is 2 

2nd position: 
distance("ab", "da") = 2 (delete + insert) 
distance("ab", "dab") = 1 (delete) 
distance("ab", "dabc") = 2 (2*delete) 
.... 
So, minimum is 1 

3th position: 
distance("ab", "ab") = 0 
... 
minimum is 0 

और इतने पर।

मैं इस कार्य को हल करने के लिए ब्रूट फोर्स एल्गोरिदम का उपयोग कर सकता हूं। लेकिन क्या तेजी से एल्गोरिदम है?

सहायता के लिए धन्यवाद।

+0

मुझे पता है कि आपका उत्तर '{2,1, ** 0,2 **, 2} 'गलत है, क्योंकि आसन्न संख्याएं अधिकतम 1 से भिन्न हो सकती हैं: यदि कोई सबस्ट्रिंग है [i..j ] 'न्यूनतम संपादन दूरी' k' से 't' के साथ, तो सबस्ट्रिंग [i (1 +) .. j] 'पहला संपादन ऑपरेशन करके अधिकांश' k + 1' पर लागत के साथ 't' मिलान कर सकता है स्ट्रिंग की शुरुआत में 'i [i]' का सम्मिलन। आपके उदाहरण में, चौथी स्थिति के लिए, 'दूरी (" एबी "," बी ") = 1' (1 डालने) और 5 वीं,' दूरी ("एबी", "सीबी") = 1' (1 सबस्ट) के लिए । –

उत्तर

4

वैगनर-फिशर एल्गोरिथ्म आप "मुक्त करने के लिए" सभी उपसर्गों के लिए इस सवाल का जवाब देता है।

http://en.wikipedia.org/wiki/Wagner%E2%80%93Fischer_algorithm

वैगनर-फिशर मैट्रिक्स की अंतिम पंक्ति t करने के लिए s में से प्रत्येक के उपसर्ग से संपादित दूरी शामिल हैं।

इसलिए आपकी समस्या पर पहली क्रैक के रूप में, प्रत्येक i के लिए, Wagner-Fischer चलाएं और अंतिम पंक्ति में सबसे छोटा तत्व चुनें।

मैं किसी और को जानता है (या पा सकते हैं), तो देखने के लिए एक बेहतर दृष्टिकोण उत्सुक हो जाएगा।

+0

धन्यवाद, लेकिन मेरा मतलब यह समाधान ब्रूट फोर्स के रूप में था ... और मुझे उम्मीद है कि बेहतर समाधान (संबंधित समय जटिलता) मौजूद है। –

+0

मुझे संदेह है कि कोई भी उदाहरण के बिना आपका जवाब समझ जाएगा। – Elmue

3

किसी दिए गए स्ट्रिंग में सबस्ट्रिंग खोजने के लिए बहुत आसान है। आप सामान्य लेवेनशेटिन एल्गोरिदम लेते हैं और इसे थोड़ा संशोधित करते हैं।

सबसे पहले: इसके बजाय 0,1,2,3,4,5 साथ मैट्रिक्स की पहली पंक्ति में भरने की ... आप शून्य से पूरी तरह से भरें। (हरा आयताकार)

दूसरा: फिर आप एल्गोरिदम चलाते हैं।

तृतीय: इसके बजाय अंतिम पंक्ति आप अंतिम पंक्ति में सबसे छोटी मूल्य के लिए खोज और इसे वापस के अंतिम सेल लौटने का। (लाल आयत)

उदाहरण: सुई: "ए.बी.ए.", भूसे के ढेर: "ग अब्बा ग" -> परिणाम = 1 (परिवर्तित अब्बा -> ए.बी.ए.)

enter image description here

मैंने पाया यहाँ यह: http://ginstrom.com/scribbles/2007/12/01/fuzzy-substring-matching-with-levenshtein-distance-in-python/

मैं इसे परीक्षण किया है और यह काम करता है।

यह आपके प्रश्न में स्ट्रिंग के माध्यम से चरित्र द्वारा चरणबद्ध चरित्र के आपके सुझाव से कहीं अधिक तेज़ है। आप केवल एक बार मैट्रिक्स बनाते हैं।

संबंधित मुद्दे