Nehmen wir zwei Listen vergleichbarer Elemente an: u und s. Sei INV (u) die Anzahl der Inversionen in u.
Ich suche nach einem effizienten Algorithmus, um die Elemente von s mit einer minimalen Erhöhung von INV (u) in u einzufügen.
Grundsätzlich möchte ich Objekte in eine Liste einfügen und dabei die Reihenfolge der ersten Liste beibehalten.
Beispiel:
u = [4,6,2,9,7]
INV(u) = 3 ((4, 2), (6, 2) and (9, 7)
s = [8,3,10]
one optimal solution u' = [3, 4, 6, 2, 8, 9, 7, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (8,7))
different optimal solution u' = [3, 4, 6, 2, 9, 7, 8, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (9,8))
Wie Sie sehen, gibt es keine eindeutige optimale Lösung.
Ich würde mich über jede Art von Ideen oder Anweisungen freuen.
algorithms
sorting
Trevore
quelle
quelle
Antworten:
Dies ist eine Ausarbeitung der Antwort von Trevore. Es ist zu lang, um in einen Kommentar zu passen, und enthält die Beweise seiner Lösung (oder zumindest, wie ich es verstehe).
Sie können zeigen, dass in jeder optimalen Lösung die Elemente von geordnet erscheinen.s Wenn nicht, nimm und sie erscheinen in umgekehrter Reihenfolge in einer optimalen Lösung. Sei σ 1 die Anzahl der Elemente zwischen s 1 und s 2 , die kleiner als s 1 sind, und β 1 die Anzahl der Elemente , die größer als s 1 sind . Definieren Sie σ 2 und β 2 ähnlich für s 2 . Man beachte, dass σ 1 ≤ ists1< s2 σ1 s1 s2 s1 β1 s1 σ2 β2 s2 und β 2 ≤ β 1 . DasVertauschen von s 1 und s 2 ändert die Anzahl der Inversionen um - β 1 + β 2 - σ 2 + σ 1 - 1, was höchstens -1 ist.σ1≤ σ2 β2≤ β1 s1 s2 - β1+ β2- σ2+ σ1- 1
Es ist nicht schwer zu erkennen, dass Elemente von unabhängig voneinander eingefügt werden können.s Da sie geordnet erscheinen, "fühlen" sich die Elemente von nicht gegenseitig. Das heißt, Paare von Elementen aus s tragen nicht zur Inversionszahl bei. Fügen Sie dazu den Median von s optimal in linearer Zeit ein. Dann rekursiv, Einsatzelemente von s weniger als der Median auf der linken Seite des mittleren und Elemente größer als der Median auf der rechten Seite .s s s s
quelle
Ok, hier ist meine Lösung:
Eine Beobachtung (die ich mehr oder weniger bewiesen habe) ist, dass eine optimale Lösung immer eine sein wird, in der s aufsteigend sortiert ist. Dies führt zu einem O ((| u | + | s |) * log (| s |)) - Algorithmus.
Um die optimale Lösung für ein einzelnes Element zu finden, gehen Sie wie in meinem Kommentar beschrieben vor: Nehmen Sie ein Element aus s, vergleichen Sie es mit jedem Element in u von links nach rechts, inkrementieren Sie einen Zähler als Umkehrung und übertragen Sie die zuvor berechnete Zahl. Durchlaufen Sie dann die Liste von rechts nach links mit demselben Element und erhöhen Sie die Anzahl für jede Position.
Dies ist O (| u |).
Sortieren s.
Für das mittlere Element von s an Position m: Finden Sie die beste Position b in u (mit der Methode von oben).
Teilen Sie s bei m und u bei b und rufen Sie rekursiv mit dem linken und dem rechten Teil auf, wobei Sie die Ergebnisse mit m in der richtigen Reihenfolge verketten.
Stoppen Sie, sobald Sie oder s leer sind.
quelle