Komplexität beim Anwenden einer Permutation an Ort und Stelle


27

Zu meiner Überraschung konnte ich keine Artikel zu diesem Thema finden - ich habe wahrscheinlich nach den falschen Stichwörtern gesucht.

Wir haben also eine Reihe von Dingen und eine Funktion für ihre Indizes. ist eine Permutation.ff

Wie ordnen wir das Array nach wobei Speicher und Laufzeit so nahe wie möglich an und ?fO(1)O(n)

Gibt es zusätzliche Bedingungen, wenn diese Aufgabe einfacher wird? Wenn wir beispielsweise explizit wissen, dass eine Funktion die Umkehrung von ?gf

Ich kenne einen Algorithmus, der Zyklen folgt und einen Zyklus für jeden Index durchläuft, um zu prüfen, ob er der kleinste in seinem Zyklus ist, aber auch hier hat er die schlechteste -Laufzeit, obwohl er sich im Durchschnitt besser zu verhalten scheint ...O(n2)


Eine einfache Beobachtung: Wenn nicht nur das Array der Elemente, sondern auch das Array, das die Funktion f enthält, beschreibbar ist, ist es einfach, die Aufgabe in O (n) Zeit unter Verwendung von O (1) Ganzzahlregistern (jeweils mit der Länge O ( log n) bits) und zusätzlichen Platz für einen Eintrag, indem Sie einfach jedem Zyklus folgen. Dies funktioniert jedoch nicht, wenn die Funktion f in einem Nur-Lese-Speicher angegeben wird (oder f nur als Orakel angegeben wird), was meiner Meinung nach eine Annahme in dieser Frage ist.
Tsuyoshi Ito

23
Fich et al. 1995 : Zeit, Raum. Es werden auch einige Sonderfälle besprochen. O(nlogn)O(logn)
Jukka Suomela

Ja, ich gehe davon aus, dass wir f als Orakel haben.
jkff

3
@JukkaSuomela, das solltest du zu einer Antwort machen. Wenn man bedenkt, dass eine willkürliche Permutation ist, ergibt ein einfaches Entropieargument Raum und / oder Zeit, und ich wäre überrascht, wenn Sie Zeit und Raum besser als könnten . fO(nlogn)O(nlogn)
User834

Antworten:


4

Option 0: Permuting In Place (1995) von Faith E. Fich, J. Ian Munro und Patricio V. Poblete Zeit Raum.O(nlogn)O(log2n)

