aufgabe 1
This commit is contained in:
parent
8e745b3aed
commit
e68b2248f6
2 changed files with 46 additions and 18 deletions
Binary file not shown.
|
|
@ -1,3 +1,5 @@
|
||||||
|
\newcommand{\OPT}{\mathrm{OPT}}
|
||||||
|
|
||||||
\section{Paarungen (Matchings) in Bäumen}
|
\section{Paarungen (Matchings) in Bäumen}
|
||||||
\begin{tasks}
|
\begin{tasks}
|
||||||
\item
|
\item
|
||||||
|
|
@ -13,42 +15,68 @@
|
||||||
gematcht werden kann.
|
gematcht werden kann.
|
||||||
|
|
||||||
Also ist ein perfektes Matching im Baum eindeutig, da jedes Blatt mit seinem
|
Also ist ein perfektes Matching im Baum eindeutig, da jedes Blatt mit seinem
|
||||||
Elternknoten gematcht werden muss. Die Kante ist sicher im Matching enthalten
|
Elternknoten gematcht werden muss. Diese Kante $uv$ ist sicher im Matching enthalten und alle zu $u$ oder $v$ inzidenten Kanten können aus dem Baum gelöscht werden. So entsteht ein neues Blatt, für das
|
||||||
und kann aus dem Graphen entfernt werden. So entsteht ein neues Blatt, für das
|
|
||||||
die selbe Regel gilt.
|
die selbe Regel gilt.
|
||||||
\points{3}
|
\points{3}
|
||||||
\item
|
\item
|
||||||
Der \autoref{alg:treematching} berechnet ein größtes Matching.
|
Der \autoref{alg:treematching} berechnet ein größtes Matching.
|
||||||
|
|
||||||
Der Algorithmus ist korrekt, da der Baum $T$ entweder eine gerade Anzahl an
|
Der Algorithmus ist korrekt, da der Baum $T$ entweder ein perfektes Matching
|
||||||
Knoten hat, und somit ein perfektes Matching berechnet (Siehe \autoref{1a}) oder genau einen Knoten
|
enthält und somit ein perfektes Matching berechnet (Siehe \autoref{1a}),
|
||||||
zu wenig hat und somit das größte Matching um eins kleiner ist, als das perfekte
|
oder I dont fucking know.
|
||||||
Matching des nächst größeren Baums.
|
|
||||||
|
|
||||||
Die Laufzeit liegt in $\Oh(E)$, da jede Kante maximal einmal zum Matching hinzugefügt
|
Die Laufzeit für \algt{Initialize} liegt in $\Oh(V)$, da sich der Baum in linearer Zeit augmentieren lässt und es $\abs{V} - 1$ viele Kanten gibt.
|
||||||
und dann aus dem Baum entfernt wird.
|
|
||||||
|
Die Laufzeit für \algt{MatchaTeeRec} liegt in $\Oh(V)$. Der Algorithmus wird genau
|
||||||
|
einmal für jeden Knoten aufgerufen. Wenn eine Kante zum
|
||||||
|
Match\-ing hinzugefügt wird, werden die Knoten und Kanten aus dem Baum gelöscht
|
||||||
|
die nicht mehr zum Matching hinzugefügt werden können und somit
|
||||||
|
nicht mehr bearbeitet werden.
|
||||||
|
|
||||||
|
Also liegt auch \algt{MatchaTee} in $\Oh(V)$.
|
||||||
\begin{algorithm}
|
\begin{algorithm}
|
||||||
\centering
|
\centering
|
||||||
\caption{Größtes Matching in Bäumen}
|
\caption{Größtes Matching in Bäumen}
|
||||||
\label{alg:treematching}
|
\label{alg:treematching}
|
||||||
\begin{algorithmic}
|
\begin{algorithmic}
|
||||||
\alg{MatchaTee}{$T = \tup{V, E}$} \+ \\
|
\alg{MatchaTee}{$T = \tup{V, E}$} \+ \\
|
||||||
\com{Wurzeln} \\
|
\com{Den ungerichten Baum zu einem gerichteten Baum mit $parent$ und} \\
|
||||||
$r \gets V[1]$ \\
|
\com{$children$ pro Knoten und einer Wurzel $root$ augmentieren.} \\
|
||||||
\com{Wenn Knoten Blatt ist, dann die Kante zum Elternknoten zurückgeben.} \\
|
\alg{Initialize}{$T$} \\
|
||||||
if $deg(r) = 1$ then \+ \\
|
return \alg{MatchaTeeRec}{$T$, $T.root$} \- \\
|
||||||
\com{Die Kante aus dem Baum entfernen.} \\
|
\\
|
||||||
$E \gets E \setminus \set{\set{r, Adj[r]}}$ \\
|
\alg{MatchaTeeRec}{$T$, $r$} \+ \\
|
||||||
$V \gets V \setminus \set{r}$ \\
|
|
||||||
return $\set{\set{r, Adj[r]}}$ \- \\
|
|
||||||
\com{Rekursiv für die Kinder aufrufen} \\
|
\com{Rekursiv für die Kinder aufrufen} \\
|
||||||
$m \gets \emptyset$ \\
|
$m \gets \emptyset$ \\
|
||||||
foreach $v \in Adj[r]$ do \+ \\
|
foreach $v \in r.children$ do \+ \\
|
||||||
$m \gets m \cup \text{\alg{MatchaTee}{T}}$ \- \\
|
$m \gets m \cup \text{\alg{MatchaTeeRec}{T, v}}$ \- \\
|
||||||
|
\com{Wenn Knoten Blatt ist, dann die Kante zum Elternknoten hinzufügen.} \\
|
||||||
|
if $r \neq nil$ and $deg(r) = 1$ then \+ \\
|
||||||
|
\com{Die Knoten und inzidente Kanten aus dem Baum entfernen.} \\
|
||||||
|
$T \gets T \setminus \set{r.parent, r.parent.children}$ \\
|
||||||
|
$m \gets m \cup \set{\set{r, r.parent}}$ \- \\
|
||||||
return $m$
|
return $m$
|
||||||
\end{algorithmic}
|
\end{algorithmic}
|
||||||
\end{algorithm}
|
\end{algorithm}
|
||||||
\points{5}
|
\points{5}
|
||||||
\item
|
\item
|
||||||
|
Wenn eine Kante $rv$ zu einem Matching hinzugefügt wird, kann keine zu $v$
|
||||||
|
inzidente Kante hinzugefügt werden. Das müssen wir auch bei unserem dynamischen
|
||||||
|
Programm beachten.
|
||||||
|
\[
|
||||||
|
\OPT(r) = \max_{v \in r.children}
|
||||||
|
\begin{cases}
|
||||||
|
rv + \sum_{i \in v.children} \OPT(i) + \sum_{j \in r.children \setminus v} \OPT(j) \\
|
||||||
|
\sum_{k \in r.children} \OPT(k)
|
||||||
|
\end{cases}
|
||||||
|
\]
|
||||||
|
|
||||||
|
Der Algorithmus hält sich an die Eigenschaften eines Matchings, also ist
|
||||||
|
er korrekt.
|
||||||
|
|
||||||
|
Der Algorithmus probiert alle Kindknoten von $r$ aus. Geht man mit $r$ im Baum von
|
||||||
|
unten nach oben sind das also höchstens so viele Iterationen wie, Knoten im Baum
|
||||||
|
existieren (ohne die Blätter). Also läuft das Dynamische Programm in $\Oh(V)$.
|
||||||
|
|
||||||
\points{5}
|
\points{5}
|
||||||
\end{tasks}
|
\end{tasks}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue