Präfixsummen im veränderlichen 2D-Array


8

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.k,l

i=0k1j=0l1M[i][j]?
O(n2)O(1)O(n2)

Wir können einen Quad-Baum erstellen M. Die Vorverarbeitung benötigt O(n2log(n)) . Auf diese Weise können wir Abfragen in O(nlog(n)) und Aktualisierungen in O(log(n)) .

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 O(nϵ) .

Bearbeiten: Für einige weitere Informationen, obwohl ich denke, dass das Problem auch ohne diese weitere Einschränkung interessant ist, erwarte ich ungefähr O(n3) Abfragen und über O(n2) Updates. Das ideale Ziel ist es, die volle Laufzeit auf ungefähr O(n3+ϵ) . Daher wäre für mich auch eine Situation interessant, in der ein Update O(nlog(n)) während eine Abfrage O(log(n)) .


1
Mit einem 2D-Fenwick-Baum (auch bekannt als BIT-Baum) können Sie sowohl Aktualisierungen als auch Abfragen in . Hier gibt es eine Seite, die es beschreibt: geeksforgeeks.org/… . Haftungsausschluss: Ich habe nicht vollständig verstanden, wie dies selbst funktioniert. O(logn)
j_random_hacker

Antworten:


3

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 Summenlgn2m12mn2m

i=k02m(k0+1)2m1j=0l1M[i,j]

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,l2mn/2mk0

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,k1]lgn2m2mO(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]2m2mO(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 .2mn/2mO(n)O(n2(1+1/2+1/4+))=O(n2)

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.