Algorithmus zum Abgleichen von Zahlen mit einer minimalen Anzahl von Zügen

11

Dies ist eine Art Frage zur Bearbeitungsentfernung und sehr einfach. Ich bin in diesem Bereich einfach ziemlich hirntot und kann es bisher nicht herausfinden.


Bei einer Reihe von Zahlen, z

[3, 1, 1, 1]

Wie würde man am effizientesten alle Zahlen in dieselbe Zahl verwandeln, mit der minimalen Anzahl von "Zügen"? Mit "Verschieben" ist das Hinzufügen oder Entfernen einer Zahl zu einer Zahl gemeint.

Im obigen Beispiel wären die effizientesten Schritte:

[1, 1, 1, 1]

Dies würde 2 Züge erfordern und die erste Zahl zweimal reduzieren.

Ich kann nicht herausfinden, wie ich das am besten herausfinden kann, wenn man viel größere Arrays mit Hunderten von Zahlen betrachtet.

Ich habe ursprünglich versucht, die gerundete Durchschnittszahl (Summe aller geteilt durch die Länge) zu berechnen und sie dann auf den berechneten Durchschnitt zu reduzieren, aber das obige Beispiel hat dies gebrochen und erfordert 4 Züge anstelle von 2.

Ich könnte mir vorstellen:

  1. Der Durchschnitt,
  2. Der Modus,
  3. Der Median

und ermitteln Sie den Bearbeitungsabstand für jeden von ihnen, indem Sie den Mindestabstand auswählen. Ich bin mir jedoch nicht sicher, ob dies in jedem Fall richtig wäre. Wie kann ich es wissen?

drei
quelle
Wenn die Domain begrenzt ist, können Sie alle Möglichkeiten von min bis max ausprobieren. Andernfalls können Sie versuchen, den Modus oder den Median zu verwenden.
Bartosz Przybylski
Danke @Bartek. Es scheint, als wäre es enorm ineffizient, alle Möglichkeiten auszuprobieren, wenn man sich mit Hunderten oder Tausenden von Zahlen befasst. Ich werde Modus / Median überprüfen. Aber sind diese sicher, dass sie in jedem Fall zu Ergebnissen führen? Das ist meine Hauptfrage. Ich suche einen bestimmten, effizienten Algorithmus.
Drei
Muss die Zahl in der Zahlenmenge enthalten sein oder kann es sich um eine beliebige Ganzzahl handeln?
TCSGrad
@TCSGrad Es kann eine beliebige Ganzzahl sein, aber natürlich möchten Sie eine auswählen, die zwischen der minimalen und der maximalen Zahl liegt. In diesem Fall entweder 1, 2 oder 3.
drei

Antworten:

10

Die Antwort ist, den Median zu nehmen. Eine der Eigenschaften des Medians ist, dass er den L1-Abstand zu jedem Element minimiert . (Um den Wikipedia-Artikel zu verstehen, nehmen Sie die Wahrscheinlichkeitsverteilung als gleichmäßige Verteilung über Ihre ursprüngliche Zahlenreihe.)

Dies ist der Algorithmus, der das Problem löst (ursprünglich von dc2 geschrieben ):

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
mhum
quelle
Ja, das hat es geschafft. Komisch, wie das funktioniert. Scheint nicht so, als würde der Median es tun, aber hey. Danke vielmals.
Drei
1
Siehe meine Antwort für einen Beweis.
Yuval Filmus
@ dc2: Du kannst nicht "sicher gehen", indem du es "ausprobierst".
Raphael
1
Nur zur Anmerkung: Sie können die mittlere O (n)
-Zeit
1
@Raphael Ist es in Ordnung, den OP-Code in eine andere Antwort aufzunehmen, ohne auf OP zu verweisen?
thefourtheye
10

Wie TCSGrad erwähnt, suchen Sie bei einer Liste von ganzen Zahlen nach der ganzen Zahl m, die δ ( m ) = n i = 1 | minimiert m - x i | . Es ist lehrreich, δ ( m + 1 ) - δ ( m ) zu berechnen : δ ( m + 1 ) - δ ( m ) =x1,,xnm

δ(m)=i=1n|mxi|.
δ(m+1)δ(m) Wennmvon-nach+∞ geht, ist die Größeδ(m+1)-δ(m)
δ(m+1)δ(m)=i=1n{+1mxi1m<xi=#{i:mxi}#{i:m<xi}.
m+δ(m+1)δ(m)geht von nach n . Außerdem werden die Werte nur an den Punkten x 1 , , x n umgeschaltet . Es ist nicht schwer zu überprüfen, ob ein optimaler Wert von m der minimale Punkt ist, an dem δ ( m + 1 ) - δ ( m ) 0 ist . Dieser Minimalpunkt ist einer der x i , daher beträgt der Bearbeitungsabstand min ( δ ( x 1 ) , , δ ( x)nnx1,,xnmδ(m+1)δ(m)0xi .min(δ(x1),,δ(xn))

xinmxiδ(m+1)δ(m)=1δ(m)δ(m1)=1mnxiδxi

Yuval Filmus
quelle
Sie haben es vielleicht verpasst, aber diese Antwort beweist (fast), dass der Median die optimale Wahl ist.
Yuval Filmus
1
Ihre Antwort war ausgezeichnet und ich habe sie positiv bewertet. Leider für mich ein wenig zu exzellent, da ich mich in der wissenschaftlichen Notation nicht so gut auskenne und das meiste davon als gerendert zurücklasse. Das ist mein Problem, nicht deins.
Drei
5

Das Problem kann als LP-Problem formuliert werden:

n[a1,a2...an]

min|aix|

x

xx

EDIT : Wie in den Kommentaren ausgeführt, sollte die Zielfunktion Summe über absolute Differenzen sein. Um es wieder in eine Standard-LP umzuwandeln, können wir die LP wie folgt umschreiben:

minai

vorbehaltlich:

aiaix i
aiaix i
ai,x0 i

ai=|aix| ix

TCSGrad
quelle
Wenn ich das also richtig verstehe, wäre in meinem Beispiel x 1 - 3, und ich würde den Bearbeitungsabstand von 1, 2 und 3 finden und dann eine Minute damit machen?
Drei
xx
Warum sind die Einschränkungen notwendig?
Raphael