def f(l):z=zip(l,range(len(l)));print map(sorted(z).index,z)
Probieren Sie es online!
Verwendet die Null-Indizierung.
Ein schneller Algorithmus mit einer einfachen Idee. Wenn wir stattdessen die Eingabeliste permutieren müssen sie so nah machen zu (1,2,...,n) wie möglich, sollten wir einfach irgendwie es, wie weiter unten unter Beweis gestellt. Da wir stattdessen sind Permutation (1,2,...,n) , wählen wir die Permutation , dass die auf die gleiche Weise wie die Eingangsliste geordnet, wie in meiner Herausforderung eine Ordnung Imitate ( mit Ausnahme der Eingabe kann wiederholt). (Bearbeiten: Meilen wies auf diese identische Herausforderung hin , wo Dennis die gleiche Antwort hat .)
Claim: eine Permutation der Liste l , die zu seiner Entfernung minimiert (1,2,...,n) ist l sortiert.
Beweis: Betrachte eine andere Permutation l′ von l . Wir werden beweisen , es kann nicht besser sein als l sortiert.
Wählen Sie zwei Indizes i,j , die l′ nicht in der richtigen Reihenfolge hat, d. H. i<j aber l′i>l′j . Wir zeigen , dass sie Swapping nicht erhöhen kann den Abstand zu (1,2,...,n) . Wir stellen fest, dass Swap den Beitrag dieser beiden Elemente wie folgt ändert:
| l′ich- ich | + | l′j- j | → | l′ich- j | + | l′j- ich | .
Hier ist eine gute Möglichkeit zu zeigen, dass dies keine Steigerung sein kann. Stellen Sie sich zwei Personen vor, die auf einer Zahlenlinie gehen, eine von l′ich nach ich und die andere von l′j nach j . Die Gesamtstrecke, die sie zurücklegen, ist der Ausdruck auf der linken Seite. Da i < j aber l′ich> l′j , wechseln sie, wer auf der Zahlenlinie höher ist, was bedeutet, dass sie irgendwann während ihrer Spaziergänge überqueren müssen, nennen es p . Aber wenn sie p erreichenpDann konnten sie ihre Ziele tauschen und die gleiche Gesamtstrecke zurücklegen. Und dann kann es nicht schlimmer sein, dass sie von Anfang an zu ihren vertauschten Zielen gelaufen sind, anstatt p als Wegpunkt zu verwenden, der die Gesamtentfernung auf der rechten Seite angibt.
So, Sortier- zwei out-of-order - Elemente in l′ macht ihre Entfernung zu ( 1 , 2 , . . . , N ) kleiner oder gleich ist . Wenn Sie diesen Vorgang wiederholen, wird l schließlich sortiert . So l sortiert ist mindestens so gut wie l′ für jede Wahl von l′ , das heißt , es als optimal oder für eine optimale gebunden.
Beachten Sie, dass die einzige Eigenschaft von ( 1 , 2 , . . . , N ) , dass ich verwendet wird , ist , dass es sortiert, damit der gleiche Algorithmus jede gegebene Liste permutieren funktionieren würde, seinen Abstand zu jeder festen Liste zu minimieren.
Im Code besteht der einzige Zweck z=zip(l,range(len(l)))
darin, die Eingabeelemente zu unterscheiden, dh Bindungen zu vermeiden, während die gleichen Vergleiche zwischen ungleichen Elementen beibehalten werden. Wenn die Eingabe garantiert keine Wiederholungen hat, könnten wir diese entfernen und nur haben lambda l:map(sorted(l).index,l)
.
v
, größer als sein werden0
? Oder zumindest nicht0
?