notes/school/di-ma/20181107_2-transitive-closure.md
Valentin Brandl b62a7e60e4
Some checks failed
the build failed
Add dima notes
2019-01-28 20:58:59 +01:00

103 lines
2.8 KiB
Markdown

---
title: Transitive Hülle
date: 2018-11-07
---
Gegeben eine endliche Menge $V$ und eine Relation $R$ auf $V$, d.h. $R
\subseteq V \times V$.
Zwei Elemente $u,v \in V$ stehen in Relation, falls $(u, v) \in R$.
**Frage**: Wie findet man die kleinste transitive Hülle von $R^+$ mit $R
\subseteq R^+$?
$R^+$ heißt transitive Hülle von $R$.
Als Graphenproblem:
Wir modellieren "in relation stehen" durch Kanten
# Definition (Transitive Hülle)
Sei $G=(V,E)$ ein gerichteter Graph. Der Graph $G^+ = (V,E^+)$ mit $E^+ = \{
(v,b) | u,v \in V, (u \rightsquigarrow v) \in G \}$ heißt **transitive Hülle**
von $G$.
**Beispiel**: ![Graph](20181107_1-dg.png)
![Transitive Hülle](20181107_2-trans_closure.png) ist die transitive Hülle von
obigem Graph.
# Algorithmus (Berechnen der Transitiven Hülle; Warshall)
Für einen gerichteten Graphen $G=(V,E)$ mit $V=\{1,...,n\}$ betrachte die
Adjazenzmatrix von $G$ definiert als $A[i,j] = \begin{cases}
1 & (i,j) \in E \\
0 & (i,j) \notin E
\end{cases}$
**Bemerkung**: $A$ ist im allgemeinen nicht mehr symmetrisch (anders als bei
ungerichteten Graphen).
**Idee**: Ausgehend von $A$ schrittweise die Adjazenzmatrix der transitiven
Hülle zu berechnen.
Für $k \in \{0, ..., n\}$ definieren wir Matrizen $T_k$ rekursiv als
$T_k[i,j] = \begin{cases}
1 & \text{falls es einen $i$-$j$-Pfad mit Zwischenknoten aus } \{1, ...,
k\} \text{ gibt} \\
0 & \text{sonst}
\end{cases}$.
Dann gilt $T_0 = A$ (Adjazenzmatrix) und $T_n$ ist die Adjazenzmatrix der
transitiven Hülle
Wir wollen $T_k$ rekursiv aus $T_{k-1}$ berechnen (für $k \geq 1$). Es gilt
$T_k[i,j] = max \{ T_{k-1}[i,j], T_{k-1}[i,k] \cdot T_{k-1}[k,j] \}$, d.h.
$T_k[i,j] = 1$ genau dann, wenn $T_{k-1}[i,j] = 1$ oder $T_{k-1}[i,k] = 1$ und
$T_{k-1}[k,j] = 1$.
Die $i$-$j$-Pfade mit Zwischenknoten aus $\{1,...,k\}$ zerfallen in 2 Fälle:
i) $i$-$j$-Pfade mit Zwischenknoten aus $\{1,...,k-1\}$
i) $i$-$j$-Pfade, die den Knoten $k$ als Zwischenknoten enthalten
Pfade im Fall
i) gibt es, falls $T_{k-1}[i,j] = 1$
i) gibt es, falls $T_{k-1}[i,k] = 1$ und $T_{k-1}[k,j] = 1$
## Algorithmus im Pseudocode
**Eingabe**: Adjazenzmatrix $A$ von $G=(V,E)$ (gerichteter Graph)
**Ausgabe**: Adjazenzmatrix der transitiven Hülle
i) $W = A$
i) `for` $k$ `in` $\{1,...,n\}$ `do`
`for` $i$ `in` $\{1,...,n\}$ `do`
`for` $j$ `in` $\{1,...,n\}$ `do`
$W[i,j] = max \{ W[i,j], W[i,k] \cdot W[k,j] \}$
i) Ausgabe $W$
**Laufzeit**: $O(n^3)$
**Korrektheit**: Basiert auf Rekusionsformel von oben und der Bemerkung
$T_{k-1}[i,k] = T_k[i,k]$ und $T_{k-1}[k,j] = T_k[k,j]$.
Dies gilt, da Pfade mit Startknoten $i$ und Endknoten $k$ und Zwischenknoten
aus $\{1, ..., k-1\}$ sind (in Pfaden gibt es keine Kotenwiederholungen).
Algorithmus ist Beispiel für dynamische Programmierung, dazu später mehr.