Kodieren Von Graphen Allgemeine Anwendungen: ¦ ¦ ¦ ¦ Routenplaner Netzpläne Elektrische Schaltungen Gebäudeerkennung aus Luftaufnahmen Definitionen: ? Graph Ein Graph G besteht aus eine m geordneten Paar G = (V,E) mit folgenden Komponenten. V = Knotenmenge = (1,2…|V| ) – Anzahl der Knoten E = Kantenmenge: Kante ist zweielementige Teilmenge von V ? Gerichteter Graph Kante ist ein geordnetes Paar <v1,v2> , d.h. verbindet die beiden Knoten v1,v2 in einer bestimmten Richtung. d.h. <v1,v2> ? <v2,v1> ( 2 verschiedene Kanten) Bsp: Produktionsplan/ Produktionsschritte Sonderfall: Baum ? Ungerichteter Graph Kante ist ein ungeordnetes Paar <v1,v2> , d.h. verbindet die Knoten v1,v2 ohne Richtungsangabe. Bsp : Wegbeschreibung , Verkehrsnetz (ohne Einbahnstraßen) Ungerichtete Graphen sind ein Spezialfall von gerichteten Graphen , weil zu jeder (gerichteten) Kante <v1,v2> eine (gerichtete) Kante <v2,v1> existiert. d.h. <v1,v2> = <v2,v1> ( beides die gleiche Kante) Verfahren 1. Adjazenzmatrix Eine Adjazenzmatrix ist eine boolsche (n x n)-Matrix A = (aij). Die Einträge aij beschreiben die Kanten von Knoten i zu Knoten j. Besteht eine Verbindung zwischen den Knoten i und j, so ist aij gleich 1, sonst gleich 0. Handelt es sich bei dem Graph um einen ungerichteten Graph, so ist die Matrix symmetrisch. Gewichteter Graph: Um die Kantenbewertungen abzulegen wird oft anstatt der boolschen Matrix eine reelle Matrix verwendet, wo an jeder Stelle aij die Bewertung steht (1 für nicht vorhandene Kante). Diese Matrix wird oft Strukturmatrix genannt. Speicherbedarf: = |V| ? unabhängig von der Anzahl der Kanten ? ungünstig für Graphen mit wenig Kanten ? Adjazenzmatrix für dichte (hohe Kantenanzahl) Graphen geeignet 2. Inzidenzmatrix Bei einer Inzidenzmatrix A = (aij) wird jeder Knoten durch eine Zeile und jede Kante durch eine Spalte beschrieben. Wenn die Kante j den Knoten i verlässt, ist aij=-1. Wenn die Kante j auf den Knoten i zeigt, ist aij=1. Ansonsten ist aij=0. Speicherbedarf: = |V|*|E| ? Speicherbedarf hängt sowohl von der Kanten- als auch von der Knotenanzahl ab. ? Die Inzidenzmatrix verbraucht somit bei Graphen mit geringer Kantenanzahl (|E|<|V|) weniger Speicherplatz als die Adjazenzmatrix bei größer Anzahl von Kanten (|E|>|V|) ist es genau umgekehrt. Im Computer haben Adjazenz- bzw. Inzidenzmatrizen den Vorteil von schnellen Zugriffs- und Berechnungszeiten. Der Vorteil der Matrizendarstellung ist, daß man sofort entscheiden kann ob eine Kante im Graph enthalten ist oder nicht. Sie haben allerdings zwei entscheidende Nachteile. Zum einen ist die Größe des Graphen durch die Festlegung der Matrixgröße begrenzt. Dies kann man nur durch aufwendige Darstellungen einer Matrix beheben. Zum anderen ist eine Adjazenzbzw. Inzidenzmatrix nur für relativ dichte Graphen vorteilhaft, da die meisten Einträge bei lichten Graphen Null sind. Nullen zu speichern nimmt unnötig viel Speicherplatz in Anspruch. Obwohl Adjazenzlisten aufwendiger zu programmieren sind, kann man mit ihnen die beiden erwähnten Nachteile beheben. 3.Adjazenzlisten Die Grundidee einer Adjazenzliste ist, jeden Knoten in einem Graph mit seinen Adjazenzknoten (benachbarten Knoten) direkt zu verbinden. Dazu werden die Knoten in einem Feld abgelegt. Jeder Knoten besitzt einen Verweis auf eine Liste welche alle benachbarten Knoten enthält. Speicherbedarf: Für gerichtete Graphen = |V|+|E| Für ungerichtete Graphen = |V|+2|E| ? Die Kodierungslänge steigt mit wachsender Kantenanzahl stark an. Bereits ab ca. 18% der möglichen Kantenanzahl werden mehr Bits als für die Adjazenzmatrix benötigt. Adjazenz-Listen können leicht angepasst werden um gewichtete Graphen darzustellen. Bei einem gewichteten Graph hat jede Kante ein Gewicht. Dieses Gewicht lässt sich beim Knoten v in der Liste ADJ[v] abspeichern. Diese Darstellung ist einfach und robust. Der einzige Nachteil ist, dass man nicht schnell so leicht feststellen kann, ob Kante (v1,v2) im Graph enthalten ist. Man muss dann die Liste Adj[v1] durchsuchen. Diese Datenstruktur ist viel komplexer als eine Matrix. Sie ist aber für lichte Graphen, wie sie im Verkehrswesen zum überwiegenden Teil auftreten, sehr gut geeignet. 4. Inzidenzlisten Kanten und Knoten werden in separate Listen gespeichert. Jeder Kanteneintrag beinhaltet eine Referenz zum Quellknoten und Zielknoten. Speicherbedarf: = |V|+|E| ? bei ungerichteten Graphen kann einfach eine andere Interpretation der Kantenliste erfolgen wodurch der Speicherbedarf nicht vergrößert wird , ansonsten steigt der Speicherbedarf wie bei Adj-Listen auf |V|+2|E| an. Prüfung auf Enthaltensein einer Kante <v1,v2> jedoch sehr schwierig da evtl. die gesamte Kantenliste durchlaufen werden muss. 5. Permutationsreihe Ein anderer Ansatz zur kompakten Codierung von Graphen wurde von Cook und Holder im Rahmen einer Forschungsarbeit im Bereich des maschinellen Lernens vorgestellt. Cook und Holder nutzen dieses Stringcodierschema nun zur Codierung der Adjazenzmatrizen von Graphen. Dabei wird jede Zeile eines Graphen als Bitstring aufgefasst, und es werden für jede Zeile die Anzahl der Einsen sowie die Nummer der Permutation codiert. Die maximale Anzahl von Einsen pro Zeile ist durch den maximalen Knotengrad des Graphen beschränkt. Deshalb wird nach der Codierung der Knotenanzahl des Graphen zunächst der maximale Knotengrad codiert. Bsp: