Implementierung von Nachbarschaftslisten
Implementierung mit Listen
Wir betrachten weiterhin den folgenden Graphen:
Die Nachbarschaftslisten zu diesem Graphen lassen sich in Python direkt nachbilden.
testGraph = \ [ ['A', ['B']], ['B', ['B', 'C', 'D']], ['C', ['A', 'B']], ['D', []] ]
Aufgabe 1
(a) (einfach)
Entwickle eine Funktion getAlleNachbarn(nameKnoten)
, die sämtliche Nachbarn eines vorgegebenen
Knotens ermittelt und zurückgibt.
Teste das Verhalten der Funktion, z.B. so:
>>> testGraph = \ [ ['A', ['B']], ['B', ['B', 'C', 'D']], ['C', ['A', 'B']], ['D', []] ] >>> getAlleNachbarn('B') ['B', 'C', 'D']
(b) (schwieriger)
Entwickle eine Funktion existiertKnoten(nameKnoten)
, die
überprüft, ob ein vorgegebener Knoten im Graph vorkommt.
Teste das Verhalten der Funktion, z.B. so:
>>> testGraph = \ [ ['A', ['B']], ['B', ['B', 'C', 'D']], ['C', ['A', 'B']], ['D', []] ] >>> existiertKnoten('D') True >>> existiertKnoten('G') False
(c) (noch schwieriger)
Entwickle eine Funktion existiertKante(nameStartKnoten, nameZielKnoten)
, die überprüft,
ob es eine Kante zwischen den übergebenen Knoten gibt.
Teste das Verhalten der Funktion, z.B. so:
>>> testGraph = \ [ ['A', ['B']], ['B', ['B', 'C', 'D']], ['C', ['A', 'B']], ['D', []] ] >>> existiertKante('A', 'D') False >>> existiertKante('B', 'D') True >>> existiertKante('X', 'Y') False
Objektorientierte Modellierung
Für die weitere Verarbeitung von Graphen ist es günstig, Graphen als Objekte
einer Klasse Graph
zu realisieren.
Aufgabe 2
(a) Überlege dir, welche Operationen ein Graph
-Objekt ausführen können soll.
Einige Operationen werden bereits in Aufgabe 1 thematisiert.
Erstelle ein Klassendiagramm zur Dokumentation der Klasse.
(b) Implementiere die Klasse Graph
. Teste die Implementierung mit einem
geeigneten Python-Dialog oder einem einfachen Testprogramm.
Aufgabe 3
Diskutiere die Vor- und Nachteile der beiden gezeigten Repräsentationsmöglichkeiten Nachbarschaftstabelle
und Nachbarschaftslisten
.