Option 1: Betrügen Sie, indem Sie Ihre Permutation auf eine prägnante Datenstruktur komprimieren (siehe Munro http://www.itu.dk/people/ssrao/icalp03-a.pdf) .

Option 2: Speichern Sie die Dauerwelle mit einer Prime-Cycle-Dekomposition und verwenden Sie diesen zusätzlichen Platz, um http://oeis.org/A186202 zu betrügen

Option 3: Verfolgen Sie den größten Index jedes manipulierten Zyklus. Verwenden Sie für jede Iteration den größten unsichtbaren Index, um alles in seinem Zyklus um eins zu verschieben. Wenn es auf einen angezeigten Index stößt, wird die gesamte Arbeit rückgängig gemacht, da der Zyklus bereits manipuliert wurde. Zeit, Raum.O(n2)O(#cycleslogn)

Option 4: Verfolgen Sie den größten Index jedes manipulierten Zyklus, jedoch nur in Chargen mit unterschiedlichen Zykluslängen. Verwenden Sie für jede Iteration den größten unsichtbaren Index, um alles in seinem Zyklus um eins zu verschieben. Wenn es auf einen sichtbaren Index stößt, wird die gesamte Arbeit rückgängig gemacht, da der Zyklus bereits manipuliert wurde. Zeit, Leerzeichen.O(n2distinct_cycle_lengths)O((#cycles_with_same_size)logn)

Option 5: Aus demselben Papier von Munro wie Option 0, für den Zyklus von drehen, wenn der größte Index in diesem Zyklus ist. Zeit und Raum.i=1..np(i)iO(n2)O(logn)


Die Komprimierungsmethoden sparen im Allgemeinen möglicherweise keinen Speicherplatz: Der schlechteste Speicherplatz für eine Permutation ist . 3, 4 und 5 scheinen im Allgemeinen so schlecht zu sein, wie es entweder die OP bereits kennt oder die Lösung von Fich, Munro und Poblete. Und auf diese Lösung wurde bereits von @Jukkanlogn
Sasho Nikolov am

# 5 belegt weniger Platz als # 0 um einen log (n) Faktor.
Chad Brewbaker

1

Wenn Sie die Zyklusdarstellung der Permutation verwenden, benötigen Sie 1 zusätzliches Array-Element, um das aktuell permutierte Element zu speichern, und Sie können die Zyklen in schlechteren O (N) -Operationen durchlaufen.


2
jkff hat bereits gesagt, dass er den Algorithmus für die Zyklusverfolgung kennt, und möchte daher eindeutig, dass die Permutation selbst wie eine Black Box behandelt wird. Wie er in der Frage ausführt, könnte die Konvertierung von einer (fast) Blackbox in eine Zyklusdarstellung 0 (n ^ 2) Zeit in Anspruch nehmen.
Joshua Grochow

Black Box p (i) ist in Ordnung. Du gehst einfach den Zyklus durch, bis du zu i zurückkommst. Das Problem besteht in der Komplexität von Kolomogorov, die Liste der aktualisierten Elemente zu speichern, damit Sie sie nicht mehrmals durchlaufen. Munro hat da Grenzen. itu.dk/people/ssrao/icalp03-a.pdf
Chad Brewbaker

-2

Jede Permutation von N Elementen kann unter Verwendung von N-1 oder weniger Austauschen in jede andere Permutation konvertiert werden. Im schlimmsten Fall sind für diese Methode möglicherweise O (n ^ 2) -Aufrufe an Ihr Orakel F () erforderlich. Beginnen Sie von der niedrigsten Position. Sei x die Position, die wir gerade tauschen.

Wenn F (x)> = x, vertauschen Sie die Positionen x und F (x). Ansonsten müssen wir herausfinden, wo sich das Element, das sich an Position F (x) befand, derzeit in der Liste befindet. Wir können dies mit der folgenden Iteration tun. Sei y = F (x). Machen Sie, bis y> = x: y = F (y): End Do. Tauschen Sie nun die Positionen x und y aus.


3
OP hat bereits gesagt, dass er weiß, wie man es in -Zeit macht. O(n2)
Jukka Suomela

Es tut uns leid. Ich bin neu in dieser Gruppe. Ich mag diese Methode wegen ihrer Einfachheit. Manchmal finde ich Einfachheit schneller als Effizienz. Ich kenne eine andere Methode, die O (n) Schritte erfordert, aber O (nlogn) Raum.
Russell Easterly

1
Russell, selbst wenn er O (n log n) zuweist und auf Null setzt, ist O (n log n) bereits, meinten Sie in die andere Richtung?
jkff

Sie haben nicht wirklich allokieren und keinen Platz. Die Grundidee ist, wenn F (x)> x ist, dass wir uns merken müssen, wo wir den Gegenstand an Position x setzen. Für ein wirklich großes n würde ich eine Datenbank verwenden und nur aufzeichnen, wo das Element x verschoben wird. Der Datensatz könnte gelöscht werden, wenn x seinen endgültigen Speicherort erreicht.
Russell Easterly

1
Aber warum sagst du dann, dass es O (n log n) Speicherplatz benötigt?
jkff

-2

Diese Methode verwendet die Umkehrung von F und erfordert n Speicherbits. Wenn x die Position eines Elements im ursprünglichen Array ist, sei G (x) die Position des Elements im sortierten Array. Sei B ein n-Bit-Array. Setzen Sie alle n Bits von B auf 0.

FOR x = 1 bis n-1: WENN B (x) == 0 DANN: y = G (x): BIS x == y: Vertausche die Positionen x und y: B (y) = 1: y = G ( y): LOOP: ENDIF: NEXT X

Bei dieser Methode wird der aktuell an Position x befindliche Artikel an die endgültige Position des Artikels verschoben. Die innere Schleife endet, wenn der richtige Gegenstand in Position x getauscht wird. Da bei jedem Tausch mindestens ein Objekt an die Endposition des Objekts verschoben wird, kann die innere Do-Schleife während des Laufs nicht mehr als n-1-mal ausgeführt werden. Ich denke, diese Methode ist O (n) Zeit und Raum.


2
Hast du dir die Zeitung angesehen? Die beiden Algorithmen, die Sie hier auflisten, sind die beiden "offensichtlichen". Das Papier hat weniger offensichtliche mit unterschiedlichen Zeit-Raum-Kompromissen, insbesondere viel weniger Raum.
Yuval Filmus
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.