Graphen | Informationen vernetzen:

anchored to [[111.00_anchor]] belongs to [[111.08_algo_datastructures]]


Basic Definition:

Wenn wir von einem Graphen sprechen meine wir folgende Struktur:

[!Definition] Graphen was sind Graph, womit werden sie aufgebaut? wie mathematisch? #card Ein Graph besteht grundlegend aus Knoten und Kanten. Dabei sind Knoten irgendwelche Datenpunkte, die wir mit Kanten ( als Verbindungselemente ) in Beziehungen zueinander setzen können. Kanten können gerichtet ( also die Orientierung ist wichtig!) oder ungerichtet sein!

Ein Graph ist jetzt und besteht dabei aus einer Menge von Kanten, wobei ist. ( also es gibt zwischen allen Knoten Kanten, aber meist ist das nicht der Fall)

![[Pasted image 20221104101944.png]]

Es existieren also gerichtete Graphen und ungerichtete Graphen, welche sich folgend unterscheiden: #card

  • gerichtete Graphen haben Kanten mit Orientierung, also wenn wir von A -> B meinen, geht hier nicht B ->, außer wir fügen diese Kante hinzu. Dann wird daraus <->
  • ungerichtete Graphen beschreiben nur, ob etwas verbunden ist oder nicht –> hier ist keine Orientierung der Beziehung zwischen Knoten wichtig!

[!Tip] Adjazent was meinen wir damit? #card Wir nennen zwei Knoten adjazent (benachbart), wenn es eine Kante zwischen beiden gibt. Also etwa heißt, dass adjazent zueinander sind!

Notationen:

Wenn wir ungerichtete Graphen betrachten, beschreiben wir mit :: dass diese beiden benachbart sind, also zwischen beiden eine Verbindung besteht!

Betrachten wir einen gerichteten Graph, beschreiben wir mit :: , dass eine Kante von u nach v existiert, also

Kosten und Gewichte auf Kanten beschreiben wir folgend mit :: für Gewicht und für Kosten

Es gibt Spezialfälle, wo alle Kantengewichte zwei Zustände haben können :: -> keine Kante, -> eine Kante

Wir sprechen von einem Loop / Selbstschleife, wenn :: ![[Pasted image 20231109151149.png]]

Anwendung von Graphen:

Eigentlich können wir Graphen überall bzw oft anwenden, um Probleme anders darzustellen ( Bäume etwa ).
Weiterhin gibt es viele Anwendungen bei:

  • Netzwerken
  • Such-Algorithmen
  • großer Datenverarbeitung ( Interessen oder Gruppen herausfinden können )
  • using graphs for representing a cluster of possible outcomes that ought to form a consens [[462.01_consensus_algorithms]]

Grundbegriffe | Grad:

Wir möchten jetzt die Eigenschaft des Grades eines Knotens betrachten.

[!Definition] Wir definieren den Ausgangsgrad was beschreibt dieser? #card Wir beschreiben damit, die Menge an Kanten, die von dem Knoten ausgehen. Anders beschrieben also :

Wir könnun auch noch den Eingangsgrad betrachten, der analog dazu ist

[!Definition] Eingangsgrad eines Knoten was meinen wir damit? #card Der Eingangsgrad ist, analog zum Ausgangsgrad, die Menge von Kanten, die zu dem Knoten zeigen Formal beschrieben also:

Wir können jetzt noch die Zusammenführung beider “Grade” betrachten:

[!Definition] Der Grad eines Knoten was beschreibt er, wie bilden wir ihn? #card Der Grad eines Knoten beschreibt dessen Ein-, und Ausgehenden Kanten! Es werden also alle Kanten, die in Relation zu diesem Knoten stehen gezählt. Formal definieren wir ihn dann:

Folgend noch ein Beispiel, was die Nutzung beschreibt:

[!example] Grad von Knoten Betrachte folgenden Knoten ![[Pasted image 20231109152745.png]]

  • outdeg von 2 ?
  • indeg von 1 ?
  • deg von 4 und 3 ? Beantworte die Fragen #card

