Handout - TU Ilmenau

Werbung
Algorithmen und Datenstrukturen SS09
Foliensatz 16
Michael Brinkmeier
Technische Universität Ilmenau
Institut für Theoretische Informatik
Sommersemester 2009
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 1 / 45
Graphen
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 2 / 45
Graphen
1
2
1
2
3
4
3
4
5
5
6
7
6
7
8
9
8
9
Gerichteter Graph
Ungerichteter Graph
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 3 / 45
Graphen
Graphen sind eine in der Informatik und zur Modellierung von
Anwendungssituationen allgegenwärtige (Daten-)Struktur.
Graphen modellieren:
Straßen und Verbindungswege
Gatter und Leitungen auf einem Chip
Systemkomponenten und Verbindungen
Zustände eines Systems und Übergänge
Flussdiagramme für Programmentwurf
Datenflussdiagramme für Programm-Analyse
Vorgänge mit Unverträglichkeitsbeziehungen
Stationen eines Transportsystems mit Kapazitäten der Verbindungen
Soziale Beziehungen
u. v. a. m.
Hier nur: Algorithmen zum Umgang mit den Strukturen.
(Modellierung, Beispiele nur am Rande.)
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 4 / 45
Gerichtete Graphen
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 5 / 45
Gerichtete Graphen
9
7
4
2
3
1
5
8
6
Definition (Gerichteter Graph)
Ein gerichteter Graph (Digraph, directed graph) G ist ein Paar (V , E ), wobei
V eine endliche Menge und
E eine Teilmenge von V × V = {(u, v ) | u, v ∈ V } ist.
Die Elemente von V werden Knoten, die von E Kanten genannt.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 6 / 45
Gerichtete Graphen
Knoten zeichnet man üblicherweise als Kreise
u
e
v
Eine Kante e = (u, v ) als Pfeil zwischen den Knoten.
Ist e = (u, v ) eine Kante, dann
sind u und v inzident zu e (d.h. liegen auf e).
sind u und v zueinander adjazent (benachbart)
ist v ein Nachfolger von u
ist u ein Vorgänger von v
Eine Kante (v , v ) heißt Schleife (loop).
v
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 7 / 45
Ein- und Ausgangsgrad
Definition (Ein- und Ausgangsgrad)
1
Der Eingangsgrad indegG (v ) (in-degree)
eines Knotens v ist die Anzahl der Kanten,
die in v hineinführen, d.h.
v
indegG (v ) = |{e ∈ E | e = (u, v ) für ein u ∈ V }| .
2
Der Ausgangsgrad outdegG (v ) (in-degree)
eines Knotens v ist die Anzahl der Kanten,
die in v verlassen, d.h.
outdegG (v ) = |{e ∈ E | e = (v , u) für ein u ∈ V }| .
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 8 / 45
v
Ein- und Ausgangsgrad
Lemma
Für jeden gerichteten GRaphen G = (V , E ) gilt:
X
X
indegG (v ) =
outdegG (v ) = |E |.
v∈V
v∈V
Beweis.
In jeder Summe wird jede Kante genau einmal gezählt – Einmal für ihren
Anfang und einmal für ihr Ende.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 9 / 45
Wege
Weg
G = (V , E ) sei ein gerichteter Graph. Ein Weg in G ist eine Sequenz
π = (v0 , v1 , . . . , vl ) von Knoten in G , so dass (vi −1 , vi ) ∈ E für i = 1, . . . , l.
l ist die Länge des Weges.
Wir schreiben u G v oder
v , falls ein Weg von u nach v in G existiert.
Äquivalent kann man einen Weg π = (v0 , . . . , vl ) als Folge von Kanten
auffassen:
π = ((v0 , v1 ), (v1 , v2 ), . . . , (vl−1 , vl )) .
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 10 / 45
Wege
9
7
4
2
3
1
5
8
6
π = (1, 2, 3, 4, 5, 6) ist ein Weg der Länge 5.
1
6 aber 9 6
8.
Beobachtung
Die Relation
ist
transitiv, denn Wege können anneinander gehängt werden, und
reflexiv, denn jeder Knoten ist mit sich selbst durch einen Weg der
Länge 0 verbunden.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 11 / 45
Einfache Wege
Definition (Einfacher Weg)
Ein Weg π = (v0 , v1 , . . . , vl ) heißt einfach, wenn die Knoten v0 , v1 , . . . , vl
paarweise verschieden sind.
9
7
4
2
3
1
5
8
6
(1, 2, 3, 4, 5, 6) ist einfach aber (4, 7, 8, 8) ist nicht einfach.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 12 / 45
Einfache Wege
Lemma
Wenn u
v , dann existiert ein einfacher Weg von u nach v .
Beweisskizze
Ist π = (u = v0 , v1 , . . . , vl = v ) ein Weg mit vi = vk und i < k, dann ist
π ′ = (v0 , . . . , vi , vk+1 , . . . , vl )
ein Weg mit mindestens einer Wiederholung weniger (entferne den Zyklus
von vi nach vk = vi ).
Damit kann man induktiv die Anzahl der Wiederholungen auf 0 senken und
erhält einen einfachen Weg.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 13 / 45
Distanzen
Definition (Distanz)
Sei G = (v , E ) ein gerichteter Graph. Die Distanz gG (u, v ) von u zu v ist
die minimale Länge eines Weges von u nach v , d.h.
dG (u, v ) = min {l | es existiert ein Weg π = (u = v0 , . . . , vl = v )} .
Ein kürzester Weg von u nach v ist ein Weg von u nach v mit der Länge
dG (u, v ).
Beobachtung
Jeder kürzeste Weg ist ein einfacher Weg.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 14 / 45
Kreise
Definition (Zyklus)
Ein Weg π = (v1 , . . . , vl ) heisst Zyklus oder Kreis (cycle), wenn l ≥ 1 und
v0 = vl gilt.
Die Kantenzahl l heisst Länge des Kreises.
Jede Schleife (v , v ) ist ein Kreis der Länge 1.
9
7
4
2
3
1
5
8
6
(3, 4, 5, 3), (8, 8) und (2, 3, 2) sind Kreise.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 15 / 45
Kreise
Definition (Einfacher Kreis)
Ein KReis π = (v0 , v1 , . . . , vl = v0 ) heißt einfach, wenn die Knoten
v0 , . . . , vl−1 paarweise verschieden sind.
Lemma
Wenn G einen Kreis enthält, dann auch einen einfachen Kreis.
Der Beweis verläuft analog dem, zur Existenz von einfachen Wegen.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 16 / 45
DAGs
Definition (DAG)
Ein gerichteter Graph heißt kreisfrei oder azyklisch, wenn es in G keinen
Kreis gibt. Sonmst heißt G zyklisch.
Ein kreisfreier gerichteter Graph wird auch DAG genannt (directed acyclic
graph).
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 17 / 45
Ungerichtete Graphen
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 18 / 45
Ungerichtete Graphen
K
I
G
D
B
E
J
H
F
L
C
A
Definition (Ungerichteter Graph)
Ein ungerichteter Graph (undirected graph) G ist ein Paar (V , E ), wobei
V eine endliche Menge und
E eine Teilmenge von [V ]2 = {{u, v } | u, v ∈ V , u 6= v } ist.
Statt {u, v } schreiben wir auch (u, v ). Bei ungerichteten Graphen (und nur
da), gilt somit (u, v ) = (v , u).
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 19 / 45
Grad
Definition (Grad)
Sei G = (V , E ) ein ungerichteter Graph. Der Grad degG (v ) (Valenz, degree)
eines Knotens v ist die Anzahl der zu v inzidenten Kanten, d.h.
degG (v ) := |{(u, v ) ∈ E | v 6= u ∈ V }| .
Ein Knoten mit Grad 0 heißt isoliert.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 20 / 45
Grad
Lemma
Wenn G = (V , E ) ein ungerichteter Graph ist, dann gilt:
X
degG (v ) = 2|E |.
v∈V
Beweis
Jede Kante (u, v ) ∈ E trägt jeweils 1 zu degG (v ) und degG u) bei.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 21 / 45
Wege
Definition (Weg)
Sei G = (V , E ) ein ungerichteter Graph. Ein Weg π = (v0 , v1 , . . . , vl ) in G
ist eine Folge von Knoten vi , so dass (vi −1 , vi ) ∈ E für 1 ≤ i ≤ l.
l – d.h. die Kantenzahl – ist die Länge von π = (v0 , . . . , vl ).
π heißt einfach, wenn die Knoten v0 , . . . , vl paarweise verschieden sind.
K
I
G
D
B
E
J
H
F
C
(K , L), (I , F , E , D) und (E , C , A, C , B) sind Wege.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
L
Seite 22 / 45
A
Einfache Wege
Lemma
Sei G = (V , E ) ein ungerichteter Graph und π = (v0 , . . . , vl ) ein Weg mit
u = v0 und v = vl – d.h. ein Weg von u nach v – dann existiert auch ein
einfacher Weg von u nach v .
Beweisskizze
Gilt vi = vj für i < j, dann ist
π ′ = (v0 , . . . , vi , vj+1 , . . . vl )
ein Weg von u nach v mit einer Wiederholung weniger.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 23 / 45
Zusammenhang
Definition (Zusammenhang)
Sei G = (V , E ) eiun ungerichteter Graph. Wenn u, v ∈ V in G durch einen
Weg verbunden sind, schreiben wir
u ∼G v
oder
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 24 / 45
u ∼ v.
Zusammenhang
Lemma
Die zweistellige Relation ∼G auf V ist eine Äquivalenzrelation, d.h. sie ist
reflexiv: v ∼G v für alle v ∈ V .
symmetrisch: v ∼G u ⇒ u ∼G v .
transitiv: u ∼G v und v ∼G w ⇒ u ∼G w .
Beweisskizze
Reflexivitität ist klar, da (v ) ein Weg ist.
Die Symmetrie folgt, weil jeder Weg in beide Richtungen durchlaufen werden
kann.
Die Transitivität folgt aus der Tatsache, dass die zwei gegebenen Wege
hintereinandergehängt werden können.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 25 / 45
Zusammenhangskomponenten
Definition (Zusammenhangskomponenten)
Sei G = (V , E ) ein ungerichteter Graph. Die Äquivalenzrelation ∼G zerlegt
die Knotenmenge von G in Äquivalenzklassen, die sogenannten
Zusammenhangskomponenten von G .
Ein Graph, der nur aus einer Zusammenhangskomponenten besteht – d.h. in
dem u ∼G v für jedes Knotenpaar u, v gilt – heißt zusammenhängend.
K
I
G
D
B
E
J
H
F
C
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
L
Seite 26 / 45
A
Kreise
Definition (Kreis)
Ein Weg π = (v0 , . . . , vl ) in einem ungerichteten Graphen G = (V , E ) mit
v0 = vl heißt Kreis der Länge l, wenn l ≥ 3 und wenn
vi −1 6= vi +1
für 1 ≤ i < l und vl−1 6= v1 .
π heißt einfach, wenn die Knoten v0 , . . . , vl−1 paarweise verschieden sind.
K
I
G
D
B
E
J
H
F
L
C
A
(I , G , D, F , I ) und (E , D, C , A, B, C , E ) sind Kreise, (I , G , D, F , I ) ist einfach
Es ist nicht erlaubt, die selbe Kante direkt hintereinander zu nutzen, d.h.
(K , J, K ) ist kein Kreis.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 27 / 45
Kreise
Lemma
Sei G = (V , E ) ein ungerichteter Graph. Enthält G einen Kreis, so enthält er
auch einen einfache Kreis.
Definition (Kreisfrei)
Ein ungerichteter GRaph G = (V , E ) heißt kreisfrei oder azyklisch, wenn er
keinen Kreis enthält.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 28 / 45
Bäume
Definition (Freier Baum)
Ein ungerichteter Graph G = (V , E ) heißt freier Baum (oder nur Baum),
wenn er zusammenhängend und kreisfrei ist.
Bemerkung
Die Zusammenhangskomponenten eines kreisfreien Graphen sind Bäume.
Deshalb werden kreisfreie Graphen auch (freie) Wälder genannt.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 29 / 45
Bäume
Lemma
Sei G = (V , E ) ein ungerichteter Graph mit n = |V | Knoten und m = |E |
Kanten. Dann sind die folgenden Aussagen äquivalent:
1
G ist ein Baum
2
G ist kreisfrei und m ≥ n − 1
3
G ist zusammenhängend und m ≤ n − 1
4
Zu jedem Paar u, v von Knoten gibt es genau einen einfachen Weg von
u nach v
5
G ist maximal kreisfrei, d.h. das Hinzufügen einer beliebigen weiteren
Kante erzeugt einen Kreis,
6
G ist zusammenhängend, aber das Entfernen einer beliebigen Kante aus
E erzeugt einen nicht zusammenhängenden Graphen.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 30 / 45
Datenstrukturen für Graphen
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 31 / 45
Grundlegende Operationen
u, v seien Knoten und e eine Kante.
source(e): Startknoten von e (gerichtet).
target(e): Zielknoten von e (gerichtet).
edge(u, v ): true falls eine Kante (u.v ) existiert, sonst false.
indeg (v ): Der Eingangsgrad von v (gerichtet).
outdeg (v ): Der Ausgangsgrad von v (gerichtet).
deg (v ): Der Grad von v (din (v ) + dout (v ) im gerichteten Fall).
adj(v ): Eine Liste aller Nachbarn von v (ungerichtet).
incident(v ): Eine Liste aller zu v inzidenten Kanten (ungerichtet).
succ(v ): Eine Liste aller Vorgänger von v (gerichtet).
in(v ): Eine Liste aller zu v führenden Kanten (gerichtet).
pred(v ): Eine Liste aller Nachfolger von v (gerichtet).
out(v ): Eine Liste aller von v ausgehenden Kanten (gerichtet).
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 32 / 45
Die Adjazenzmatrix
Sei G = (V , E ) ein (gerichteter) Graph. Im Folgenden gehen wird davon aus,
dass V = {1, . . . , n} mit n = |V | gilt.
Unter diesen Voraussetzungen können wir einen (gerichteten) Graphen
G = (V , E ) mittels einer Adjazenzmatrix A = (au,v )u,v∈V , einer
n × n-Matrix über X mit
(
1 falls (u, v ) ∈ E
,
au,v =
0 sonst
darstellen.
Um diese Matrix zu speichern benötigen wir ein zweidimensionales Array
A[1n, 1 . . . n] mit Einträgen aus {0, 1}.
Konsequenz: Lesen/Schreiben von au,v in Zeit O(1).
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 33 / 45
Die Adjazenzmatrix
1
4
2
5
8
3
6
9
7














0
0
0
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
Anzahl der “1”en in Zeile u = outdeg (u)
Anzahl der “1”en in Spalte v = indeg (v )
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 34 / 45
0
1
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
0
0
1
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
1
0
1
0
1
1














Die Adjazenzmatrix
1
2
4
5
8
3
6
7
9














0
1
0
1
1
0
0
0
0
1
0
1
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
1
0
0
0
0
0
0
1
1
1
0
0
0
0
1
0
1
0
0
0
0
0
1
0
1
0
1
0
0
1
0
0
1
0
0
0
0
0
0
1
1
0
0
0
1
0
0
0
1
0
1
0
1
1














Im ungerichteten Fall ist die Adjazenzmarix symmetrisch
Anzahl der “1”en in Zeile u = Anzahl der “1”en in Spalte u = deg (v )
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 35 / 45
Adjazenzmatrix
Die Adjazenzmatrix eines (gerichteten) Graphen G = (V , E ) mit n = |V |
und m = |E | . . .
. . . hat Speicherbedarf Θ(n2 ),
. . . Zeitbedarf O(1) um au,v zu ermitteln, bzw. zu setzen,
. . . ermöglicht die Ermittlung aller Nachfolger, Vorgänger oder Nachbarn
eines Knotens in Zeit Θ(n) (Zeilen/Spaltendurchlauf).
Problem
Bei m ≪ n2 ist der Speicheraufwand im Vergleich zu den vorhandenen
Informationen sehr hoch (viele “0”en, dünn besetzte Graphen).
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 36 / 45
Kantenmarkierungen
Die Adjazenzmatrix bietet auch eine einfache Möglichkeit
Kantenmarkierungen, wie z.B. Gewichte, Bezeichnungen, Farben, zu
speichern.
Definition (Kantenmarkierungen)
Sei G = (V , E ) ein Graph und M eine Menge von Kantenmarkierungen. Eine
(Kanten-)Markierung von G ist eine Abbildung mark : E → M, d.h. jeder
Kante e wird eine Marke mark(e) zugeordnet.
Man spricht auch häufig von Farben.
Sind die Markierungen Zahlen, so wird – je nach ANwendung – auch
häufig von Längen, Gewichten, Kapazitäten oder Kosten gesprochen.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 37 / 45
Kantenmarkierungen
Ist G ein Graph mit Kantenmarkierungen, so können die Werte mark(e)
direkt in der Adjazenzmatrix gespeichert werden.
adju,v =
(
mark(u, v )
−
falls (u, v ) ∈ E
sonst
Dabei steht − für einen Null-Zeiger oder eine beliebige Markierung, dass die
Kante nicht eistiert und deshalb auch keine Markierung hat.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 38 / 45
Die Adjazenzlisten
Eine Alternative besteht darin, für jeden Knoten eine Liste von adjazenten
Kanten zu halten, die so genannten Adjazenzlisten.
1
...
2
...
3
...
..
.
Die Struktur besteht aus einer Liste von Knoteneinträgen, die wiederrum
einen Zeiger auf die Adjazenzliste des jeweiligen Knoten enthalten.
Jeder Eintrag einer Adjazenzliste hat drei Komponenten: Den Zielknoten,
die Markierung und einen Zeiger auf den nächsten adjazenten Knoten.
Insgesamt ergibt sich somit ein Speicherbedarf von O(|V | + |E |).
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 39 / 45
Die Adjazenzlisten
1
1
1
2
4
1
8
3
2
1
5
1
1
2
2
6
2
1
2
9
2
7
1:
2:
3:
4:
5:
6:
7:
8:
9:
1
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 40 / 45
(2, 1), (4, 1), (5, 2)
(3, 1)
(2, 2), (7, 1)
(8, 1), (9, 2)
(6, 2), (8, 1)
(9, 1)
(6, 2)
(9, 2)
(9, 1)
Doppelt verkettete Adjazenzlisten
Statt einfach verketteter Adjazenzlisten, können selbstverständlich auch
doppelt verkettete Listen verwendet werden. Außerdem kann für jede Kante
noch ein zusätzlicher Zeiger auf den entsprechenden Knoten angelegt werden.
Ein Knoteneintrag besteht somit aus
1
der Nummer des Knotens,
2
3
zwei Zeigern auf die beiden Nachbarn in der Knotenliste und
einem Zeiger auf den Beginn der Liste der Inzidenten Kanten.
Ein Kanteneintrag besteht aus
1
2
dem Gewicht der Kante,
zwei Zeigern auf die beiden Nachbarn in der Kantenliste,
einem Zeiger auf den Knoteneintrag des Zieles und
Wie bei den einfach verketteten Adjazenzlisten, ist der Speicherbedarf
O(|V | + |E |).
3
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 41 / 45
Doppelt verkettete Adjazenzlisten
1
2
3
4
1 • • •
• • •
• • ◦
2 • • •
• • •
• • •
3 • • ◦
4 • • ◦
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 42 / 45
• • ◦
Bemerkungen
In allen vorgestellten Darstellungen, können statt der Gewichte natürlich
auch Zeiger auf Strukturen verwaltet werden, die zusätzliche Attribute der
Kanten enthalten.
Die Adjazenzlistendarstellungen ermöglichen direkt die Verwendung von
parallelen Kanten, indem einfach für jede Kante ein Eintrag in der
Adjazenzliste gemacht wird.
In der Adjazenzmatrix können parallele Kanten so hinzugefügt werden, dass
jeder Matrixeintrag ein Zeiger auf eine Liste von Kanten zwischen den beiden
jeweiligen Knoten ist.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 43 / 45
Übersicht
Adjazenzmatrix
Vorteile
Nachteile
Adjazenzliste
Schneller Zugriff auf
Kanten in O(1)
Niedriger
Speicherbedarf bei
wenig“ Kanten
”
Dynamischer
Hoher Speicherbedarf
O(|V |2 )
aufwändigere
Verwaltung
Zugriff auf Kanten
langsamer
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 44 / 45
Herunterladen