<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Range_Minimum_Query</id>
	<title>Range Minimum Query - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Range_Minimum_Query"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Range_Minimum_Query&amp;action=history"/>
	<updated>2026-05-17T14:44:43Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Range_Minimum_Query&amp;diff=2719108&amp;oldid=prev</id>
		<title>imported&gt;Phzh: Form, typo</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Range_Minimum_Query&amp;diff=2719108&amp;oldid=prev"/>
		<updated>2025-02-11T19:06:02Z</updated>

		<summary type="html">&lt;p&gt;Form, typo&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Datei:01 array.png|mini|Abbildung 1: Range Minimum Anfrage auf Integer-Array]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Range Minimum Queries&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;RMQ&amp;#039;&amp;#039;&amp;#039;s) adressieren innerhalb der [[Informatik]] das Problem, eine Anfrage nach dem kleinsten Element innerhalb eines spezifizierten Bereichs eines [[Feld (Datentyp)|Arrays]] zu beantworten. Eine effiziente Beantwortung hat Relevanz für weitere Probleme der Informatik, wie z.&amp;amp;nbsp;B. für die Textindizierung und -kompression, Flussgraphen etc.&lt;br /&gt;
&lt;br /&gt;
== Definition ==&lt;br /&gt;
Sei &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; ein Array der Länge &amp;lt;math&amp;gt;1..n&amp;lt;/math&amp;gt; mit Elementen eines Universums [[Totale Ordnung|totaler Ordnung]], dann liefere &amp;lt;math&amp;gt;\operatorname{RMQ}_A(l, r) = \arg\min_{l\le k \le r} A[k]&amp;lt;/math&amp;gt; (mit &amp;lt;math&amp;gt;1 \le l \le r \le n&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt; n = |A|&amp;lt;/math&amp;gt;) die Position des kleinsten Elements innerhalb des angegebenen Intervalls&amp;lt;ref name=&amp;quot;10.1137/090779759&amp;quot;&amp;gt;{{Literatur |Autor=Fischer, J. and V. Heun |Titel=Space-Efficient Preprocessing Schemes for Range Minimum Queries on Static Arrays |Sammelwerk=SIAM J. Comput. 40 (apr) |Datum=2011 |Seiten=465–492 |DOI=10.1137/090779759}}&amp;lt;/ref&amp;gt;. Abbildung&amp;amp;nbsp;1 veranschaulicht die Anfrage auf eine Beispielsequenz.&lt;br /&gt;
&lt;br /&gt;
== Triviale Bearbeitung ==&lt;br /&gt;
Es existieren zwei triviale Lösungen zur Problembearbeitung, die entweder platz- oder zeitineffizient sind.&amp;lt;ref name=&amp;quot;10.1137/090779759&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Lineares Scannen: &amp;#039;&amp;#039;&amp;#039; Durch &amp;#039;&amp;#039;Scannen&amp;#039;&amp;#039; von &amp;lt;math&amp;gt;A[l, r]&amp;lt;/math&amp;gt; wird für jede Query eine &amp;#039;&amp;#039;lineare&amp;#039;&amp;#039; Anfragezeit in &amp;lt;math&amp;gt;\mathcal{O}(n)&amp;lt;/math&amp;gt; worst-case und ein Platzbedarf von &amp;lt;math&amp;gt;\mathcal{O}(n)&amp;lt;/math&amp;gt; erreicht.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Vorberechnung einer Lookup-Tabelle: &amp;#039;&amp;#039;&amp;#039; Naiv wird eine Tabelle vorberechnet, die die Antworten auf alle möglichen Range Minimum Anfragen speichert. Somit wird eine &amp;#039;&amp;#039;konstante&amp;#039;&amp;#039; Anfragezeit in &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt; erreicht, wobei &amp;lt;math&amp;gt;\tbinom{n}{2}&amp;lt;/math&amp;gt; Kombinationen &amp;lt;math&amp;gt;\mathcal{O}(n^2)&amp;lt;/math&amp;gt; Platz benötigen.&lt;br /&gt;
&lt;br /&gt;
Angenommen wird allerdings, dass es sich bei &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; 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 &amp;#039;&amp;#039;konstante&amp;#039;&amp;#039; Anfragezeit mit &amp;#039;&amp;#039;linearem&amp;#039;&amp;#039; Platzverbrauch angestrebt.&lt;br /&gt;
&lt;br /&gt;
== Effiziente Konstruktion ==&lt;br /&gt;
Die vorberechneten RMQ-Datenstrukturen können in zwei Kategorien eingeteilt werden: (a) Array-Indexierung und (b) Array-Codierung. Im Fall (a) benötigt die vorberechnete Struktur Zugriff auf das Array &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; um darauf RMQs zu beantworten. Im Fall (b) ist ein Zugriff auf &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; nicht notwendig, um eine RMQ zu beantworten.&amp;lt;ref name=&amp;quot;10.1007/3-540-45061-0_28&amp;quot;&amp;gt;{{Literatur |Autor=Gál, A. and Miltersen, P. |Titel=The Cell Probe Complexity of Succinct Data Structures |Sammelwerk=Automata, Languages and Programming |Datum=2003 |Seiten=190–190 |DOI=10.1007/3-540-45061-0_28}}&amp;lt;/ref&amp;gt; Die vorgestellten Lösungen sind der Kategorie der Array-Indexierung zuzuordnen.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird schrittweise dargestellt, wie das gegebene Problem mittels geschickter Vorberechnung auf eine Komplexität von &amp;lt;math&amp;gt;\langle \mathcal{O}(n), \mathcal{O}(1) \rangle&amp;lt;/math&amp;gt; (linearer Platzbedarf/Vorberechnungszeit, konstante Anfragezeit) reduziert werden kann.&lt;br /&gt;
&lt;br /&gt;
=== Linearithmischer Platzbedarf ===&lt;br /&gt;
[[Datei:02-logn.png|mini|Abbildung 2: Zwei Teilanfragen für die RMQ]]&lt;br /&gt;
&lt;br /&gt;
In M. A. Bender et al. (2005)&amp;lt;ref name=&amp;quot;10.1016/j.jalgor.2005.08.001&amp;quot;&amp;gt;{{Literatur |Autor=Bender, M. A., M. Farach-Colton, G. Pemmasani, S. Skiena, and P. Sumazin |Titel=Lowest common ancestors in trees and directed acyclic graphs |Sammelwerk=Journal of Algorithms |Band=57 |Nummer=2 |Datum=2005-11 |ISSN=0196-6774 |Seiten=75–94 |Online=https://linkinghub.elsevier.com/retrieve/pii/S0196677405000854 |DOI=10.1016/j.jalgor.2005.08.001}}&amp;lt;/ref&amp;gt; wird eine Möglichkeit beschrieben, um &amp;lt;math&amp;gt;\langle\mathcal{O}(n \log n), \mathcal{O}(1)\rangle&amp;lt;/math&amp;gt; zu erreichen. Hierzu werden die Ergebnisse für alle möglichen Startpositionen &amp;lt;math&amp;gt;(1, \dots, n)&amp;lt;/math&amp;gt; und Längen der Form &amp;lt;math&amp;gt;2^i :  i \leq x=\mathcal{O}(\log n)&amp;lt;/math&amp;gt; vorberechnet. Aufgrund dessen wird die tatsächliche RMQ in maximal zwei gleich lange Teilanfragen zerlegt, deren Längen Zweierpotenzen sind und sich möglicherweise überlappen. Hierbei wird die größtmögliche Zweierpotenz &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; gewählt, wobei &amp;lt;math&amp;gt;h = \lfloor \log_2{(r-l+1)} \rfloor&amp;lt;/math&amp;gt; ist. Aufgrund der Vorberechnung kann das Ergebnis über das Intervall von &amp;lt;math&amp;gt;2^h&amp;lt;/math&amp;gt; in konstanter Zeit bestimmt werden. Abbildung&amp;amp;nbsp;2 verbildlicht das Vorgehen und zeigt beispielhaft, wie die RMQ (Intervall = rote Linie) in zwei RMQs (graue Linien) zerlegt wird.&amp;lt;br /&amp;gt;&lt;br /&gt;
Sei &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; die Tabelle mit den vorberechneten Antworten. Der Algorithmus umfasst insgesamt drei Schritte, um das Ergebnis einer RMQ zu bestimmen:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\operatorname{RMQ}_A(l, l+2^h-1) = m_1 = M[l][h]&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\operatorname{RMQ}_A(r-2^h+1, r) = m_2 = M[r-2^h+1][h]&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\operatorname{RMQ}_A(l, r) = \arg\min\{A[m_1], A[m_2]\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An dieser Stelle wird ersichtlich, dass die angegebene Lösung zur Kategorie (a) Array-Indexierung gehört, weil das kleinere der beiden Minima der Teilanfragen ermittelt werden muss und hierzu zwei Zugriffe auf &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; benötigt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Analyse&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Datei:03-recurrence.png|mini|Abbildung 3: Vorberechnung]]&lt;br /&gt;
Aufgrund der Vorberechnung kann eine RMQ in &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt; beantwortet werden. Die zusätzliche Datenstruktur enthält für jede Position innerhalb des Arrays maximal &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; vorberechnete Minima, weil es im worst-case &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; Zweierpotenzen von der ersten Arrayposition bis zum Ende gibt. Hierdurch reduziert sich der Platzbedarf von &amp;lt;math&amp;gt;\mathcal{O}(n^2)&amp;lt;/math&amp;gt; auf &amp;lt;math&amp;gt;\mathcal{O}(n \log n)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die Vorberechnung benötigt mittels dynamischer Programmierung eine Laufzeit von &amp;lt;math&amp;gt;\mathcal{O}(n \log n)&amp;lt;/math&amp;gt; Schritten, wobei folgende Rekurrenz gelöst wird: &amp;lt;math&amp;gt;M[i][h] = \arg\min{\{A[M[i][h-1]], A[M[i+2^{h-1}][h-1]]\}}&amp;lt;/math&amp;gt; (siehe Abbildung&amp;amp;nbsp;3), um die entsprechende Tabelle &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; zu berechnen. Die benötigte Zeit für die Vorberechnung liegt in &amp;lt;math&amp;gt;\mathcal{O}(n \log n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Linearer Platzbedarf ===&lt;br /&gt;
[[Datei:04-blockbildung.png|mini|Abbildung 4: Blockbildung und Speicherung der Minima]]&lt;br /&gt;
Die vorgestellte Lösung stammt von Johannes Fischer and Heun (2011)&amp;lt;ref name=&amp;quot;10.1137/090779759&amp;quot; /&amp;gt;. Hierbei wird der Platzbedarf auf &amp;lt;math&amp;gt;\mathcal{O}(n)&amp;lt;/math&amp;gt; reduziert, wobei das Eingabearray &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; in Blöcke der Länge &amp;lt;math&amp;gt;s=\frac{\log n}{2+\epsilon}&amp;lt;/math&amp;gt; zerlegt wird. O.B.d.A. sei &amp;lt;math&amp;gt;\epsilon = 2&amp;lt;/math&amp;gt;. Visuell ist die Blockbildung in Abbildung&amp;amp;nbsp;4 dargestellt, wobei &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; hier beispielhaft in vier Blöcke zerlegt wurde. Die RMQ kann nun in max. drei Teile zerlegt werden:&lt;br /&gt;
&lt;br /&gt;
* Eine Anfrage, die vollständige Blöcke umfasst (&amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;).&lt;br /&gt;
* Zwei Anfragen, die jeweils einen Teil eines Blocks [&amp;#039;&amp;#039;in-Block&amp;#039;&amp;#039;] betreffen (&amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Bearbeitung der max. drei Teilanfragen erhält man das jeweilige Minimum über den umspannten Bereich. Im letzten Schritt werden die konkreten Werte aus &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; geladen und verglichen. Daraufhin kann die Position des kleinsten der max. drei Werte als Ergebnis ausgegeben werden. Auch an dieser Stelle wird ersichtlich, dass die angegebene Lösung der Kategorie (a) Array-Indexierung zuzuordnen ist.&lt;br /&gt;
&lt;br /&gt;
==== Anfrage über vollständige Blöcke ====&lt;br /&gt;
&lt;br /&gt;
Die RMQ, die an Blockgrenzen abschließt (also &amp;#039;&amp;#039;vollständige Blöcke&amp;#039;&amp;#039; umfasst), kann mittels der Konstruktion aus Abschnitt&amp;amp;nbsp;3.1 in &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt; mittels zwei überlappender Anfragen beantwortet werden. Man speichere das Minimum eines jeden Blockes in einer Liste &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; (Abbildung&amp;amp;nbsp;4), zudem sei &amp;lt;math&amp;gt;m = |D| = \frac{n}{s}&amp;lt;/math&amp;gt; . Hierauf wird die bekannte Konstruktion angewandt, wodurch sich ein Platzbedarf von&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathcal{O}(m \log m) =  \mathcal{O}\left(\frac{n}{\log n} \log \frac{n}{\log n}\right) = \mathcal{O}(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
ergibt. Zusammenfassend kann gesagt werden, dass für diesen Fall eine RMQ in &amp;#039;&amp;#039;konstanter&amp;#039;&amp;#039; Zeit berechnet werden kann, wobei die Hilfsdatenstruktur &amp;#039;&amp;#039;linear&amp;#039;&amp;#039; viel Platz benötigt.&lt;br /&gt;
&lt;br /&gt;
==== Anfragen auf Blockteile ====&lt;br /&gt;
[[Datei:05-cartesian.png|mini|Abbildung 5: Beispiel für Kartesische Bäume]]&lt;br /&gt;
Jedem Block &amp;lt;math&amp;gt;B_i&amp;lt;/math&amp;gt; wird ein [[Kartesischer Baum]] zugeordnet. Ein Kartesischer Baum wird nach folgender, rekursiver Vorschrift konstruiert und ist beispielhaft in Abbildung&amp;amp;nbsp;5 zu sehen.&lt;br /&gt;
&lt;br /&gt;
# Wurzel: Position des Minimums in &amp;lt;math&amp;gt;B_i[1,s] = m&amp;lt;/math&amp;gt;&lt;br /&gt;
# Linkes Kind: Kartesischer Baum von &amp;lt;math&amp;gt;B_i[1, m-1]&amp;lt;/math&amp;gt;&lt;br /&gt;
# Rechtes Kind: Kartesischer Baum von &amp;lt;math&amp;gt;B_i[m+1, s]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lemma: &amp;#039;&amp;#039;&amp;#039; Falls die Kartesischen Bäume zweier Arrays &amp;lt;math&amp;gt;B_i, B_j; i\ne j&amp;lt;/math&amp;gt; die gleiche Struktur aufweisen, so gilt &amp;lt;math&amp;gt;\forall l,r; 1 \le l \le r \le n : \operatorname{RMQ}_{B_i}(l, r) = \operatorname{RMQ}_{B_j}(l, r)&amp;lt;/math&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
Der interessierte Leser kann den Beweis des Lemmas in Johannes Fischer and Heun (2011, S.&amp;amp;nbsp;472)&amp;lt;ref name=&amp;quot;10.1137/090779759&amp;quot; /&amp;gt; nachlesen.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; Elementen ausreichen, denn jeder Block lässt sich in Linearzeit (Johannes Fischer and Heun 2011)&amp;lt;ref name=&amp;quot;10.1137/090779759&amp;quot; /&amp;gt; auf einen Kartesischen Baum abbilden, da die Baumkonstruktion amortisiert in &amp;lt;math&amp;gt;\mathcal{O}(n)&amp;lt;/math&amp;gt; liegt. Die Anzahl der Bäume entspricht der Catalan-Zahl &amp;lt;math&amp;gt;\textstyle C_s = \frac{1}{s+1} \binom{2s}{s}&amp;lt;/math&amp;gt;, und es existiert eine Bijektion zwischen allen kartesischen Bäumen auf &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; Knoten und den Zahlen &amp;lt;math&amp;gt;[1, C_s]&amp;lt;/math&amp;gt;, die mittels einem Algorithmus in Linearzeit berechnet werden kann&amp;lt;ref&amp;gt;{{Literatur |Autor=Donald E. Knuth |Hrsg= |Titel=Generating All Trees— History of Combinatorial Generation |Sammelwerk=The Art of Computer Programming |Band=Vol. 4 |Nummer=Fasc. 4 |Verlag=Addison-Wesley |Ort=Upper Saddle River, NJ |Datum=2006 |ISBN=0-321-33570-8 |Seiten=4 ff.}}&amp;lt;/ref&amp;gt;. Diese numerische Repräsentation eines kartesischen Baumes wird als &amp;#039;&amp;#039;Index&amp;#039;&amp;#039; für die vorberechnete in-Block Tabelle &amp;lt;math&amp;gt;P[1,C_s][1,s][1,s]&amp;lt;/math&amp;gt; verwendet, und ihr Platzbedarf kann mittels [[Stirlingformel]] als &amp;lt;math&amp;gt;\log_2 C_s \approx 2s&amp;lt;/math&amp;gt; Bits abgeschätzt werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
Insgesamt ergibt sich daraus ein Platzbedarf von &amp;lt;math&amp;gt;|P| = \mathcal{O}(2^{2s} \cdot s \cdot s) = \mathcal{O}(\sqrt{n}\,\log^2 n) = o(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Wie gezeigt wurde, kann das Problem auf &amp;#039;&amp;#039;linearen Platzbedarf&amp;#039;&amp;#039; und &amp;#039;&amp;#039;konstante Anfragezeit&amp;#039;&amp;#039; 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&amp;amp;nbsp;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.&lt;br /&gt;
&lt;br /&gt;
== Anwendungen ==&lt;br /&gt;
Im Folgenden werden zwei Anwendungsfälle für RMQs vorgestellt. Weitere Anwendungen sind z.&amp;amp;nbsp;B. in Johannes Fischer and Heun (2007, S. 3)&amp;lt;ref name=&amp;quot;fischer07&amp;quot;&amp;gt;{{Literatur |Autor=Fischer, J. and V. Heun |Titel=A new succinct representation of RMQ-information and improvements in the enhanced suffix array |Sammelwerk=Combinatorics, Algorithms, Probabilistic and Experimental Methodologies |Datum=2007 |Seiten=459–470 |DOI=10.1007/978-3-540-74450-4_41}}&amp;lt;/ref&amp;gt; nachzulesen.&lt;br /&gt;
&lt;br /&gt;
=== Lowest Common Ancestor ===&lt;br /&gt;
[[Datei:06-trafo.png|mini|Abbildung 6: Reduktion von LCA auf RMQ]]&lt;br /&gt;
&lt;br /&gt;
Eine [[Lowest Common Ancestor|LCA-Anfrage]] bzgl. eines Baumes &amp;lt;math&amp;gt;S=(V, E)&amp;lt;/math&amp;gt; und zwei Knoten &amp;lt;math&amp;gt;v, w \in V&amp;lt;/math&amp;gt; liefert entweder &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; (bzw. &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;), falls sich dieser auf dem Pfad von der Wurzel zu &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; (bzw. &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;) befindet, oder denjenigen Knoten &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, an dem der gemeinsame Pfad zu &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; endet.&lt;br /&gt;
&lt;br /&gt;
Wie erstmals von Gabow, Bentley, and Tarjan (1984)&amp;lt;ref name=&amp;quot;10.1145/800057.808675&amp;quot;&amp;gt;{{Literatur |Autor=Gabow, H.N., J.L. Bentley, and R.E. Tarjan |Titel=Scaling and related techniques for geometry problems |Sammelwerk=Proceedings of the sixteenth annual ACM symposium on Theory of computing |Datum=1984 |Seiten=135–143 |DOI=10.1145/800057.808675}}&amp;lt;/ref&amp;gt; beschrieben wurde, kann das LCA Problem linear auf das RMQ Problem reduziert werden (und umgedreht, siehe hierzu Bender and Farach-Colton (2000)&amp;lt;ref name=&amp;quot;10.1007/10719839_9&amp;quot;&amp;gt;{{Literatur |Autor=Bender, M. A. and M. Farach-Colton |Titel=The LCA Problem Revisited |Sammelwerk=LATIN 2000: Theoretical Informatics |Datum=2000 |Seiten=88–94 |DOI=10.1007/10719839_9}}&amp;lt;/ref&amp;gt;). Dies ist von Relevanz, da somit auch LCA-Anfragen in &amp;#039;&amp;#039;konstanter Zeit&amp;#039;&amp;#039; und &amp;#039;&amp;#039;linearem Platzbedarf&amp;#039;&amp;#039; bzgl. der Eingabe (&amp;lt;math&amp;gt;\langle \mathcal{O}(n), \mathcal{O}(1)\rangle&amp;lt;/math&amp;gt;) gelöst werden können, wie es zum Beispiel in J. Fischer and Heun (2007)&amp;lt;ref name=&amp;quot;fischer07&amp;quot; /&amp;gt; dargestellt wird.&lt;br /&gt;
&lt;br /&gt;
Die Reduktion beinhaltet eine [[Eulerkreisproblem|Eulertour]] (bzw. einen &amp;#039;&amp;#039;in-Order Baumtraversal&amp;#039;&amp;#039;) in &amp;lt;math&amp;gt;\mathcal{O}(n)&amp;lt;/math&amp;gt; Zeit über den LCA-Baum &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; zur Abbildung in ein Array &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, wobei für jedes Element in &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; eine entsprechende Traversalnummer in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; gespeichert wird, indem beim Abstieg um &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; dekrementiert (bzw. beim Aufstieg inkrementiert) wird, siehe hierzu Abbildung&amp;amp;nbsp;6. Das Array &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; benötigt &amp;#039;&amp;#039;linear&amp;#039;&amp;#039; viel Platz, weil die Kantenanzahl des Ursprungsbaumes durch dessen Knoten beschränkt ist. Für das Array &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; kann nun die zuvor-beschriebene Vorberechnung für RMQs durchgeführt werden. Zur Lösung des LCA-Problems gilt nun: &amp;lt;math&amp;gt;\operatorname{LCA}_T(v, w) = N[\operatorname{RMQ}_D(p_v, p_w)], p_v \le p_w&amp;lt;/math&amp;gt;, wobei &amp;lt;math&amp;gt;p_v, p_w&amp;lt;/math&amp;gt; die Position der Eingabeknoten innerhalb &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; kennzeichnen.&lt;br /&gt;
&lt;br /&gt;
=== Längstes gemeinsames Präfix ===&lt;br /&gt;
&lt;br /&gt;
In der Textindizierung können RMQs zum Auffinden von [[LCP-Array|LCPs]] (Longest Common Prefix) bei der Mustersuche verwendet werden (bzw. Longest Common Suffix durch RMQ auf den umgedrehten Text), wobei &amp;lt;math&amp;gt;\operatorname{LCP}_T(i, j)&amp;lt;/math&amp;gt; das LCP eines gemeinsamen Präfixes der Suffixe berechnet, die in &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; an Position &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; beginnen.&lt;br /&gt;
&lt;br /&gt;
Hierzu wird das [[LCP-Array]] &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; des [[Suffix-Array]]s &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; verwendet und zu &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; ein &amp;#039;&amp;#039;inverses Suffix-Array&amp;#039;&amp;#039; &amp;lt;math&amp;gt;A^{-1}&amp;lt;/math&amp;gt; berechnet, welches zum &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ten Suffix im Suffixarray dessen Anfangsposition in &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; liefert. Auf Basis dieser beiden Strukturen kann nun in konstanter Zeit die Länge des LCP mittels folgender Vorschrift berechnet werden: &amp;lt;math&amp;gt;\operatorname{LCP}(i, j) = \operatorname{RMQ}_H(A^{-1}[i]+1, A^{-1}[j])&amp;lt;/math&amp;gt;.&amp;lt;ref name=&amp;quot;10.1007/11780441_5&amp;quot;&amp;gt;{{Literatur |Autor=Fischer, J. and V. Heun |Titel=Theoretical and practical improvements on the RMQ-problem, with applications to LCA and LCE |Sammelwerk=Combinatorial Pattern Matching |Datum=2006 |Seiten=36–48 |DOI=10.1007/11780441_5}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Suchalgorithmus]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Phzh</name></author>
	</entry>
</feed>