Kodieren Von Graphen

Werbung
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:
Herunterladen