Angenommen, ich habe ein 2D-Array M[n][n]
von Ganzzahlen (tatsächlich ist Binär in Ordnung, aber ich bezweifle, dass es wichtig ist). Ich interessiere mich für wiederholte Abfragen der Form: Wenn ein Koordinatenpaar , was ist
Natürlich können alle diese Werte in \ mathcal O (n ^ 2) Zeitsumme berechnet werden , und danach nehmen Abfragen \ mathcal O (1) . Mein Array ist jedoch veränderbar, und jedes Mal, wenn ich einen Wert ändere, erfordert die offensichtliche Lösung ein \ mathcal O (n ^ 2) -Update.
Wir können einen Quad-Baum erstellen M
. Die Vorverarbeitung benötigt . Auf diese Weise können wir Abfragen in und Aktualisierungen in .
Meine Frage ist:
Können wir die Abfragen erheblich verbessern, ohne die Updates zu stark zu beeinträchtigen?
Ich bin besonders daran interessiert, sowohl die Aktualisierungs- als auch die Abfrageoperationen sublinear zu machen und insbesondere beide auf .
Bearbeiten: Für einige weitere Informationen, obwohl ich denke, dass das Problem auch ohne diese weitere Einschränkung interessant ist, erwarte ich ungefähr Abfragen und über Updates. Das ideale Ziel ist es, die volle Laufzeit auf ungefähr . Daher wäre für mich auch eine Situation interessant, in der ein Update während eine Abfrage .
quelle
Antworten:
Es gibt eine relativ einfache Lösung, bei der jede Abfrage und jedes Update in -Zeit durchgeführt werden kann. Die Datenstruktur verwendet Raum.O(log2n) O(n2)
Wir werden "Granularitäten" der Datenstruktur haben, eine für jede Potenz von zwei so dass . Die Datenstruktur für die Granularität speichert die Summenlgn 2m 1≤2m≤n 2m
für jedes . Diese Datenstruktur für die Granularität kann wiederum unter Verwendung von ausgeglichenen Bäumen (einer für jeden möglichen Wert von ) zum Speichern von Präfixsummen dargestellt werden.k0,l 2m n/2m k0
Um nun die Präfixsumme für wir das Intervall in eine Vereinigung von Intervallen der Zweierpotenzlänge auf; Es werden höchstens Intervalle benötigt. Für jedes solche Intervall mit einer Länge von wir die Datenstruktur der Granularität . Somit können Anfragen beantwortet werden , indem Sie Lookups in einen ausgeglichenen Baum, von denen jede nimmt Zeit, für eine Gesamtzeit von pro Abfrage.k,l [0,k−1] lgn 2m 2m O(logn) O(logn) O(log2n)
Aktualisierungen können auch in . Um für jede Granularität aktualisieren, aktualisieren Sie den entsprechenden ausgeglichenen Baum in der Datenstruktur der Granularität . Dies sind -Updates in -balancierten Bäumen. Jedes dieser Verfahren dauert , sodass die Gesamtzeit beträgt .O(log2n) M[i,j] 2m 2m O(logn) O(logn) O(logn) O(log2n)
Schließlich wird die Datenstruktur der Granularität enthält Bäumen, die jeweils Mitnahmen bis Raum, so dass die Gesamtplatznutzung ist .2m n/2m O(n) O(n2⋅(1+1/2+1/4+⋯))=O(n2)
quelle