जैसा कि बताया गया है, यह समस्या अधिक सामान्यतः संपादित दूरी समस्या ( लेवेंसहेटिन दूरी को अंतर्निहित ) के समान है। इसके साथ समानताएं भी हैं, उदाहरण के लिए, डायनेमिक टाइम वारपिंग दूरी (दोहराव, या "हकलाना," आपकी आवश्यकता के अनुसार)।
गतिशील प्रोग्रामिंग की ओर कदम
x=x1…xny=y1…ymd(x,y)
min⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪d(x,y1…ym−1)+1d(x,y2…ym)+1d(x,y1…ym/2)+1d(x1…xn/2,y)+1d(x1…xn,y)+1d(x1…xn−1,y1…ym−1)if y=y1…ym/2y1…ym/2if x=x1…xn/2x1…xn/2if yn=ym▻ Add letter at end▻ Add letter at beginning▻ Doubling▻ Halving▻ Deletion▻ Ignoring last elt.
यहां, अंतिम विकल्प मूल रूप से कहता है कि FOOX को BARX में बदलना FOO को BAR में बदलने के बराबर है। इसका मतलब है कि आप हकलाना (दोहराव) प्रभाव और एक बिंदु पर विलोपन को प्राप्त करने के लिए "अंत में अक्षर जोड़ें" विकल्प का उपयोग कर सकते हैं। समस्या यह स्वचालित रूप से आप एक जोड़ने की सुविधा देता है मनमाने ढंग से स्ट्रिंग के बीच में चरित्र के साथ-साथ , कुछ तो आप शायद नहीं करना चाहती। (यह "समान अंतिम तत्वों की अनदेखी" मनमाना पदों में विलोपन और हकलाहट को प्राप्त करने का मानक तरीका है। यह मनमाना सम्मिलन को निषिद्ध करता है, जबकि अंत में थोड़ा सा जोड़कर अनुमति देता है, हालांकि थोड़ा मुश्किल ...)
मैंने इस ब्रेकडाउन को शामिल किया है, भले ही यह पूरी तरह से काम नहीं करता है, अगर कोई और इसे "बचाव" कर सकता है, तो - और क्योंकि मैं इसे अपने अनुमानी समाधान में उपयोग करता हूं, नीचे।
(बेशक, यदि आप इस तरह एक ब्रेकडाउन प्राप्त कर सकते हैं जो वास्तव में आपकी दूरी को परिभाषित करता है, तो आपको केवल संस्मरण जोड़ने की आवश्यकता होगी, और आपके पास एक समाधान होगा। हालांकि, क्योंकि आप सिर्फ उपसर्ग के साथ काम नहीं कर रहे हैं, मैं डॉन ' टी आपको लगता है कि आप अपने संस्मरण के लिए सिर्फ अनुक्रमित का उपयोग कर सकते हैं, आपको प्रत्येक कॉल के लिए वास्तविक, संशोधित तारों को संग्रहीत करना पड़ सकता है, जो कि आपके तार पर्याप्त आकार के होते हैं।)
एक हेयूरिस्टिक समाधान की ओर कदम
एक और दृष्टिकोण, जिसे समझना आसान हो सकता है, और जो काफी कम जगह का उपयोग कर सकता है, वह है ए कम से कम "एडिट पाथ" की खोज अपने पहले स्ट्रिंग से दूसरे सेकंड में, एल्गोरिथ्म (मूल रूप से, सर्वश्रेष्ठ-) का उपयोग करके पहली शाखा-और-बाउंड)। खोज स्थान को सीधे आपके संपादन कार्यों द्वारा परिभाषित किया जाएगा। अब, एक बड़ी स्ट्रिंग के लिए, आप करेंगेA∗एक बड़ा पड़ोस प्राप्त करें, जैसा कि आप किसी भी चरित्र को हटा सकते हैं (आपको प्रत्येक संभावित विलोपन के लिए पड़ोसी दे सकते हैं), या किसी भी चरित्र को दोहरा सकते हैं (फिर से, आपको पड़ोसियों की एक रैखिक संख्या दे सकते हैं), साथ ही साथ किसी भी चरित्र को जोड़ सकते हैं, जो कि अंत में होगा। आपको वर्णमाला के आकार के दोगुने के बराबर पड़ोसी देते हैं। (बस आशा है कि आप पूर्ण यूनिकोड का उपयोग नहीं कर रहे हैं ;-) इतने बड़े धूमधाम के साथ, आप एक द्विदिश , या कुछ रिश्तेदारA∗ का उपयोग करके काफी गति प्राप्त कर सकते हैं ।
यह सुनिश्चित करने के काम करते हैं, आप अपने लक्ष्य के लिए एक कम शेष दूरी के लिए बाध्य नहीं करनी होंगी। मुझे यकीन नहीं है कि अगर यहां एक स्पष्ट विकल्प है, लेकिन आप जो कर सकते हैं वह एक गतिशील प्रोग्रामिंग समाधान को लागू करता है जो मैंने ऊपर दिए गए पुनरावर्ती अपघटन के आधार पर किया है (यदि आपके तार बहुत लंबे हैं तो संभव अंतरिक्ष मुद्दों के साथ फिर से)। कि अपघटन बिल्कुल अपनी दूरी की गणना नहीं करता है, यह है एक कम बाध्य होने के लिए (क्योंकि यह अधिक अनुमोदक है) की गारंटी, उस में एक अनुमानी तरीके से कार्य करता है जिसका अर्थ है । (यह कितना तंग होगा, मुझे नहीं पता, लेकिन यह सही होगा।) बेशक, आपके बाध्य फ़ंक्शन का संस्मरण आपके दौरान बाध्य की सभी गणनाओं में साझा किया जा सकता हैA∗A∗A∗Daud। (एक समय- / स्पेस-ट्रेडऑफ़।)
इसलिए…
मेरे प्रस्तावित समाधान की दक्षता आपके स्ट्रिंग्स की लंबाई (1) और आपके वर्णमाला के आकार पर (1) बहुत कम दिखती है। यदि न तो बहुत बड़ा है, तो यह काम कर सकता है। अर्थात्:
- मेरी पुनरावर्ती अपघटन और गतिशील प्रोग्रामिंग (उदाहरण के लिए, एक ज्ञापन, पुनरावर्ती फ़ंक्शन का उपयोग करके) का उपयोग करके अपनी दूरी के निचले हिस्से को लागू करें।
- लागू (या द्विदिश "चाल" राज्य के अंतरिक्ष में, और गतिशील प्रोग्रामिंग आधारित कम बाध्य के रूप में अपने संचालन संपादित के साथ)।A∗A∗
मैं वास्तव में कोई भी गारंटी नहीं दे सकता कि यह कितना कुशल होगा, लेकिन यह सही होना चाहिए, और यह संभवतः एक जानवर-बल समाधान की तुलना में बहुत बेहतर होगा।
अगर और कुछ नहीं, मुझे आशा है कि यह आपको आगे की जांच के लिए कुछ विचार देगा।