[!Important] Convention | Number of vertices and edges Wir werden in dieser Vorlesung nur finite Graphen betrachten, also solche bei denen gilt was ? #card –> Menge der Knoten –> Menge der Kanten ![[Pasted image 20221104103141.png]]

Pfade | Graphen folgen

Wir möchten folgend ein paar Terme definieren, die Pfade auf bzw in Graphen beschreiben können.

[!Definition] Pfade wie definieren wir einen Pfad in Graphen? #card Sei ein Graph. Wir nennen jetzt die Folge von Knoten einen Pfad, wenn für alle Kanten besagte Kanten-Kombination existiert: –> Vereinfacht gesagt heißt das, dass wir von einem Pfad sprechen, wenn wir von einem Knoten zu einem anderen Knoten durch den Graphen traversieren können. Es muss also entsprechende Kanten geben, die das ermöglichen.

Wir können jetzt noch ein Zykel als spezielle Form eines Pfades betrachten:

[!Definition] Zykle - Pfad was meinen wir mit einem Zykel? #card Mit einem Zykel meinen wir einen Pfad , wo der Startpunkt gleich dem Endpunkt ist. Also –> wir bewegen uns also Zyklisch und haben einen Kreis-PFad in dem Graphen gefunden.

[!Example] Betrachtung eines Graphes. ![[Pasted image 20231112145729.png]] Finde den Pfad und die Zykel #card

Forests | Graphen mit Binärbäumen:

Wir möchten noch den Begriff eines Forests einführen, welcher solche Graphen beschreibt, die in ihrer Form aus mehreren disjunkten Bäumen bestehen.

[!Definition] Bezeichnung eines Graphes als Baum: welche Eigenschaften (3) muss erfüllen? #card Sei hierfür ein Graph. Er heißt jetzt Baum, wenn folgendes gilt

  1. V enthält genau ein , mit –> Also ein Knoten, bei welchem nichts hineingeht und nur abgeht (Das ist die Wurzel unseres Baumes)
  2. –> Also jeder weitere Knoten hat immer genau eine Eingehende Kante –> die des parents
  3. ist azyklisch –> hat also keine einzigen Zykel in sich.

[!Important] Erweiterung eines Graphen als Forest: wann sprechen wir von Forests? #card Wir nennen einen Graphen Forest, wenn gilt, dass aus mehreren disjunkten Bäumen besteht –> also wobei ein Baum ist

[!Example] Folgend sind ein paar Forests gelistet: ![[Pasted image 20231112150733.png]]

Acyclic Graphs:

[!Definition] acyclic Graphen #card Mit acyclic Graphen bezeichnen wir solche Graphen, die in gar keinen Cyclus in den Pfaden aufweisen. Das heißt demnach, dass wir nur von einer Richtung in die andere Traversieren können, und so der Anfangs-Knoten in einem Pfad niemals der Ziel-Knoten sein kann.

Da diese Form speziell ist, bekommt sie noch ein Akronym, damit man direkt weiß, worum es geht:

[!Important] DAG - Directed - Acyclic Graph –> Sind Graphen die gerichtet sind, und dabei keinen Zykel aufweisen!

Vollständige Graphen ( Complete graphs):

Mit vollständigen Graphen beschreiben wir solche Graphen , bei denen folgend gilt: #card

  • für beliebige Knoten –> also jeder Knoten im Graphen ist mit jedem Knoten verbunden.

[!Example] Beispiel für vollständigen Graph ![[Pasted image 20231112170158.png]]

Bipartite Graphen:

Wir sprechen bei einem Graphen von bipartite, wenn folgend gilt: #card

  • Wir können die Menge der Graphen in zwei Gruppen unterteilen.
  • Dabei ist wichtig, dass sich die Knoten in einer Gruppe nicht verbinden
  • Ein jeder Knoten aus einer Gruppe trifft (alle) Knoten aus der anderen Gruppe
  • Formal heißt das: und weiterhin für die Knoten und umgekehrt

[!Example] vollständiger, bipartiter Graph ![[Pasted image 20231112170634.png]]

induzierter Graph:

Wir möchten ferner einen Teilgraphen von als induziert bezeichnen, wenn gilt: #card

  • und folgend mit gilt jetzt auch
  • Also wenn wir eine Verbindung zwischen Knoten haben und diese Knoten auch in dem neuen Graphen enthalten sind, müssen sie die alten Verbindungen übernehmen ( um gleich dann induziert genannt zu werden )

[!Example] induzierte Teilgraphen ![[Pasted image 20231112171128.png]] Er ist nicht induziert, weil hier nicht die Kanten zwischen a.g.f,b bezeichnet bzw genannt werden.

Zusammenhängend:

Wir möchten einen **ungerichteten (undirected) ** Graphen als Zusammenhängend bezeichnen, wenn #card

  • zwischen zwei beliebigen Knoten existiert ein Pfad, sodass beide Knoten verbunden werden.
  • Die Pfade müssen also die Endpunkte haben an.

Zusammenhangskomponente (ZK):

Nennen wir dann schließlich einen Bereich eines ungerichteten Graphen Zusammenhangskomponente, wenn für den Graphen gilt: #card

  • der maximale, zusammenhängende Teilgraph bezeichnet jetzt die Zusammenhangskomponente

[Example] Beispiel für Zk: ![[Pasted image 20231112171813.png]]

stark zusammenhängend:

–> Gilt nur für ==gerichtete Graphen==! Wir können jetzt einen Graphen stark zusammenhängend beschreiben, wenn folgendes gilt:

    • Das heißt also, dass es für jeden Knoten in dem Teilgraph eine Verbindung zwischen beiden Knotengibt. Dabei ist die Verbindung aber beidseitig, wir können also von aber auch !

starke Zusammenhangskomponente (SZK):

Wir beschreiben mit einem SZK :: einen maximal stark zusammenhängenden Teilgraph eines gerichteten Graphen

  • zusammenhängend, weil alle Punkte miteinander verbunden >> im Bild ersichtlich
  • maximal sodass es keinen größeren Verbund gibt, welcher ebenfalls eine Teilmenge des Graphes bildet. ![[Pasted image 20221104103745.png]]

Multi-path-Graphs

Wir können uns einen Graphen anschauen, welcher womöglich mehrere Kanten für eine Verbindung zwischen aufweist. -> Meist sind diese in ungerichteten Graphen vertreten, aber können auch in gerichteten vorkommen.

[!Example] ![[Pasted image 20221104105948.png]]

dense graph(dicht besetzter Graph) :: has very many edges :: based on context, very many is not specifically defined. Used when the number of m of edges is more than logarithmic in the number of vertices, in particular

sparse graph(dünn besetzter Graph) :: contains few edges each vertex has a very small degree compared to n possible ones. May be called sparse if number of edges is O(n log n) or O(n)(rare)

Graphen Darstellen / Repräsentieren:

Wir können Graphen jetzt grundsätzlich konstruieren und später diverse Vorteile ihres Konzeptes anwenden, brauchen aber weiterhin eine Grundform bzw. Datenstruktur in welcher wir diese Graphen repräsentieren können.

Darstellen als Matrix:

Als erste Lösung könnte man sie in Form einer Matrix bilden:

[!Definition] Adjazenzmatrix für Graph wie ist diese aufgebaut? #card Wir beschreiben die Matrix, die diese Verbindungen zwischen den einzelnen Knoten darstellt folgend: , wobei jetzt

Betrachten wir folgenden Graphen und stellen ihn als Matrix dar: ![[Pasted image 20231112181035.png]]

[!Definition] Besonderheit der Matrix bei ungerichteten Graphen Betrachten wir ungerichtete Graphen, dann sehen wir, dass sie Symmetrisch sind

Kosten und Aufwand:

Wenn wir einen z betrachten, also einen Graphen der Größe mit einer Menge von Kanten .

[!Definition] Platzbedarf für diese Matrix? Wenn wir hier Knoten haben, dann müssen wir maximal alle möglichen Knoten, also die Menge, die bei eine vollständigen Graphen auftreten könnte, abdecken können! Es folgt daher ein Platzbedarf von , denn wir brauchen eine Matrix von Größe –> jeder Knoten, kann theoretisch mit jedem Knoten verbunden sein.

[!Definition] Zugriffszeit bei einer Adjazenzmatrix: was bildet ein Problem? #card Wir wissen, wo sich bei der Matrix ein Eintrag für die Kanten befindet. Aus diesem Grund ist es ein statisches abrufen mit:

