HomeWissen Stichwortverzeichnis Tags

R-Baum

Einfache Sprache

Der R-Baum* ist die 2D-Generalisierung des B+-Baum. Kann aber auch in höheren Räumen angewendet werden. R-tree.svg

Def. R-Baum

In einem R-Baum heißen die inneren Knoten Directory Pages und die Blätter Data Pages. Eine Directory page stellt ein Minimal umgebendes Rechteck (MBR) dar. Der MBR eines Kinderknotens liegt vollständig im MBR des Elternknoten. Eine Directory page hat zwischen $m$ und $M$ Kindknoten, wobei $m\leq\frac{M}{2}$. Die Datenelemente selbst sind nur in den Blattknoten gespeichert, so genante data pages. Die Wurzel ist auch ein (MBR), die den gesamten Datenraum umfässt.

Konstruktion eines R-Baums

Ein R-Baum wird mit folgenden Zielen konstruiert:

Insertion Strategien

Es soll das Datenobjekt $A$ dem R-Baum hinzugefügt werden. Falls:

Split Strategie

Falls durch eine Insertion der Knoten $K$ $M+1$ Kindknoten $R_0,\ldots,R_M$ hat, also $|K|=M+1$, so muss $K$ in zwei Knoten $K_1$ und $K_2$ geteilt werden so, dass $|K_1|\geq m$ und $|K_2|\geq m$.
Dazu gibt es z.B. den Quadratic Algorithm

  1. Setze $K_1 \gets \emptyset$ und $K_2 \gets \emptyset$.
  2. Finde die zwei Kindknoten $R_i,R_j$ mit $i,j\in[0,M]$ und $i\not=j$ so, dass wenn die beiden Kindknoten zu einer MBR gehören würden, der Leerraum $d(R_i,R_j)$ maximiert würde.$$d(R_i,R_j)=\textrm{area}(MBR(R_i\cup R_j))-\textrm{area}(R_i)-\textrm{area}(R_j)$$
  3. Setze $K_1 \gets K_1 \cup \{R_i\}$ und $K_2 \gets K_2 \cup \{R_j\}$.
  4. Falls alle $R_x$ zugeordnet oder alle übrigen $R_y,\ldots,R_z$ gebraucht werden um damit $K_1$ oder $K_2$ die mindest Anzahl $m$ an Kindsknoten erfüllt => Abbruch!
  5. Sonst wähle das nächste $R_x$ und füge es dem Knoten hinzu, der dadurch den geringsten Anstiegt des MBR erfährt. Bei Patt dem Knoten mit weniger Einträgen.

Suche in einem R-Baum

Bei Entfernungsabfragen ergibt sich folgender Algorithmus, wobei $pa$ die Wurzel des R-Baums, $q$ das gesuchte Element und $\varepsilon$ die Toleranz ist. Dabei gibt $x.\textrm{loadPage}()$ die Kindknoten von $x$ wieder. Diese können entweder data pages oder directory pages sein.

\begin{algorithm}
\caption{Entferungsabfrage R-Baum}
\begin{algorithmic}
\Input $\textrm{page adress }pa,\textrm{query object  }q,\textrm{tolerance }\varepsilon$
\Procedure{RQ-Index}{$pa,q,\varepsilon$}
\State $r\gets\emptyset$
\State $p \gets pa.\textrm{loadPage}()$
\If{$p.\textrm{isDataPage}()$}
	\For{$i = 0$ to $p.\textrm{size}()$}
		\State $o \gets p.\textrm{getObject}(i)$
		\If{$\textrm{dist}(q,o)\leq\varepsilon$}
			\State $r\gets r\cup o$
        \EndIf
    \EndFor
\Else
	\For{$i = 0$ to $p.\textrm{size}()$}
		\If{\Call{Mindist}{$q,p.\textrm{getRegion}(i)$} $\leq\varepsilon$}
			\State $r\gets r\;\cup\;$\Call{RQ-Index}{$p.\textrm{childPage}(i),q,\varepsilon$}
        \EndIf

    \EndFor
\EndIf
\return $r$
\EndProcedure
\end{algorithmic}
\end{algorithm}

MINDIST für $L_2$ Norm

Die die $L_2$ Norm ergibt sich

$$\textrm{MINDIST}(R,q)=\sqrt{\sum_{0\leq i\leq d}\begin{cases}(r.\textrm{LB}_i-q_i)^2 & \textrm{if} & q_i< r.\textrm{LB}_i\\0 & \textrm{if} & r.\textrm{LB}_i \leq q_i\leq r.\textrm{UB}_i\\(r.\textrm{LB}_i-q_i)^2 & \textrm{if} & q_i> r.\textrm{UB}_i\end{cases}}$$

R-Baum Mindist.png

Bei KNN ergibt sich folgender Algorithmus

\begin{algorithm}
\caption{KNN R-Baum}
\begin{algorithmic}
\Input $\textrm{page adress }pa,\textrm{query object  }q,\textrm{Nachbaranzahl }k$
\Procedure{kNN-Index-APL}{$pa,q,k$}
\State $r \gets$ List of $(d\in\mathbb R,q\in\textrm{Object})$ Orderd by $d$ ascending
\State $\textrm{apl} \gets$ List of $(d\in\mathbb R,a\in\textrm{DiskAdress})$ Orderd by $d$ ascending
\State $a\gets[(0.0,pa))]$
\State $pd \gets [(+\infty,null),\ldots,(+\infty,null))]$
\Comment{$r.\textrm{length}() = k$}
\State $pd \gets +\infty$
\While{not $\textrm{apl}.\textrm{isEmpty}()$ and $\textrm{apl}.\textrm{getFirst}().d\leq\textrm{prundist}$}
	\State $p\gets \textrm{apl}.\textrm{getFirst}().a.\textrm{loadPage}()$
	\State $\textrm{apl}.\textrm{deleteFirst}()$
	\If{$p.\textrm{isDataPage}()$}
		\For{$i = 0$ to $p.\textrm{size}()$}
			\If{$\textrm{dist}(q,p.\textrm{getObject}(i))\leq pd$}
				\State $r.\textrm{removeLast}()$
				\State $r.\textrm{insert}((\textrm{dist}(q,p.\textrm{getObject}(i)),p.\textrm{getObject}(i)))$
				\State $pd\gets rp.\textrm{getLast}().d$
            \EndIf 
        \EndFor
    \Else
		\For{$i = 0$ to $p.\textrm{size}()$}
			\If{$\textrm{MINDIST}(q,p.\textrm{getRegion}(i))\leq pd$}
				\State $\textrm{apl}.\textrm{insert}((\textrm{MINDIST}(q,p.\textrm{getRegion}(i)), p.\textrm{childPage}(i))$
			\EndIf
		\EndFor
	\EndIf
\EndWhile
\return $r$
\EndProcedure
\end{algorithmic}
\end{algorithm}
Home: