Algorithmen I - Tutorium 3 | Nr. 9

Werbung
Algorithmen I - Tutorium 3 | Nr. 9
20.06.2016: Spaß mit Graphen und Graphtraversierung
Marc Leinweber | [email protected]
INSTITUT FÜR THEORETISCHE INFORMATIK (ITI), PROF. DR. DENNIS HOFHEINZ
KIT – Universität des Landes Baden-Württemberg und
nationales Forschungszentrum in der Helmholtz-Gemeinschaft
www.kit.edu
Agenda
1
Graphrepräsentation
2
Tiefensuche
3
Breitensuche
4
Aufgaben
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
2/22
Graphen
Definition
Wir nennen G einen gerichteten Graphen, G = (V , E ), E ⊆ V × V
wobei V als Knotenmenge, E als Kantenmenge bezeichnet wird.
Wir nennen zwei Knoten adjazent, falls sie durch eine Kante verbunden
werden.
Wir nennen einen Knoten und eine Kante inzident, falls der Knoten ein
Endpunkt der Kante ist.
Kennt jemand Beispiele?
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
3/22
Graphrepräsentation
Adjazenzfeld
Adjazenzliste
Adjazenzmatrix
Implizite Repräsentation
Hashing
Man kann sich noch weitere Repräsentationen ausdenken und das
werden wir auch
Grundprinzip
Wählt die Repräsentation nach dem Programm das ihr gerade schreibt.
Das Adjazenzfeld wird zwar als die Allzweckwunderwaffe erscheinen und
meistens ist es das auch.
Vielleicht ist das aber nicht immer der Fall.
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
4/22
Adjazenzfeld
Wir interpretieren Knoten als Zahlen von 0 . . . n − 1.
Die können wir dann als Array-Indizes verwenden
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
5/22
Adjazenzfeld
Wir halten uns ein int - Array V [0 . . . n − 1]
sowie ein Array E für die Kanteninformationen
E [V [i ]] enthält die erste von Knoten i ausgehende Kante
Die anderen Kanten folgen dann sequentiell bis E [V [i + 1]]
Das bedeutet outdegree(i ) = V [i + 1] − V [i ], falls i ≤ n − 2
Und für n − 1 ? outdegree(n − 1) = E .length − V [n − 1]
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
6/22
Adjazenzliste
Wieder mit einem Array V. Statt Indizes speichern wir diesmal verkettete
Listen mit Kanteneinträgen.
Unterschiede zum Adjazenzfeld:
dynamischer d.h. schnelles Einfügen und Löschen von Kanten
Speicherverbrauch?
Cache-Performance?
Adressierung kann je nach Rechnerarchitektur teuer sein (Pointer
sind Adressen)
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
7/22
Adjazenzmatrix
M ∈ {0, 1}n×n mit Mij = 1 ⇐⇒ (i , j ) ∈ E
Aufgabe
Zeichnet den durch folgende Matrix dargestellten Graphen und gebt eine
Darstellung als Adjazenzfeld und Adjazenzliste an. Ist der Graph ein DAG?

0
0

0

0

1

0

0
0
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
1
0
0
0
0
1
0
1
0
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
1
0
0
1
1
0
0
0
Breitensuche

0
1

1

0

0

1

