Bei einem Array natürlicher Zahlen ≤ k , wobei k eine Konstante ist, möchte ich in O ( 1 ) -Anfragen der Form antworten : "Wie oft erscheint m im Array zwischen den Indizes i und j "?
Das Array sollte in linearer Zeit vorverarbeitet werden. Insbesondere würde ich gerne wissen, ob es eine Reduzierung auf Range Minimum Query gibt.
Dies entspricht RMQ für den Fall, dass und Sie die Anzahl der Einsen innerhalb eines Intervalls abfragen möchten. So können wir nutzen es . Ich konnte meine eigene Frage wegen der SE-Grenzen nicht beantworten.
Antworten:
Da konstant ist, können wir die Anzahl jedes Elements im Bereich 0 .. m für 0 ≤ m < n in 0 .. n in O ( n k ) = O ( n ) Zeit und Raum speichern . Die primäre Beobachtung ist, dass Sie ein zweidimensionales Array in O ( n k ) -Zeit erstellen und dann Bereiche abfragen können, indem Sie die Differenz der i , j- Indizes in konstanter Zeit ermitteln.k 0 .. m 0 ≤ m < n 0 .. n O ( n k ) = O ( n ) O ( n k ) ich , j
count[pos][elem] = occurences of 'elem' in the indices 0..pos
Vorverarbeitung
Abfrage
(nimmt an, dass i, j beide inklusive Grenzen sind)
count
Entschuldigung für alle Probleme mit dieser Antwort, es ist meine erste.
quelle