• Keine Ergebnisse gefunden

Grundlagen der Algorithmen und Datenstrukturen Kapitel 8

N/A
N/A
Protected

Academic year: 2022

Aktie "Grundlagen der Algorithmen und Datenstrukturen Kapitel 8"

Copied!
22
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Grundlagen der Algorithmen und Datenstrukturen

Kapitel 8

Christian Scheideler + Helmut Seidl SS 2009

(2)

Graphen

Graph G=(V,E) besteht aus

• Knotenmenge V

• Kantenmenge E

(3)

Graphen

• Ungerichteter Graph: Kante repräsentiert durch Teilmenge {v,w} ½ V

• Gerichteter Graph: Kante repräsentiert duch Paar (v,w) 2 V£ V (bedeutet v w )

(4)

Graphen

Anwendungen:

• Ungerichtete Graphen: Symmetrische

Beziehungen jeglicher Art (z.B. {v,w} 2 E genau dann, wenn Distanz zwischen v und w maximal 1 km)

• Gerichtete Graphen: asymmetrische

Beziehungen (z.B. (v,w) 2 E genau dann, wenn Person v Person w mag)

(5)

Graphen

Im folgenden: nur gerichtete Graphen.

Modellierung eines ungerichteten Graphen als gerichteter Graph:

• n: aktuelle Anzahl Knoten

• m: aktuelle Anzahl Kanten

Ungerichtete Kante ersetzt durch zwei gerichtete Kanten.

(6)

Operationen auf Graphen

G=(V,E): Graph-Variable

• Node: DS für Knoten, Edge: DS für Kanten Operationen:

• G.insert(Edge e): E=E [ {e};

• G.remove(Key i, Key j): E=En{e}; für die Kante e=(v,w) mit Key(v)=i und Key(w)=j

• G.insert(Node v): V=V [ {v};

• G.remove(Key i): sei v2V der Knoten mit Key(v)=i.

V:=Vn{v}, E:=En{(x,y) | x=v _ y=v}

• G.find(Key i): gib Knoten v aus mit Key(v)=i

• G.find(Key i, Key j): gib Kante (v,w) aus mit Key(v)=i und Key(w)=j

(7)

Operationen auf Graphen

Anzahl der Knoten oft fest. In diesem Fall:

• V={0,…,n-1} (Knoten hintereinander

nummeriert, identifiziert durch ihre Keys) Relevante Operationen:

• G.insert(Edge e): E=E [ {e};

• G.remove(Key i, Key j): E=En{e}; für die Kante e=(i,j)

• G.find(Key i, Key j): gib Kante e=(i,j) aus

(8)

Operationen auf Graphen

Anzahl der Knoten variabel:

• Hashing kann verwendet werden, um Keys von n Knoten in den Bereich {0,

…,O(n)} zu hashen.

• Damit kann variabler Fall auf den Fall

einer statischen Knotenmenge reduziert werden. (Nur O(1)-Vergrößerung

gegenüber statischer Datenstruktur)

(9)

Operationen auf Graphen

Im folgenden: Konzentration auf statische Anzahl an Knoten.

Parameter für Laufzeitanalyse:

• n: Anzahl Knoten

• m: Anzahl Kanten

• d: maximaler Knotengrad (maximale

Anzahl ausgehender Kanten von Knoten)

(10)

Graphrepräsentationen

Kapitel 8.1: Sequenz von Kanten

0 1

3 2

(1,2)

(0,1) (2,3) (3,0) null

(11)

Sequenz von Kanten

Zeitaufwand:

• G.find(Key i, Key j): Θ (m) im worst case

• G.insert(Edge e): O(1)

• G.remove(Key i, Key j): Θ (m) im worst case

(1,2)

(0,1) (2,3) (3,0) null

(12)

Graphrepräsentationen

Kapitel 8.2: Adjazenzfeld

0 1

3 2

0 2 4 5

1 2 2 3 3 0

V

E

0 n-1

0 m-1

offsets in E

Hier: nur Zielkeys

(0,1),(0,2) (2,3)

(13)

Adjazenzfeld

Zeitaufwand:

• G.find(Key i, Key j): Zeit O(d)

• G.insert(Edge e): Zeit O(m) (worst case)

• G.remove(Key i, Key j): Zeit O(m) (worst case)

0 1

3 2

0 2 4 5

1 2 2 3 3 0

V

E

offsets in E

(14)

Graphrepräsentationen

Kapitel 8.3: Adjazenzliste

0 1

3 2 1

2 V

2 3

3 0

0 n-1

Hier: nur Zielkeys

(15)

Adjazenzliste

Zeitaufwand:

• G.find(Key i, Key j): Zeit O(d)

• G.insert(Edge e): Zeit O(d)

• G.remove(Key i, Key j): Zeit O(d)

0 1

3 2

1 2 V

2 3

3 0

Problem: d kann groß sein!

(16)

Graphrepräsentationen

Kapitel 8.4: Adjazenzmatrix

• A[i][j] 2 {0,1} (bzw. Zeiger auf Edge)

0 1

3 2

0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 A =

(17)

Adjazenzmatrix

Zeitaufwand:

• G.find(Key i, Key j): Zeit O(1)

• G.insert(Edge e): Zeit O(1)

0 1

3 2

0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 A =

Aber: Speicher- aufwand O(n2)

(18)

Graphrepräsentationen

Besser: Adjazenzliste + Hashtabelle

0 1

3 2

e1 e2 V

e3 e4

e5 e6

0,1 0,2 1,2 1,3 2,3 3,0 e1

e2

e3 e4

e5 e6

(19)

Adjazenzliste+Hashtabelle

Zeitaufwand:

• G.find(Key i, Key j):

O(1) (worst case)

• G.insert(Edge e):

O(1) (im Mittel)

• G.remove(Key i, Key j):

O(1) (im Mittel)

• Speicher: O(n+m)

e1 e2 V

e3 e4

e5 e6

0,1 0,2 1,2 1,3 2,3 3,0

(20)

Graphrepräsentationen

Kapitel 8.5: Implizite Repräsentationen (k,l)-Gitter G=(V,E):

• V=[k]£ [l] ([a]={0,…,a-1} für a2IN)

• E={((v,w),(x,y)) | (v=x ^ |w-y|=1) _ (w=y ^ |v-x|=1)}

Beispiel: (5,4)-Gitter

(21)

Graphrepräsentationen

Kapitel 8.5: Implizite Repräsentationen (k,l)-Gitter G=(V,E):

• V=[k]£ [l] ([a]={0,…,a-1} für a2IN)

• E={((v,w),(x,y)) | (v=x ^ |w-y|=1) _ (w=y) ^ |v-x|=1)}

• Speicheraufwand: O(log k + log l)

(speichere Kantenregel sowie k und l)

• Find-Operation: O(1) Zeit (reine Rechnung)

(22)

Zusammenfassung

Verschiedene Graphrepräsentationen:

• Kantenliste

• Adjazenzfeld

• Adjazenzliste

• Adjazenzmatrix

• Adjazenzliste + Hashtabelle

• Implizite Graphrepräsentation

Weiter mit Graphdurchlauf (Kapitel 9)

Referenzen

ÄHNLICHE DOKUMENTE

Eingabe: Zutaten, Algorithmus: Rezept, Ausgabe: Essen. •

• liefert Garantien für die Effizienz des Algorithmus (wichtig für Robustheit) Exakte Formeln für t(n) sehr aufwendig. Einfacher:

belle T der Größe m>2en mittels einer zufälligen Hashfunktion h gespeichert werden, dann ist für jedes T[i] die erwartete Länge eines Laufes in T, der T[i] enthält, O(1)..

Mergen zweier Teilfolgen mittels 3 Blöcken im internen Speicher (rote Kästen):..

Suche einen Knoten entweder mit e.key() < key und linkem Nachfolger null oder mit e.key() > key und rechtem Nachfolger null.. Lösche den Inhalt des

Dann gilt (über Induktion) für jeden Weg p, dass d[s]+c(p) ≥ d[w] für alle Knoten w. Falls sichergestellt ist, dass

• Für die Teilmengen, die das i-te Objekt nicht enthalten, ist der Wert der optimalen Lösung gleich V[i-1][w]. • Für die Teilmengen, die Objekt i enthalten, ist der Wert

Problem: Verwaltung freier Blöcke in einem gege- benen Adressraum {0,…,m-1} zur effizienten Allokation und