Zum Inhalt springen

Range Minimum Query

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 9. September 2012 um 18:39 Uhr durch Weidner.martin (Diskussion | Beiträge) (Lowest Common Ancestor). Sie kann sich erheblich von der aktuellen Version unterscheiden.
Abbildung 1: Range Minimum Anfrage auf Integer-Array

Range Minimum Queries (RMQs) adressieren innerhalb der Informatik das Problem, eine Anfrage nach dem kleinsten Element innerhalb eines spezifizierten Bereichs eines Arrays zu beantworten. Eine effiziente Beantwortung hat Relevanz für weitere Probleme der Informatik, wie z.B. für die Textindizierung und -komrpession, Flussgraphen etc. (Johannes Fischer 2008; Vishkin and Berkman 1990)

Definition

Sei ein Array der Länge mit Elementen eines Universums totaler Ordnung, dann liefere (mit und ) die Position des kleinsten Elements innerhalb des angegebenen Intervalls (Johannes Fischer and Heun 2011). Abbildung 1 veranschaulicht die Anfrage auf eine Beispielsequenz.

Triviale Bearbeitung

Es existieren zwei triviale Lösungen zur Problembearbeitung, die entweder platz- oder zeitineffizient sind. (Johannes Fischer and Heun 2011)

  • Lineares Scannen: Durch scannen von wird für jede Query eine lineare Anfragezeit in worst-case und ein Platzbedarf von erreicht.
  • Vorberechnung einer Lookup Tabelle: Naiv wird eine Tabelle vorberechnet, die die Antworten auf alle möglichen Range Minimum Anfragen speichert. Somit wird eine konstante Anfragezeit in erreicht, wobei Kombinationen Platz benötigen.

Angenommen wird allerdings, dass es sich bei um ein statisches Array handelt und die Anfragen on-line gestellt werden, wodurch eine geschickte Vorberechnung und die Konstruktion einer geeigneten Datenstruktur die Anfragezeit deutlich reduzieren kann. Hierbei wird eine nahezu konstante Anfragezeit mit linearem Platzverbrauch angestrebt.

Effiziente Konstruktion

Im Folgenden wird Schrittweise dargestellt, wie das gegebene Problem mittels geschickter Vorberechnung auf eine Komplexität von (linearer Platzbedarf/Vorberechnungszeit, konstante Anfragezeit) reduziert werden kann.

Logarithmischer Platzbedarf

Abbildung 2: Zwei Teilanfragen für die RMQ

Um zu erreichen, werden alle Anfragen vorberechnet, deren Länge umfassen. Aufgrund dessen wird die tatsächliche RMQ in maximal zwei gleich lange Teilanfragen zerlegt, deren Längen 2er-Potenz sind und sich überlappen. Hierbei wird die größtmögliche 2er-Potenz gewählt, wobei ist. Aufgrund der Vorberechnung kann das Ergebnis über das Intervall von in konstanter Zeit bestimmt werden. Abbildung [fig:02-logn] verbildlicht das Vorgehen und zeigt beispielhaft, wie die RMQ (Intervall = rote Linie) in zwei RMQs (graue Linien) zerlegt wird.
Sei die Tabelle mit den vorberechneten Antworten. Der Algorithmus umfasst insgesamt drei Schritte, um das Ergebnis einer RMQ zu bestimmen:

Analyse

Abbildung 3: Vorberechnung

Aufgrund der Vorberechnung kann eine RMQ in beantwortet werden. Die zusätzliche Datenstruktur entält für jede Position innerhalb des Arrays maximal vorberechnete Minima, weil es im worst-case Zweierpotenzen von der ersten Arrayposition bis zum Ende gibt. Hierdurch reduziert sich der Platzbedarf von auf .
Die Vorberechnung benötigt mittels dynamischer Programmierung eine Laufzeit von Schritten, wobei folgende Rekurrenz gelöst wird: (siehe Abbildung 3), um die entsprechende Tabelle zu berechnen. Die benötigte Zeit für die Vorberechnung liegt in .

Linearer Platzbedarf

Abbildung 4: Blockbildung und Speicherung der Minima

