Effizientes Einfügen in die Liste bei minimaler Anzahl von Inversionen


15

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.


Denkanstoß: Die naive Herangehensweise wäre: Nimm ein Element aus s, vergleiche es mit jedem Element in u von links nach rechts, erhöhe es, wenn es eine Inversion ist, und übertrage 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 läuft in O (| s | * | u |) mit Leerzeichen = O (| u |)
trevore

1
Die Überprüfung aller maximal ansteigenden Teilsequenzen kann irgendwohin führen.
Raphael

Antworten:


2

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. sWenn 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σ1s1s2s1β1s1σ2β2s2 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β1s1s2-β1+β2-σ2+σ1-1

Es ist nicht schwer zu erkennen, dass Elemente von unabhängig voneinander eingefügt werden können. sDa 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 .ssss

kT(|s|,|u|)=T(|s|/2,|u|-k)+T(|s|/2,k)+|u|+|s||s|sT(|s|,|u|)=Ö(|s|Log|s|+|u|Log|s|)

|s|us|u|su


Vielen Dank für die Ausarbeitung. Das ist genau die Lösung, die ich gemeint habe.
Trevore

1

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.


Ich verstehe das nicht. s ist eine Eingabe. Sie können nicht davon ausgehen, dass s in sortierter Reihenfolge ist. Ihr Algorithmus muss für alle möglichen Werte von s funktionieren.
DW

Ja, aber in jeder optimalen Lösung werden die Elemente von s im neuen Array immer aufsteigend sortiert. Beachten Sie den Schritt "Sortieren s." Siehe obiges Beispiel. Was ich bisher bewiesen habe ist, dass: für a, b in s, a <b wenn a optimal in u platziert ist, dann ist der optimale Ort für b rechts von a.
Trevore
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.