1
0
Aufgaben
20.06.2016
Ende
8/22
Adjazenzmatrixeigenschaften
Eigenschaften
Speicherverbrauch gut bzw. schlecht je nach Dichte des Graphen
(O (n2 ))
Was ist die maximale Anzahl an Kanten in einem Graphen (ohne
Parallelkanten)?
Graphtraversierung: Schnell bei dichtem Graphen (verglichen mit
Adjazenzfeld und Adjazenzliste), langsam sonst
Erreichbarkeit von Knoten durch Matrixmultiplikation
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
9/22
Hashing
Was machen wir, wenn wir unsere Knoten nicht mit den Zahlen 0 bis n − 1
identifizieren können oder wollen?
Statt einem Array V nehmen wir eine Hashtabelle und hashen Knoten auf
Adjazenzlisten.
Das ist hilfreich, wenn man sich nicht zu viel Mühe geben will, denn das
ist in 2 Minuten implementiert.
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
10/22
Tiefensuche (DFS = depth-first search)
procedure dfs(Node : n)
mark (n)
foreach (n, m) ∈ E do
if (¬marked (m))
dfs(m, id )
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
11/22
Tiefensuche - do it!
Aufgabe
Starte eine Tiefensuche von Knoten 0! Schreibe in rot den Schrittindex an
die Kante.
Markiere dabei forward-Kanten blau, backward-Kanten rot, cross-Kanten
gelb und tree-Kanten grün.
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
12/22
Tiefensuche - Fakten
Laufzeit:
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
13/22
Tiefensuche - Fakten
Laufzeit: O (|V | + |E |)
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
13/22
Tiefensuche - Fakten
Laufzeit: O (|V | + |E |)
optimal:
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
13/22
Tiefensuche - Fakten
Laufzeit: O (|V | + |E |)
optimal: nein, man findet eventuell einen lange Pfad vor einem
(deutlich) kürzeren
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
13/22
Tiefensuche - Fakten
Laufzeit: O (|V | + |E |)
optimal: nein, man findet eventuell einen lange Pfad vor einem
(deutlich) kürzeren
nicht-rekursiv: ja, möglich!
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
13/22
Tiefensuche - Fakten
Laufzeit: O (|V | + |E |)
optimal: nein, man findet eventuell einen lange Pfad vor einem
(deutlich) kürzeren
nicht-rekursiv: ja, möglich!
findet Anwendung bei der Suche starker
Zusammenhangskomponenten (SCC)
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
13/22
Tiefensuche - Fakten
Laufzeit: O (|V | + |E |)
optimal: nein, man findet eventuell einen lange Pfad vor einem
(deutlich) kürzeren
nicht-rekursiv: ja, möglich!
findet Anwendung bei der Suche starker
Zusammenhangskomponenten (SCC)
DAG
Wie finde ich mit DFS Kreise?
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
13/22
Breitensuche (BFS = breadth-first
search)
procedure bfs(Node : s)
q : Queue, n : Node
q .push(s); mark (s)
while(¬q .empty ())
n := q .pop()
foreach (n, m) ∈ E do
if(¬marked (m) do
q .push(m); mark (m)
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
14/22
Breitensuche - do it!
Aufgabe
Starte eine Breitensuche von Knoten 0!! Schreibe in rot den Schrittindex
an die Kante.
Markiere dabei forward-Kanten blau, backward-Kanten rot, cross-Kanten
gelb und tree-Kanten grün.
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
15/22
Breitensuche - Fakten
Laufzeit:
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
16/22
Breitensuche - Fakten
Laufzeit: O (|V | + |E |)
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
16/22
Breitensuche - Fakten
Laufzeit: O (|V | + |E |)
optimal:
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
16/22
Breitensuche - Fakten
Laufzeit: O (|V | + |E |)
optimal: Ja, man findet immer den Weg der wenigsten Kanten. Dafür
ist man langsamer als bei der Tiefensuche.
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
16/22
Breitensuche - Fakten
Laufzeit: O (|V | + |E |)
optimal: Ja, man findet immer den Weg der wenigsten Kanten. Dafür
ist man langsamer als bei der Tiefensuche.
Speicheraufwand: O (|V | + |E |). Das kann die iterative Tiefensuche
viel besser!
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
16/22
Breitensuche - Fakten
Laufzeit: O (|V | + |E |)
optimal: Ja, man findet immer den Weg der wenigsten Kanten. Dafür
ist man langsamer als bei der Tiefensuche.
Speicheraufwand: O (|V | + |E |). Das kann die iterative Tiefensuche
viel besser!
Kürzeste Wege
Wie finde ich mit einer modifizierten Breitensuche kürzeste Wege?
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
16/22
A I: Heaps
Aufgabe I
Ein Array A[1..h] stellt einen impliziten binären Heap dar. Gib den Index
für Elternknoten, linkes Kind und rechtes Kind von Knoten i an, gegeben
sie existieren.
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
17/22
A I: Heaps
Aufgabe I
Ein Array A[1..h] stellt einen impliziten binären Heap dar. Gib den Index
für Elternknoten, linkes Kind und rechtes Kind von Knoten i an, gegeben
sie existieren.
parent (i ) = b 2i c
kindL (i ) = 2i
kindR (i ) = 2j + 1
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
17/22
A II: Quickselect
Aufgabe II
Was ermittelt der Quickselect-Algorithmus? Wie lauten
Worst-Case-Laufzeit und erwartete Laufzeit im Θ-Kalkül?
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
18/22
A II: Quickselect
Aufgabe II
Was ermittelt der Quickselect-Algorithmus? Wie lauten
Worst-Case-Laufzeit und erwartete Laufzeit im Θ-Kalkül?
Ermittelt das Element mit Rang k über einer Folgen von n Elementen.
WC: Θ(n2 )
AC: Θ(n)
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
18/22
A III: Heaps
Aufgabe III
Wie lautet die Heap-Eigenschaft? Wie hoch ist der Baum bei n
Elementen?
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
19/22
A III: Heaps
Aufgabe III
Wie lautet die Heap-Eigenschaft? Wie hoch ist der Baum bei n
Elementen?
∀v ∈ V : parent (v ) ≤ v
Höhe blog (n)c
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
19/22
A IV: Algorithmenentwurf
Aufgabe IV
Ein Anagramm ist eine Zeichenkette, welche durch Permutation der
Zeichen aus einer anderen Zeichenkette entstanden ist. Auch ist jede
Zeichenkette ein Anagramm von sich selbst.
1
Gib eine Funktion f (s) auf Zeichenketten an, die zwei Wörtern genau
dann das gleiche Bild zuordnet, wenn sie Anagramme sind.
2
Gegeben sei eine Menge S von Zeichenketten. Gib einen effizienten
Algorithmus an, der zu einem Anfragestring q feststellt, ob S ein
Anagramm davon enthält. Die Laufzeit soll nicht von |S | abhängen.
Berechne vorher eine Datenstruktur, die die Anfrage ermöglicht. Die
Vorberechnung zählt nicht zur Anfragezeit. q ist bei Vorberechnung
unbekannt. Benutze die Funktion aus 1. Begründe Korrektheit und
Laufzeit.
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
20/22
A IV: Algorithmenentwurf
1
f (s) sortiert die Zeichen von s lexigrafisch.
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
21/22
A IV: Algorithmenentwurf
1
f (s) sortiert die Zeichen von s lexigrafisch.
2
Löse mit Hashtabelle. Berechne Hashtabelle H mit zufälligem h aus
universeller Familie und Tabelle der Größe Θ(|S |). Speichere in H
alle Bilder von S unter f . Eine Anfrage ist dann eine Anfrage an nach
h(f (q )) an H. Die Laufzeit ist unabhängig von |S |, da nach Satz 1
nur eine konstante Anzahl Kollisionen erwartet wird.
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
21/22
Was haben wir heute gemacht?
Graphdarstellung
Graphtraversierung
Aufgaben
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
22/22
Was haben wir heute gemacht?
Graphdarstellung
Graphtraversierung
Aufgaben
Viel Erfolg und eine super Woche!
Graphrepräsentation
Tiefensuche
Marc Leinweber – Algorithmen I - Tutorium 3 | Nr. 9
Breitensuche
Aufgaben
20.06.2016
Ende
22/22
Herunterladen