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 .
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.
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.
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?
Nehmen Sie ein RAM-Modell mit einheitlichen Kosten an und nehmen Sie an, dass die Elemente Platz einnehmen und der Vergleich zwischen ihnen .
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.
quelle
Antworten:
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)
quelle