Ein Problem entsteht, wenn man dünne Graphen hat, also solche die kaum Verbindungen haben. Da ist der Platzbedarf weiterhin mit beschrieben, obwohl wir beispielsweise nur Elemente haben.

Fragen bei Matrizen:

Man kann jetzt folgende Fragen definieren:

  • Welche Knoten hat die meisten eingehenden Kanten? –> am beliebtesten
  • Welches Knotenpaar ist am weitesten auseinander?
  • Welcher Knoten ist zentral

Darstellen als Adjazenzliste:

Alternativ zu einer Matrix können wir die Abhängigkeit von Knoten auch durch Listen darstellen. Das heißt demnach, dass wir für jeden Knoten die Nachbarknoten dieser speichern.

bei gerichteten Graphen müssen wir dabei zwei Repräsentationen betrachten: welche, warum? #card

  • –> also alle die, die in einen Knoten führen
  • $OutADJ(v) = { w\in \V | (v,w) \in E }$ –> also alle die, die von dem Knoten ausgehen

bei einem ungerichteten Graphen können wir die Speicherung der Adjazenzlisten etwas vereinfachen: wie? #card

  • wir brauchen nur ob eine Verbindung vorliegt oder nicht. Es gibt also keine Information darüber, wie sie verbunden sind!
  • Dadurch folgt

Betrachten wir dafür ein Beispiel:

[!Example] Adjazenzliste eines gerichteten Graphen: Wir wollen den folgenden Graphen betrachten: ![[Pasted image 20231112190558.png]] wie sieht dessen OutADJ Liste aus? #card ![[Pasted image 20231112190613.png]]

ein weiteres Beispiel: ![[Pasted image 20221104112300.png]]

[!Important] Platz für Adjazenzlisten: wovon ist er abhängig? #card Wir können den Platz, der für eine Adjazenzliste benötigt wird folgend definieren:

[!Definition] Zugriff auf spezifische Kanten und Geschwindigkeit dieses Zugriffes ? #card Wenn wir auf eine Kante von zugreifen möchten, dann müssen wir entsprechend alle Adjazenz-Elemente von betrachten –> da diese Speichert, wohin von verbunden wird. Aus diesem Grund ist die Zugriffszeit notiert mit , wobei: meint, also die Größe der Liste, von den ausgehenden Verbindungen des Knoten

Folgerung für Adjazenzlisten:

Wie wir sehen können ist der Zugriff auf eine Adjazenliste nur so groß, wie die Menge der verbundenen Knoten, also . Weiterhin ist der Platzbedarf verhältnismäßig klein und vorallem dynamisch zur Menge von Elementen, also .

Aufgrund dieser Eigenschaften können wir folgern:

[!Definition] Platzverbrauch und Vergleich zu Matrixdarstellung #card -> die Platzverwendung ist hier deutlich effizienter, weil die Größe dynamisch mit der Menge von Knoten und Kanten linear steigt und nicht wie bei Matrizen explodiert. Es kann hier jedoch sein, dass der Zugriff langsamer ist, weil wir unter Umständen eine gewisse Menge von Einträgen durchsuchen müssen, um unsere Lösung zu finden.

When to use matrix or list:

if the graph (knowingly) is rather small - couple of 100 vertices at most - its does not matter much which representation to choose from, because the time wont differ much.

However if a graph is dense we can observe that for both representations ::both take about the same amount of storage, yet a matrix is faster for calculation and so preferred over the adjacencylist.

if graph is sparse use an adjacency list

  • there are circumstances where it is good to use adjacency matrices, because given issues could be solved using linear algebra
    • Consider the following example:
      • in an unweighted graph represented by an adjacency matrix, how can you compute the number of paths of length 2 between two vertices, using linear algebra

Weitere Betrachtungen:

  • [[111.22_Graphen_SSSP_dijkstra]]
  • [[111.18_Graphen_Traversieren]]
  • [[111.14_Graphen_gerichtet]]
  • [[111.21_algo_graphs_ShortesPathProblems]]
  • [[222.16_graph_centrality]]