न्यूनतम चाल के साथ संख्याओं के मिलान के लिए एल्गोरिदम


11

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


संख्याओं की एक श्रृंखला को देखते हुए, जैसे

[3, 1, 1, 1]

"चाल" की न्यूनतम संख्या के साथ कोई भी सबसे अधिक कुशलता से सभी संख्याओं को एक ही संख्या में कैसे बदल देगा? "चाल" से तात्पर्य किसी संख्या से किसी को जोड़ना या हटाना है।

उपरोक्त उदाहरण में, सबसे कुशल चाल होगी:

[1, 1, 1, 1]

इसके लिए 2 चालों की आवश्यकता होगी, पहली संख्या को दो बार कम करना।

मैं यह पता लगाने का सबसे अच्छा तरीका नहीं समझ सकता, सैकड़ों की संख्या में बहुत बड़ी सरणियाँ दी।

मैंने मूल रूप से गोल औसत संख्या (लंबाई से विभाजित सभी की राशि) की गणना करने की कोशिश की, और फिर उन्हें गणना औसत तक कम किया, लेकिन उपरोक्त उदाहरण ने इसे तोड़ दिया, जिसमें 2 के बजाय 4 चाल की आवश्यकता थी।

मुझे लगता है मैं समझ सकता हूं:

  1. औसत,
  2. साधन,
  3. मध्यस्थ

और उनमें से प्रत्येक की संपादित दूरी प्राप्त करें, न्यूनतम दूरी चुनें। हालाँकि, मुझे यकीन नहीं है कि यह हर एक उदाहरण में सही होगा। मुझे कैसे पता चलेगा?


यदि डोमेन सीमित है तो आप न्यूनतम से लेकर अधिकतम तक सभी संभावनाओं को आज़मा सकते हैं। अन्यथा आप मोड या माध्यिका का उपयोग करने का प्रयास कर सकते हैं।
बार्टोज़ प्रेज़ीबेल्स्की

धन्यवाद @ बारटेक लगता है कि अगर सैकड़ों या हजारों की संख्या में काम किया जाए, तो सभी संभावनाओं को आजमाने में काफी अक्षमता होगी। मैं मोड / मंझला देखूंगा। लेकिन क्या ये हर उदाहरण में परिणाम उत्पन्न करने के लिए निश्चित हैं? यही मेरा मुख्य प्रश्न है। मैं एक निश्चित, कुशल एल्गोरिदम की तलाश में हूं।
dthree

क्या संख्याओं के सेट में संख्या होनी चाहिए, या क्या यह कोई पूर्णांक हो सकता है?
TCSGrad

@TCSGrad यह कोई भी पूर्णांक हो सकता है, लेकिन जाहिर है कि आप उस एक को चुनना चाहेंगे जो न्यूनतम और अधिकतम संख्या के बीच है। इस मामले में, 1, 2, या 3.
dthree

जवाबों:


10

जवाब मंझला लेना है। माध्यिका के गुणों में से एक यह है कि यह प्रत्येक तत्व के लिए एल 1 दूरी को कम करता है। (विकिपीडिया लेख की समझ बनाने के लिए, संभावना वितरण को अपनी मूल संख्याओं की समान वितरण पर ले जाएँ)।

यह एल्गोरिथ्म है जो समस्या को हल करता है (मूल रूप से dc2 द्वारा लिखित ):

function median(arr) {
  arr.sort(function(a, b) { return a - b; });
  var half = floor(arr.length/2);
  if ( arr.length % 2 ) {
    return arr[half];
  } else {
    return (arr[half-1] + arr[half]) / 2.0;
  }
}

function minl1(arr) {
  var moves = 0;
  var mdn = median(arr);
  for ( var i = 0; i < arr.length; ++i ) {
    moves += Math.abs(mdn - arr[i]);
  }
  return moves;
}

minl1([3, 1, 1, 1]); // -> 2

हाँ, यह किया है। मजेदार है कि कैसे काम करता है। ऐसा नहीं लगता है कि मंझला ऐसा करेगा, लेकिन हे। बहुत बहुत धन्यवाद।
dthree

1
प्रमाण के लिए मेरा उत्तर देखें।
युवल फिल्मस

@ dc2: आप "इसे आज़माकर" सुनिश्चित नहीं कर सकते।
राफेल

1
बस ध्यान दें: आप माध्य O (n) समय की गणना कर सकते हैं
बार्टोज़ प्रेज़ीबेल्स्की

1
@ राफेल क्या ओपी के संदर्भ के साथ ओपी के कोड को किसी अन्य उत्तर में शामिल करना ठीक है?
Thefourtheye

10

TCSGrad उल्लेख के रूप में, पूर्णांकों की एक सूची दी , आप पूर्णांक के लिए देख रहे मीटर को न्यूनतम δ ( मीटर ) = n Σ मैं = 1 | m - x i | यह गणना करने के लिए शिक्षाप्रद है δ ( मीटर + 1 ) - δ ( मीटर ) : δ ( मीटर + 1 ) - δ ( मीटर ) =x1,,xn

δ()=Σमैं=1n|-एक्समैं|
δ(+1)-δ() के रूप मेंमीटरसे चला जाता है-को+, मात्राδ(मीटर+1)-δ(मीटर)
δ(+1)-δ()=Σमैं=1n{+1एक्समैं-1<एक्समैं=#{मैं:एक्समैं}-#{मैं:<एक्समैं}
-+δ(+1)-δ()से जाता है से n । इसके अलावा, यह केवल x 1 , , x n के मानों को बदलता है । यह जांचने के लिए कि का एक इष्टतम मूल्य कठिन नहीं है मीटर , जिस पर कम से कम बिंदु है δ ( मीटर + 1 ) - δ ( मीटर ) 0 । यह कम से कम बिंदु में से एक है एक्स मैं , तो संपादन दूरी है मिनट ( δ ( एक्स 1 ) , ... , δ ( एक्स-nnएक्स1,...,एक्सnδ(+1)-δ()0एक्समैंमिनट(δ(एक्स1),...,δ(एक्सn))

एक्समैंnएक्समैंδ(+1)-δ()=1δ()-δ(-1)=-1nएक्समैंδएक्समैं


आप इसे याद कर सकते हैं, लेकिन यह उत्तर (लगभग) यह साबित करता है कि मंझला इष्टतम विकल्प है।
युवल फिल्मस '

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

5

समस्या को एलपी समस्या के रूप में तैयार किया जा सकता है:

n[1,2n]

मिनटΣ|मैं-एक्स|

एक्स

एक्सएक्स

संपादित करें : जैसा कि टिप्पणियों में बताया गया है, उद्देश्य फ़ंक्शन को पूर्ण अंतर से अधिक होना चाहिए। इसे मानक एलपी में बदलने के लिए, हम एलपी को फिर से लिख सकते हैं:

मिनटΣमैं'

का विषय है:

मैं'मैं-एक्स मैं
मैं'मैं-एक्स मैं
मैं',एक्स'0 मैं

मैं'=|मैं-एक्स| मैंएक्स


इसलिए अगर मैं इसे सही ढंग से समझूं, तो मेरे उदाहरण में, x 1 - 3 होगा, और इसलिए मुझे 1, 2 और 3 की संपादित दूरी मिलेगी, और फिर उस पर एक मिनट करना होगा?
dthree

एक्सएक्स

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