Inversionspaare zählen

14

Eine klassische Anwendung von Teilen und Erobern besteht darin, das folgende Problem zu lösen:

Zählen Sie für ein Array verschiedener, vergleichbarer Elemente die Anzahl der Inversionspaare im Array: Paare so dass und .a[1n](i,j)a[i]>a[j]i<j

Ein Ansatz, um dies zu erreichen, besteht darin, eine Zusammenführungssortierung durchzuführen, aber auch die Anzahl der Inversionspaare in den Unterproblemen zu zählen. Während des Zusammenführungsschritts zählen wir die Anzahl der Inversionspaare, die sich über die (zwei) Unterprobleme erstrecken, und addieren die Anzahl der Unterprobleme.

Während dies gut ist und einen -Zeitalgorithmus liefert, bringt dies das Array durcheinander.O(nlogn)

Wenn wir die zusätzliche Einschränkung haben, dass das Array schreibgeschützt ist, können wir eine Kopie erstellen und mit der Kopie umgehen oder eine zusätzliche Datenstruktur wie einen binären Baum mit ausgeglichener Ordnungsstatistik verwenden, um die Zählung durchzuführen. Beide verwenden Raum.Θ(n)

Die aktuelle Frage ist, den Speicherplatz zu verbessern, ohne die Laufzeit zu beeinträchtigen. dh

Gibt es einen -Zeitalgorithmus zum Zählen der Anzahl der Inversionspaare, der in einem Nur-Lese-Array arbeitet und sublinearen (dh ) Raum verwendet?O(nlogn)o(n)

Nehmen Sie ein RAM-Modell mit einheitlichen Kosten an und nehmen Sie an, dass die Elemente Platz einnehmen und der Vergleich zwischen ihnen .O(1)O(1)

Eine Referenz wird reichen, aber eine Erklärung wird besser sein :-)

Ich habe versucht, im Internet zu suchen, konnte jedoch keine positive / negative Antwort darauf finden. Ich nehme an, das ist nur eine Kuriosität.

Aryabhata
quelle
3
Chan und Pătraşcu geben einen Zeitalgorithmus an, aber soweit ich das Papier überfliegen kann, benötigen sie Speicherplatz. o(nlogn)Ω(n)
Raphael
2
Darüber hinaus haben Ajtai et al. beweisen, dass jeder (exakte) Zeit-Streaming-Algorithmus Speicherplatz benötigt. Es scheint jedoch Annäherungen zu geben, die Ihren Kriterien entsprechen. O(n)Ω(n)
Raphael
1
@ Raffael: Danke! Wenn Sie keine Antwort erhalten, ist Ihr Kommentar die beste Antwort, die Sie bisher erhalten haben.
Aryabhata
Übrigens bin ich ein wenig verwirrt über die untere Grenze von Ajtai et al. Satz 8 sagt "irgendeinen Algorithmus", aber die untere Schranke scheint mir gegen Single-Pass-Exact-Streaming-Algorithmen zu sein, ein sehr eingeschränktes Modell
Sasho Nikolov
@SashoNikolov: Ich denke, dass sie ihr Modell global auf Streaming-Algorithmen setzen, also wäre "any" auf diese beschränkt. Ich hoffe, dass meine Folgerung - jeder exakte -Zeitalgorithmus - korrekt ist, das heißt, dass jeder lineare Zeitalgorithmus als Streaming-Algorithmus mit konstant vielen Durchläufen ausgedrückt werden kann. Wir werden sehen . O(n)
Raphael

Antworten:

3

Hier ist Raffaels Antwort:

Chan und Pătraşcu geben einen Zeitalgorithmus an, aber soweit ich das Papier überfliegen kann, benötigen sie Ω ( n ) Platz. Darüber hinaus haben Ajtai et al. beweisen, dass jeder (exakte) O ( n ) Zeit-Streaming-Algorithmus Ω ( n ) Raum benötigt. Es scheint jedoch Annäherungen zu geben, die Ihren Kriterien entsprechen.o(nlogn)Ω(n)O(n)Ω(n)

Yuval Filmus
quelle
Vielen Dank für die Antwort. Ich werde es aber noch etwas länger machen. Der Verkehr scheint zuzunehmen.
Aryabhata