18.09.2013 Aufrufe

Skript in PDF - Theoretische Informatik - Technische Universität ...

Skript in PDF - Theoretische Informatik - Technische Universität ...

Skript in PDF - Theoretische Informatik - Technische Universität ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

134 KAPITEL 6. KOMPLEXITÄT VON ALGORITHMEN<br />

5: for alle Knoten v <strong>in</strong> V do<br />

6: for alle Knoten w mit e<strong>in</strong>er Kante (v, w) <strong>in</strong> E do<br />

7: IN[w] := IN[w] + 1<br />

8: end for<br />

9: end for<br />

10: for alle Knoten v <strong>in</strong> V do<br />

11: if IN[w] = 0 then<br />

12: U := U ∪ {v}<br />

13: end if<br />

14: end for<br />

15: {(2) Rekursionsschritt}<br />

16: while U e<strong>in</strong>en Knoten v enthält do<br />

17: U := U − v<br />

18: i := i + 1<br />

19: ord(v) := i<br />

20: for alle Knoten w mit (v, w) ∈ E do<br />

21: IN[w] := IN[w] − 1<br />

22: if IN[w] = 0 then<br />

23: U := U ∪ {w}<br />

24: end if<br />

25: end for<br />

26: od<br />

27: {(3) Ausgabe}<br />

28: Falls n = i, ist ord e<strong>in</strong>e topologische Sortierung von G.<br />

29: Falls n > i, ist die Ausgabe e<strong>in</strong> Code dafür, dass G nicht azyklisch ist.<br />

Korrektheit: Für jeden azyklischen Graphen G ist ord e<strong>in</strong>e topologische Sortierung<br />

von G. Das folgt daraus, dass jeder azyklische Graph e<strong>in</strong>en Knoten ohne Vorgänger<br />

hat. Deshalb ist U = ∅, solange nicht alle Knoten sortiert worden s<strong>in</strong>d. Für jede<br />

Kante (v, w) von G gilt: falls <strong>in</strong> e<strong>in</strong>em Durchgang der Schleife 16–26 der Wert<br />

ord(v) := i zugeordnet wird, hat vor diesem Durchgang IN[w] e<strong>in</strong>en Wert ≥ 1.<br />

Deswegen wird der Wert ord(w) erst <strong>in</strong> e<strong>in</strong>em Durchgang i + k, k ≥ 1, zugewiesen<br />

und es folgt ord(v) < ord(w).<br />

Zeitkomplexität: Wir wollen die Zahl der Zeite<strong>in</strong>heiten bestimmen, die dieser Algorithmus<br />

für Graphen mit n Knoten und k Kanten braucht. Das hängt von der<br />

Implementierung ab. Wir nehmen an, dass die mengentheoretischen Operationen<br />

(<strong>in</strong>sert, delete) so implementiert werden, dass sie e<strong>in</strong>e konstante Zahl A von Zeite<strong>in</strong>heiten<br />

brauchen, und auch jede Zuweisung A Zeite<strong>in</strong>heiten benötigt.<br />

Dann dauert die Initialisierung:<br />

Zeile Zeitkomplexität<br />

2. A<br />

3. A<br />

4. An<br />

5.–9. n + Ak<br />

10.–14. 2An<br />

(3A + 1)n + Ak Zeite<strong>in</strong>heiten<br />

Nur die Zeilen 5.–9. benötigt e<strong>in</strong>e Erklärung: bezeichnen wir mit k(v) die Zahl aller<br />

Nachfolger von v. Die Implementierung mit Adjazenzlisten erlaubt e<strong>in</strong>e Durchführung<br />

der Schleife 6.–8. <strong>in</strong> Zeit Ak(v). Die ganze Schleife dauert n+ n v=1 Ak(v) = n+Ak<br />

Zeite<strong>in</strong>heiten.<br />

Im Rekursionsschritt dauert 20.–25. 3Ak(v) Schritte. Da die Rekursion n-mal wie-

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!