Im zweiten Optimierungsschritt wird der Platzbedarf auf reduziert. Dabei wird das Eingabearray in Blöcke der Länge zerlegt. O.B.d.A. sei . Visuell ist die Blockbildung in Abbildung 4 dargestellt, wobei hier beispielhaft in vier Blöcke zerlegt wurde. Die RMQ kann nun in max. drei Teile zerlegt werden:

  • Eine Anfrage, die vollständige Blöcke umfasst ().
  • Zwei Anfragen, die jeweils einen Teil eines Blocks [in-Block] betreffen (, ).

Anfrage über vollständige Blöcke

Die RMQ, die an Blockgrenzen abschließt (also vollständige Blöcke umfasst), kann mittels der Konstruktion aus Abschnitt [sub:redlog] in mittels zwei überlappender Anfragen beantwortet werden. Man speichere das Minimum eines jeden Blockes in einer Liste (Abbildung [fig:04-blockbildung], zudem sei Fehler beim Parsen (SVG (MathML kann über ein Browser-Plugin aktiviert werden): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „http://localhost:6011/de.wikipedia.org/v1/“:): {\displaystyle m = |D| = \frac{n}{s}} . Hierauf wird die bekannte Konstruktion angewandt, woduch sich ein Platzbedarf von ergibt. Zusammenfassend kann gesagt werden, dass für diesen Fall eine RMQ in konstanter Zeit berechnet werden kann, wobei die Hilfsdatenstruktur linear viel Platz benötigt.

Anfragen auf Blockteile

Abbildung 5: Beispiel für Karteische Bäume

Jedem Block wird ein Kartesischer Baum[1] zugeordnet. Ein Kartesischer Baum wird nach folgender, rekursiver Vorschrift konstruiert (Johannes Fischer and Heun 2011) und ist beispielhaft in Abbildung 5 zu sehen.

  1. Wurzel: Postition des Minimums in
  2. Linkes Kind: Kartesischer Baum von
  3. Rechtes Kind: Kartesischer Baum von

Lemma: Falls die Kartesischen Bäume zweier Arrays die gleiche Struktur aufweisen, so gilt .
Der interessierte Leser kann den Beweis des Lemmas in (Johannes Fischer and Heun 2011, S.472) nachlesen.

Aufgrund des Lemmas ergibt sich eine Reduktion für in-Block RMQs, da nicht jeder Block einzeln vorberechnet wird, sondern nur die Antworten für alle möglichen Kartesischen Bäume über Elementen ausreichen, denn jeder Block lässt sich in Linearzeit (Johannes Fischer and Heun 2011) auf einen Kartesischen Baum abbilden, da die Baumkonstruktion armotisiert in liegt. Die Anzahl der Bäume entspricht der Catalan-Zahl . Die Bitmuster der Bäume dienen als Index für die vorberechnete in-Block Tabelle . Ein Kartesischer Baum wird hierbei durch seine Level-order unary degree sequence (LOUDS) eindeutig repräsentiert, welche in (Jacobson 1989) beschrieben ist und Bits benötigt.
Insgesamt ergibt sich daraus ein Platzbedarf von Fehler beim Parsen (SVG (MathML kann über ein Browser-Plugin aktiviert werden): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „http://localhost:6011/de.wikipedia.org/v1/“:): {\displaystyle |P| = \mathcal{O}(2^{2s} * s * s) = \mathcal{O}(\sqrt{n}\log^2 n) = o(n)} .


Wie gezeigt wurde, kann das Problem auf linearen Platzbedarf und konstante Anfragezeit reduziert werden, indem die ursprüngliche RMQ in drei Teilanfragen zerlegt wird. Das Minimum über vollständig umfasste Blöcke wird unter Zuhilfenahme des Schemas aus Abschnitt 3.1 berechnet, für in-Block Anfragen werden Blöcke auf Kartesische Bäume abgebildet, deren Ergebnisse vollständig vorberechnet nicht mehr als linear viel Platz bzgl. der Eingabe benötigen.

Anwendungen

Lowest Common Ancestor

Abbildung 6: Reduktion von LCA auf RMQ

Eine LCA-Anfrage bzgl. eines Baumes und zwei Knoten Fehler beim Parsen (SVG (MathML kann über ein Browser-Plugin aktiviert werden): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „http://localhost:6011/de.wikipedia.org/v1/“:): {\displaystyle v, w \in V} liefert entweder (bzw. ), falls sich dieser auf dem Pfad von der Wurzel zu (bzw. Fehler beim Parsen (SVG (MathML kann über ein Browser-Plugin aktiviert werden): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „http://localhost:6011/de.wikipedia.org/v1/“:): {\displaystyle v} ) befindet, oder denjenigen Knoten , an dem der gemeinsame Pfad zu und endet.

Wie erstmals von in (Gabow... 1984) beschrieben wurde, kann das LCA Problem linear auf das RMQ Problem reduziert werden (und umgedreht, siehe hierzu Bender and Farach-Colton (2000)). Dies ist von Relevanz, da somit auch LCA-Anfragen in konstanter Zeit und linearem Platzbedarf bzgl. der Eingabe () gelöst werden können, wie es zum Beispiel in J. Fischer and Heun (2007) dargestellt wird.

Die Reduktion beinhaltet eine Eulertour (bzw. einen in-Order Baumtraversal) in über den LCA-Baum zur Abbildung in ein Array , wobei für jedes Element in Fehler beim Parsen (SVG (MathML kann über ein Browser-Plugin aktiviert werden): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „http://localhost:6011/de.wikipedia.org/v1/“:): {\displaystyle N} eine entsprechende Traversalnummer in gespeichert wird, indem beim Abstieg um dekrementiert (bzw. beim Aufstieg inkrementiert) wird, siehe hierzu Abbildung [fig:06-trafo]. Das Array benötigt linear viel Platz, weil die Kantenanzahl des Ursprungsbaumes durch dessen Knoten beschränkt ist. Für das Array kann nun die zuvor-beschriebene Vorberechnung für RMQs durchgeführt werden. Zur Lösung des LCA-Problems gilt nun: , wobei die Position der Eingabeknoten innnerhalb kennzeichnen.

Längstes gemeinsames Präfix

In der Textindizierung können RMQs zum Auffinden von LCPs (Longest Common Prefix) bei der Mustersuche verwendet werden (bzw. Longest Common Suffix durch RMQ auf den umgedrehten Text), wobei das LCP eines gemeinsamen Präfixes der Suffixe berechnet, die in an Position und beginnen.

Hierzu wird das LCP-Array des Suffix-Arrays[2] verwendet und zu ein inverses Suffix-Array berechnet, welches zum -ten Suffix im Suffixarray dessen Anfangsposition in Fehler beim Parsen (SVG (MathML kann über ein Browser-Plugin aktiviert werden): Ungültige Antwort („Math extension cannot connect to Restbase.“) von Server „http://localhost:6011/de.wikipedia.org/v1/“:): {\displaystyle T} liefert. Auf Basis dieser beiden Strukturen kann nun in konstanter Zeit die Länge des LCP mittels foldenger Vorschrift berechnet werden: . (J. Fischer and Heun 2006, S.43-43)
Für weitere Anwendungsfälle von RMQs sei auf J. Fischer and Heun (2007, S.3) verwiesen.

Literatur

  1. Bender, M., and M. Farach-Colton. 2000. “The LCA problem revisited.” LATIN 2000: Theoretical Informatics: 88–94.
  2. Fischer, J., and V. Heun. 2006. “Theoretical and practical improvements on the RMQ-problem, with applications to LCA and LCE.” In Combinatorial Pattern Matching, 36–48.
  3. Fischer, J., and V. Heun. 2007. “A new succinct representation of RMQ-information and improvements in the enhanced suffix array.” Combinatorics, Algorithms, Probabilistic and Experimental Methodologies: 459–470.
  4. Fischer, Johannes. 2008. “Range Minimum Queries: Simple and Optimal, At Last!”
  5. Fischer, Johannes, and Volker Heun. 2011. “Space-Efficient Preprocessing Schemes for Range Minimum Queries on Static Arrays.” SIAM J. Comput. 40 (apr): 465–492. doi:10.1137/090779759. http://dx.doi.org/10.1137/090779759.
  6. Jacobson, G. 1989. “Space-efficient static trees and graphs.” In Foundations of Computer Science, 1989., 30th Annual Symposium on, 549–554.
  7. Vishkin, U., and O. Berkman. 1990. “Recursive Star-Tree Parallel Data-Structure.” Maryland Univ College Park Inst For Advanced Computer Studies.

Verweise

doi:10.1137/090779759

  1. Siehe http://en.wikipedia.org/wiki/Cartesian_tree für weitere Informationen.
  2. Das Suffix-Array enthält lexikografisch aufeinander-folgende Suffixe und .