दो शब्दों के बीच संपादन की सबसे छोटी संख्या


11

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

  • चरम सीमाओं में से एक पर एक पत्र जोड़ें (उदाहरण के लिए, एबी -> एबीसी),
  • पूरे शब्द को डुप्लिकेट और संक्षिप्त करें (उदाहरण के लिए, ABC -> ABCABC),
  • एक शब्द को दो में काटें (दोहराव का दोहराव, ABCABC -> ABC + ABC)
  • अक्षरों में से एक को हटा दें (उदाहरण के लिए, एबीसी -> एसी), और
  • अक्षरों में से एक को दोहराएं (उदाहरण के लिए, एबीसी -> एबीबीसी)।

उदाहरण के लिए, एबीसी से बीसीबीसी तक की चाल का एक न्यूनतम अनुक्रम एबीसी है -> बीसी (ए हटाएं) -> बीसीबीसी (दोहराव)।

मेरे पास कंप्यूटर विज्ञान की पृष्ठभूमि नहीं है। शायद यह एक अच्छी तरह से ज्ञात समस्या है, लेकिन मेरी Google खोज ने मुझे कुछ नहीं दिया।

क्या आप कुछ संबंधित, अच्छी तरह से परिभाषित समस्या जानते हैं?

संपादित करें : जैसा कि एंथोनी लैबर्रे द्वारा जवाब में सुझाया गया है, मैंने पोसेट क्रमचय / व्यवस्था की समस्या के बारे में कुछ कागजात पढ़े जो ऊपर वर्णित समस्या के समान है। क्या किसी को इस समस्या के बारे में अधिक पता है? क्या यह प्रासंगिक है?


1
संभवत: en.wikipedia.org/wiki/String_metric पर सूची में से कोई भी लागू नहीं है, न ही यह sourceforge.net/projects/simmetrics में है ?
आंद्र सलाम

मैं उन सभी को नहीं जानता, लेकिन इन तरीकों में से अधिकांश का लक्ष्य स्ट्रिंग्स को केवल एक अक्षर परिवर्तन की अनुमति के साथ संरेखित करना है और अधिक जटिल चाल की अनुमति नहीं है।
cz3rk

1
एक डुप्लिकेट पूरे स्ट्रिंग ABC -> ABCABC पर लागू होता है, इसलिए दिशा मायने नहीं रखती है। लेकिन पुनरावृत्ति की दिशा केवल दाएं बाएं क्रम में हो सकती है, जैसे कि हकलाना।
cz3rk

2
यदि इनपुट शब्द अक्षरों को साझा नहीं करते हैं तो यह क्यों महत्वपूर्ण है? ( @ Reinerpost के अनुक्रम में Aऔर के बीच एक खाली स्ट्रिंग होनी चाहिए B।)
Jeff

2
www

जवाबों:


3

मुझे नहीं पता कि इस सटीक समस्या का अध्ययन किया गया है, लेकिन चौधरी एट अल। संबंधित टेंडेम डुप्लीकेशन-रैंडम लॉस प्रॉब्लम का अध्ययन किया : आपको एक क्रमपरिवर्तन दिया जाता है, और आप इसे किसी भी लम्बाई के एक सेगमेंट को डुप्लिकेट करके पहचान के क्रम में बदलना चाहते हैं और मूल के ठीक बाद कॉपी को अप्लाई करते हैं, तब (2) हटा रहे हैं तत्वों ताकि आप एक स्ट्रिंग के बजाय एक नया क्रमचय प्राप्त करें। ध्यान दें कि आवेदन (1) तब (2) एक ऑपरेशन के लिए खाते।

प्रत्येक ऑपरेशन के लिए दिए गए वजन के अनुसार विभिन्न वेरिएंट को परिभाषित किया जा सकता है, जो उनके पेपर में डुप्लिकेट किए गए सेगमेंट की चौड़ाई पर निर्भर करता है। वे पूरे जीनोम दोहराव के साथ एक समान समस्या का भी अध्ययन करते हैं , जो आपके द्वारा अनुमति दी जाने वाली नकल की तरह है। मुझे स्ट्रिंग्स के संदर्भ में इस समस्या पर काम करने के बारे में पढ़ना याद नहीं है, लेकिन मुझे उम्मीद है कि यह आपकी खोजों के लिए कम से कम आपको एक शुरुआती बिंदु दे सकता है।


धन्यवाद, मैं उनके काम पर एक नज़र डालूंगा। मैं दोनों समस्याओं के बीच संबंध देख सकता हूं।
cz3rk

2

जैसा कि बताया गया है, यह समस्या अधिक सामान्यतः संपादित दूरी समस्या ( लेवेंसहेटिन दूरी को अंतर्निहित ) के समान है। इसके साथ समानताएं भी हैं, उदाहरण के लिए, डायनेमिक टाइम वारपिंग दूरी (दोहराव, या "हकलाना," आपकी आवश्यकता के अनुसार)।

गतिशील प्रोग्रामिंग की ओर कदम

x=x1xny=y1ymd(x,y)

min{d(x,y1ym1)+1▻ Add letter at endd(x,y2ym)+1▻ Add letter at beginningd(x,y1ym/2)+1if y=y1ym/2y1ym/2▻ Doublingd(x1xn/2,y)+1if x=x1xn/2x1xn/2▻ Halvingd(x1xn,y)+1▻ Deletiond(x1xn1,y1ym1)if yn=ym▻ Ignoring last elt.

यहां, अंतिम विकल्प मूल रूप से कहता है कि FOOX को BARX में बदलना FOO को BAR में बदलने के बराबर है। इसका मतलब है कि आप हकलाना (दोहराव) प्रभाव और एक बिंदु पर विलोपन को प्राप्त करने के लिए "अंत में अक्षर जोड़ें" विकल्प का उपयोग कर सकते हैं। समस्या यह स्वचालित रूप से आप एक जोड़ने की सुविधा देता है मनमाने ढंग से स्ट्रिंग के बीच में चरित्र के साथ-साथ , कुछ तो आप शायद नहीं करना चाहती। (यह "समान अंतिम तत्वों की अनदेखी" मनमाना पदों में विलोपन और हकलाहट को प्राप्त करने का मानक तरीका है। यह मनमाना सम्मिलन को निषिद्ध करता है, जबकि अंत में थोड़ा सा जोड़कर अनुमति देता है, हालांकि थोड़ा मुश्किल ...)

मैंने इस ब्रेकडाउन को शामिल किया है, भले ही यह पूरी तरह से काम नहीं करता है, अगर कोई और इसे "बचाव" कर सकता है, तो - और क्योंकि मैं इसे अपने अनुमानी समाधान में उपयोग करता हूं, नीचे।

(बेशक, यदि आप इस तरह एक ब्रेकडाउन प्राप्त कर सकते हैं जो वास्तव में आपकी दूरी को परिभाषित करता है, तो आपको केवल संस्मरण जोड़ने की आवश्यकता होगी, और आपके पास एक समाधान होगा। हालांकि, क्योंकि आप सिर्फ उपसर्ग के साथ काम नहीं कर रहे हैं, मैं डॉन ' टी आपको लगता है कि आप अपने संस्मरण के लिए सिर्फ अनुक्रमित का उपयोग कर सकते हैं, आपको प्रत्येक कॉल के लिए वास्तविक, संशोधित तारों को संग्रहीत करना पड़ सकता है, जो कि आपके तार पर्याप्त आकार के होते हैं।)

एक हेयूरिस्टिक समाधान की ओर कदम

एक और दृष्टिकोण, जिसे समझना आसान हो सकता है, और जो काफी कम जगह का उपयोग कर सकता है, वह है ए कम से कम "एडिट पाथ" की खोज अपने पहले स्ट्रिंग से दूसरे सेकंड में, एल्गोरिथ्म (मूल रूप से, सर्वश्रेष्ठ-) का उपयोग करके पहली शाखा-और-बाउंड)। खोज स्थान को सीधे आपके संपादन कार्यों द्वारा परिभाषित किया जाएगा। अब, एक बड़ी स्ट्रिंग के लिए, आप करेंगेAएक बड़ा पड़ोस प्राप्त करें, जैसा कि आप किसी भी चरित्र को हटा सकते हैं (आपको प्रत्येक संभावित विलोपन के लिए पड़ोसी दे सकते हैं), या किसी भी चरित्र को दोहरा सकते हैं (फिर से, आपको पड़ोसियों की एक रैखिक संख्या दे सकते हैं), साथ ही साथ किसी भी चरित्र को जोड़ सकते हैं, जो कि अंत में होगा। आपको वर्णमाला के आकार के दोगुने के बराबर पड़ोसी देते हैं। (बस आशा है कि आप पूर्ण यूनिकोड का उपयोग नहीं कर रहे हैं ;-) इतने बड़े धूमधाम के साथ, आप एक द्विदिश , या कुछ रिश्तेदारA का उपयोग करके काफी गति प्राप्त कर सकते हैं ।

यह सुनिश्चित करने के काम करते हैं, आप अपने लक्ष्य के लिए एक कम शेष दूरी के लिए बाध्य नहीं करनी होंगी। मुझे यकीन नहीं है कि अगर यहां एक स्पष्ट विकल्प है, लेकिन आप जो कर सकते हैं वह एक गतिशील प्रोग्रामिंग समाधान को लागू करता है जो मैंने ऊपर दिए गए पुनरावर्ती अपघटन के आधार पर किया है (यदि आपके तार बहुत लंबे हैं तो संभव अंतरिक्ष मुद्दों के साथ फिर से)। कि अपघटन बिल्कुल अपनी दूरी की गणना नहीं करता है, यह है एक कम बाध्य होने के लिए (क्योंकि यह अधिक अनुमोदक है) की गारंटी, उस में एक अनुमानी तरीके से कार्य करता है जिसका अर्थ है । (यह कितना तंग होगा, मुझे नहीं पता, लेकिन यह सही होगा।) बेशक, आपके बाध्य फ़ंक्शन का संस्मरण आपके दौरान बाध्य की सभी गणनाओं में साझा किया जा सकता हैAAADaud। (एक समय- / स्पेस-ट्रेडऑफ़।)

इसलिए…

मेरे प्रस्तावित समाधान की दक्षता आपके स्ट्रिंग्स की लंबाई (1) और आपके वर्णमाला के आकार पर (1) बहुत कम दिखती है। यदि न तो बहुत बड़ा है, तो यह काम कर सकता है। अर्थात्:

  • मेरी पुनरावर्ती अपघटन और गतिशील प्रोग्रामिंग (उदाहरण के लिए, एक ज्ञापन, पुनरावर्ती फ़ंक्शन का उपयोग करके) का उपयोग करके अपनी दूरी के निचले हिस्से को लागू करें।
  • लागू (या द्विदिश "चाल" राज्य के अंतरिक्ष में, और गतिशील प्रोग्रामिंग आधारित कम बाध्य के रूप में अपने संचालन संपादित के साथ)।AA

मैं वास्तव में कोई भी गारंटी नहीं दे सकता कि यह कितना कुशल होगा, लेकिन यह सही होना चाहिए, और यह संभवतः एक जानवर-बल समाधान की तुलना में बहुत बेहतर होगा।

अगर और कुछ नहीं, मुझे आशा है कि यह आपको आगे की जांच के लिए कुछ विचार देगा।


0

कुछ संबंधित, अच्छी तरह से परिभाषित समस्या अनुक्रम संरेखण की समस्या होगी । यह अलग है क्योंकि यह दोहराव के संचालन का उपयोग नहीं करता है। परिभाषित संचालन हैं: चरित्र का सम्मिलन, चरित्र का विलोपन, चरित्र का परिवर्तन। इस समस्या को हल करने के लिए लोकप्रिय एल्गोरिथ्म है नीडलमैन-वन्सच


मैं यह जानता हूं, लेकिन मैं वास्तव में परिभाषित चालों के एक सेट के साथ काम करना चाहता हूं। एकमात्र तरीका जो मैंने इसे करने के लिए पाया है, वह एक जानवर-बल पुनरावर्ती एल्गोरिथ्म के साथ है। बहुत अच्छा नहीं है और शब्दों के आकार में वृद्धि होने पर वह कम्प्यूटेशनल गहन हो सकता है।
cz3rk

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.