aufgabe 1

This commit is contained in:
Never Gude 2026-05-25 18:06:24 +02:00
parent 8e745b3aed
commit e68b2248f6
2 changed files with 46 additions and 18 deletions

Binary file not shown.

View file

@ -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}