From a6b1b84cbcf02087a3c8d43b93ac084e9056979c Mon Sep 17 00:00:00 2001
From: rode <rode@ibr.cs.tu-bs.de>
Date: Tue, 5 Oct 2021 16:26:10 +0200
Subject: [PATCH] =?UTF-8?q?Aufl=C3=B6sung=20von=20Zeichenkonflikten,=20Anp?=
 =?UTF-8?q?assung=20des=20xlsxTOjson-Parsers?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 datasets/AuD-Inhalt2.xlsx |  Bin 35983 -> 36276 bytes
 datasets/aud1v3.json      | 1582 ++++++++++++++++++-------------------
 datasets/xlsxTOjson.ipynb |   56 +-
 3 files changed, 823 insertions(+), 815 deletions(-)

diff --git a/datasets/AuD-Inhalt2.xlsx b/datasets/AuD-Inhalt2.xlsx
index 3eef912de1b19d3d2535e0d80a8465047f519bdf..88ed8af2497b9cc61d7e2338019ed9f1e9f24e09 100644
GIT binary patch
delta 29652
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

delta 29322
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

diff --git a/datasets/aud1v3.json b/datasets/aud1v3.json
index fa2c308..042192c 100644
--- a/datasets/aud1v3.json
+++ b/datasets/aud1v3.json
@@ -1,1362 +1,1362 @@
 {
-  "nodes": [
+  'nodes': [
     {
-      "id": 1,
-      "name": "Einführung",
-      "description": "Eine Einführung in die Algorithmen und Datenstrukturen\\n+ Links zu Video und Folien",
-      "type": "Vorlesung"
+      'id': 1,
+      'name': 'Begrüßung und Organisatorisches',
+      'description': 'Eine Einführung in die Algorithmen und Datenstrukturen\n+ Links zu Video und Folien',
+      'type': 'Vorlesung'
     },
     {
-      "id": 2,
-      "name": "Rundreise Problem",
-      "description": "Gegeben: Ein Graph G = (V, E) mit Kantenlängen we, Gesucht: Eine kürzeste Rundreise, welche alle Knoten im Graphen einmal besucht und im Startknoten wieder endet.",
-      "type": "Beispiel"
+      'id': 2,
+      'name': 'Rundreise Problem',
+      'description': 'Gegeben: Ein Graph G = (V, E) mit Kantenlängen we, Gesucht: Eine kürzeste Rundreise, welche alle Knoten im Graphen einmal besucht und im Startknoten wieder endet.',
+      'type': 'Beispiel'
     },
     {
-      "id": 3,
-      "name": "Puzzle",
-      "description": "Jeder hat schon einmal ein Puzzle gelöst, doch wie sieht das aus algorithmischer Sicht aus?",
-      "type": "Beispiel"
+      'id': 3,
+      'name': 'Puzzle',
+      'description': 'Jeder hat schon einmal ein Puzzle gelöst, doch wie sieht das aus algorithmischer Sicht aus?',
+      'type': 'Beispiel'
     },
     {
-      "id": 4,
-      "name": "Algorithmus-Definition",
-      "description": "“Ein Algorithmus ist eine aus endlich vielen Schritten bestehende eindeutige Handlungsvorschrift zur Lösung eines Problems oder einer Klasse von Problemen.”-Wikipedia. Dabei wird als Input eine Problembeschreibung gegeben und durch Anwendung des Algorithmus eine fertige Lösung des Problems ermittelt. Oft spielt die Laufzeit des Algorithmus eine große Rolle. Sie beschreibt, wie viele einzelne Schritte nötig sind um das Problem zu lösen, in Abhängigkeit von der Größe des Problems.",
-      "type": "Definition"
+      'id': 4,
+      'name': 'Algorithmus-Definition',
+      'description': "Zitat: 'Ein Algorithmus ist eine aus endlich vielen Schritten bestehende eindeutige Handlungsvorschrift zur Lösung eines Problems oder einer Klasse von Problemen.'-Wikipedia. Dabei wird als Input eine Problembeschreibung gegeben und durch Anwendung des Algorithmus eine fertige Lösung des Problems ermittelt. Oft spielt die Laufzeit des Algorithmus eine große Rolle. Sie beschreibt, wie viele einzelne Schritte nötig sind um das Problem zu lösen, in Abhängigkeit von der Größe des Problems.",
+      'type': 'Definition'
     },
     {
-      "id": 5,
-      "name": "Kofferpacken",
-      "description": "Kann ich alle meine Gepäckstücke auf zwei gleich große Koffer aufteilen? Gegeben: Eine Menge von n Objekten, jedes mit\\neiner Größe li; Gesamtgröße ∑ li = 2K\\nGesucht: Eine Verteilung auf zwei Koffer der Größe K",
-      "type": "Beispiel"
+      'id': 5,
+      'name': 'Kofferpacken',
+      'description': 'Kann ich alle meine Gepäckstücke auf zwei gleich große Koffer aufteilen? Gegeben: Eine Menge von n Objekten, jedes mit\neiner Größe li; Gesamtgröße ∑ li = 2K\nGesucht: Eine Verteilung auf zwei Koffer der Größe K',
+      'type': 'Beispiel'
     },
     {
-      "id": 6,
-      "name": "P und NP",
-      "description": "Die Klassen P und NP teilen algorithmische Probleme in zwei Kategorien auf. Die eine, bei der man mithilfe eines Algorithmus eine Lösung Pfinden kann (P) und eine zweite, bei der bisher nur das NachPrüfen einer existierenden Lösung gelingt (NP). Wenn es allerdings keine Lösung gibt, so lässt sich das bei Problemen der Klasse NP nur schlecht beweisen.",
-      "type": "Definition"
+      'id': 6,
+      'name': 'P und NP',
+      'description': 'Die Klassen P und NP teilen algorithmische Probleme in zwei Kategorien auf. Die eine, bei der man mithilfe eines Algorithmus eine Lösung Pfinden kann (P) und eine zweite, bei der bisher nur das NachPrüfen einer existierenden Lösung gelingt (NP). Wenn es allerdings keine Lösung gibt, so lässt sich das bei Problemen der Klasse NP nur schlecht beweisen.',
+      'type': 'Definition'
     },
     {
-      "id": 7,
-      "name": "Algorithmen und Datenstrukturen",
-      "description": "In dieser Vorlesung wird der Begriff \'Algorithmus\' definiert und erklärt.\\n+ Links zu Video und Folien",
-      "type": "Vorlesung"
+      'id': 7,
+      'name': 'Einführung des Algorithmusbegriffs',
+      'description': "In dieser Vorlesung wird der Begriff 'Algorithmus' definiert und erklärt.\n+ Links zu Video und Folien",
+      'type': 'Vorlesung'
     },
     {
-      "id": 8,
-      "name": "Datenstrukturen",
-      "description": "Eine Datenstruktur erlaubt es, die für eine Aufgabe notwendigen Informationen geeignet zu repräsentieren und den Zugriff und die Verwaltung während der Bearbeitung in effizienter Weise zu ermöglichen.",
-      "type": "Definition"
+      'id': 8,
+      'name': 'Datenstrukturen',
+      'description': 'Eine Datenstruktur erlaubt es, die für eine Aufgabe notwendigen Informationen geeignet zu repräsentieren und den Zugriff und die Verwaltung während der Bearbeitung in effizienter Weise zu ermöglichen.',
+      'type': 'Definition'
     },
     {
-      "id": 21,
-      "name": "Organisation und Pseudocode",
-      "description": "In dieser Ãœbung haben wir noch einmal organisatorische Dinge besprochen und uns mit dem Thema Pseudocode auseinandergesetzt.\\n+ Links zu Video und Folien",
-      "type": "Ãœbung"
+      'id': 21,
+      'name': 'Organisation und Pseudocode',
+      'description': 'In dieser Ãœbung haben wir noch einmal organisatorische Dinge besprochen und uns mit dem Thema Pseudocode auseinandergesetzt.\n+ Links zu Video und Folien',
+      'type': 'Ãœbung'
     },
     {
-      "id": 9,
-      "name": "Pseudocode",
-      "description": "Pseudocode ist eine Art Algorithmen einigermaßen einheitlich zu notieren. Dabei werden zwar Schlüsselwörter genutzt um eine gewisse Einheitlichkeit zu bieten und gleichzeitig die Logik zu beschreiben, allerdings geht es noch nicht darum einen compilierbaren Code mit korrekter Syntax zu schreiben.\\n+ Link zu Pseudocodeblatt, Übung 1",
-      "type": "Definition"
+      'id': 9,
+      'name': 'Pseudocode',
+      'description': 'Pseudocode ist eine Art Algorithmen einigermaßen einheitlich zu notieren. Dabei werden zwar Schlüsselwörter genutzt um eine gewisse Einheitlichkeit zu bieten und gleichzeitig die Logik zu beschreiben, allerdings geht es noch nicht darum einen compilierbaren Code mit korrekter Syntax zu schreiben.\n+ Link zu Pseudocodeblatt, Übung 1',
+      'type': 'Definition'
     },
     {
-      "id": 10,
-      "name": "Einleitung in die Graphen",
-      "description": "Eine Einleitung in die Welt der Graphen am wohl bekanntesten Beispiel, dem Haus des Nikolaus.\\n+ Links zu Video und Folien",
-      "type": "Vorlesung"
+      'id': 10,
+      'name': 'Einleitung in die Graphen',
+      'description': 'Eine Einleitung in die Welt der Graphen am wohl bekanntesten Beispiel, dem Haus des Nikolaus.\n+ Links zu Video und Folien',
+      'type': 'Vorlesung'
     },
     {
-      "id": 11,
-      "name": "Haus des Nikolaus",
-      "description": "Jeder kennt das Haus vom Nikolaus, doch wie wird es gemalt? Wo setzt man den Stift an und wo wieder ab?",
-      "type": "Beispiel"
+      'id': 11,
+      'name': 'Haus des Nikolaus',
+      'description': 'Jeder kennt das Haus vom Nikolaus, doch wie wird es gemalt? Wo setzt man den Stift an und wo wieder ab?',
+      'type': 'Beispiel'
     },
     {
-      "id": 12,
-      "name": "Eulertouren",
-      "description": "Ein Eulerweg ist ein Weg in einem Graphen, welcher alle Kanten nutzt. Eine Eulertour kehrt darüber hinaus auch zum Startknoten zurück.",
-      "type": "Definition"
+      'id': 12,
+      'name': 'Eulertouren',
+      'description': 'Ein Eulerweg ist ein Weg in einem Graphen, welcher alle Kanten nutzt. Eine Eulertour kehrt darüber hinaus auch zum Startknoten zurück.',
+      'type': 'Definition'
     },
     {
-      "id": 13,
-      "name": "Graphenbegriffe",
-      "description": "Ein Graph besteht aus Knoten und Kanten das sollte inzwischen jeder wissen, doch was parallele Kanten, Schleifen, (geschlossene) Wege, Pfade, Kreise, Eulerwege/-touren, sowie Hamiltonpfade und -kreise sind wird in dieser Vorlesung noch einmal genau definiert.\\n+ Links zu Video und Folien",
-      "type": "Vorlesung"
+      'id': 13,
+      'name': 'Graphenbegriffe',
+      'description': 'Ein Graph besteht aus Knoten und Kanten das sollte inzwischen jeder wissen, doch was parallele Kanten, Schleifen, (geschlossene) Wege, Pfade, Kreise, Eulerwege/-touren, sowie Hamiltonpfade und -kreise sind wird in dieser Vorlesung noch einmal genau definiert.\n+ Links zu Video und Folien',
+      'type': 'Vorlesung'
     },
     {
-      "id": 14,
-      "name": "Graph",
-      "description": "Über Graphen haben wir bereits viel gesprochen, doch was ein Graph genau ist und wie man ihn definiert erfährst du hier.",
-      "type": "Definition"
+      'id': 14,
+      'name': 'Graph',
+      'description': 'Über Graphen haben wir bereits viel gesprochen, doch was ein Graph genau ist und wie man ihn definiert erfährst du hier.',
+      'type': 'Definition'
     },
     {
-      "id": 15,
-      "name": "Wege in Graphen",
-      "description": "Eine Kantenfolge W in einem Graphen G heißt Weg, wenn sich keine Kante darin wiederholt und geschlossener Weg (Tour), wenn man am Ende wieder am Startknoten ankommt. Wiederholt sich kein Knoten spricht man von einem Pfad. Ein Kreis ist ein geschlossener Pfad. Bei einem Eulerweg/ einer Eulertour werden alle Kanten des Graphen genutzt. Ein Hamiltonpfad/kreis nutzt hingegen alle Knoten.",
-      "type": "Definition"
+      'id': 15,
+      'name': 'Wege in Graphen',
+      'description': 'Eine Kantenfolge W in einem Graphen G heißt Weg, wenn sich keine Kante darin wiederholt und geschlossener Weg (Tour), wenn man am Ende wieder am Startknoten ankommt. Wiederholt sich kein Knoten spricht man von einem Pfad. Ein Kreis ist ein geschlossener Pfad. Bei einem Eulerweg/ einer Eulertour werden alle Kanten des Graphen genutzt. Ein Hamiltonpfad/kreis nutzt hingegen alle Knoten.',
+      'type': 'Definition'
     },
     {
-      "id": 16,
-      "name": "Beweistechniken",
-      "description": "In der Mathematik und auch in der Algorithmik spielen Beweise immer wieder eine große Rolle. Es geht darum Aussagen zu belegen, zu widerlegen oder auf bestimmte Elemente anzuwenden. Dazu gibt es verschiedene Beweistechniken, welche ihr hier finden könnt:\\n+ Link zu Beweisblatt, Übung 2",
-      "type": "Ãœbung"
+      'id': 16,
+      'name': 'Beweistechniken Teil 1',
+      'description': 'In der Mathematik und auch in der Algorithmik spielen Beweise immer wieder eine große Rolle. Es geht darum Aussagen zu belegen, zu widerlegen oder auf bestimmte Elemente anzuwenden. Dazu gibt es verschiedene Beweistechniken, welche ihr hier finden könnt:\n+ Link zu Beweisblatt, Übung 2',
+      'type': 'Ãœbung'
     },
     {
-      "id": 17,
-      "name": "Eulertouren",
-      "description": "In dieser Vorlesung werden notwendige Bedingungen für Eulertouren erleutert. Zusätzlich wird das Kapitel 2 noch einmal zusammengefasst und es werden Algorithmen eingeführt um die uns bisher bekannten Probleme zu lösen.\\n+ Links zu Video und Folien",
-      "type": "Vorlesung"
+      'id': 17,
+      'name': 'Bedingungen für Eulertouren',
+      'description': 'In dieser Vorlesung werden notwendige Bedingungen für Eulertouren erleutert. Zusätzlich wird das Kapitel 2 noch einmal zusammengefasst und es werden Algorithmen eingeführt um die uns bisher bekannten Probleme zu lösen.\n+ Links zu Video und Folien',
+      'type': 'Vorlesung'
     },
     {
-      "id": 18,
-      "name": "Algorithmus Wegfindung",
-      "description": "Dieser Algorithmus (2.7) erhält als Input einen Graphen G mit höchstens zwei ungeraden Knoten und liefert als Output einen Weg in G",
-      "type": "Algorithmus"
+      'id': 18,
+      'name': 'Algorithmus Wegfindung',
+      'description': 'Dieser Algorithmus (2.7) erhält als Input einen Graphen G mit höchstens zwei ungeraden Knoten und liefert als Output einen Weg in G',
+      'type': 'Algorithmus'
     },
     {
-      "id": 19,
-      "name": "Algorithmus von Hierholzer",
-      "description": "Dieser Algorithmus (2.8) erhält als Input einen zusammenhängenden Graphen G mit höchstens zwei ungeraden Knoten und liefert als Output einen Eulerweg, bzw. eine Eulertour in G. Dazu wird auch Algorithmus 2.7 zum Finden von Wegen in G verwendet.",
-      "type": "Algorithmus"
+      'id': 19,
+      'name': 'Algorithmus von Hierholzer',
+      'description': 'Dieser Algorithmus (2.8) erhält als Input einen zusammenhängenden Graphen G mit höchstens zwei ungeraden Knoten und liefert als Output einen Eulerweg, bzw. eine Eulertour in G. Dazu wird auch Algorithmus 2.7 zum Finden von Wegen in G verwendet.',
+      'type': 'Algorithmus'
     },
     {
-      "id": 20,
-      "name": "Algorithmus von Fleury",
-      "description": "Dieser Algorithmus(2.13) erhält als Input einen Graphen G mit höchstens 2 ungeraden Knoten und liefert als Output einen Weg in G. Der Algorithmus hat als Grundlage Algorithmus 2.7 zum Finden von Wegen. Auch lässt sich zeigen, dass man mit diesem Algorithmus eine Eulertour/einen Eulerweg finden kann",
-      "type": "Algorithmus"
+      'id': 20,
+      'name': 'Algorithmus von Fleury',
+      'description': 'Dieser Algorithmus(2.13) erhält als Input einen Graphen G mit höchstens 2 ungeraden Knoten und liefert als Output einen Weg in G. Der Algorithmus hat als Grundlage Algorithmus 2.7 zum Finden von Wegen. Auch lässt sich zeigen, dass man mit diesem Algorithmus eine Eulertour/einen Eulerweg finden kann',
+      'type': 'Algorithmus'
     },
     {
-      "id": 22,
-      "name": "Anwendung von Graphen",
-      "description": "In dieser Vorlesung geht es um den Einsatzzweck von Graphen und es wird am Beispiel der Erdös- und der Kevin Bacon Zahl gezeigt, welche Zusammenhänge dargestellt werden können.\\n+ Links zu Video und Folien",
-      "type": "Vorlesung"
+      'id': 22,
+      'name': 'Anwendung von Graphen',
+      'description': 'In dieser Vorlesung geht es um den Einsatzzweck von Graphen und es wird am Beispiel der Erdös- und der Kevin Bacon Zahl gezeigt, welche Zusammenhänge dargestellt werden können.\n+ Links zu Video und Folien',
+      'type': 'Vorlesung'
     },
     {
-      "id": 23,
-      "name": "Beweistechniken Teil 2",
-      "description": "In dieser Übung geht es um die Beweistechnik der vollständigen Induktion. Diese ist die wohl meist benutzte Beweistechnik in der Algorithmik. Auch werden Anwendungsbeispiele wie z.B. die Gauß\'sche Summenformel oder der Zusammenhang in Graphen  erläutert.\\n+ Links zu Video und Folien/Notizen",
-      "type": "Ãœbung"
+      'id': 23,
+      'name': 'Beweistechniken Teil 2',
+      'description': "In dieser Übung geht es um die Beweistechnik der vollständigen Induktion. Diese ist die wohl meist benutzte Beweistechnik in der Algorithmik. Auch werden Anwendungsbeispiele wie z.B. die Gauß'sche Summenformel oder der Zusammenhang in Graphen  erläutert.\n+ Links zu Video und Folien/Notizen",
+      'type': 'Ãœbung'
     },
     {
-      "id": 24,
-      "name": "Graphenscan",
-      "description": "In dieser Vorlesung wird der Graphenscanalgorithmus vorgestellt um Zusammenhangskomponenten in Graphen zu finden.\\n+ Links zu Video und Folien/Notizen/Beweis",
-      "type": "Vorlesung"
+      'id': 24,
+      'name': 'Graphenscan',
+      'description': 'In dieser Vorlesung wird der Graphenscanalgorithmus vorgestellt um Zusammenhangskomponenten in Graphen zu finden.\n+ Links zu Video und Folien/Notizen/Beweis',
+      'type': 'Vorlesung'
     },
     {
-      "id": 25,
-      "name": "Algorithmus Graphenscan",
-      "description": "Dieser Algorithmus (3.7) erhählt als Input einen Graphen G = (V,E) und einen Knoten s darin und liefert als Output eine Knotenmenge Y aus V, die von s aus erreichbar ist, sowie eine Kantenmenge T aus E, welche die Erreichbarkeit sicherstellt",
-      "type": "Algorithmus"
+      'id': 25,
+      'name': 'Algorithmus Graphenscan',
+      'description': 'Dieser Algorithmus (3.7) erhählt als Input einen Graphen G = (V,E) und einen Knoten s darin und liefert als Output eine Knotenmenge Y aus V, die von s aus erreichbar ist, sowie eine Kantenmenge T aus E, welche die Erreichbarkeit sicherstellt',
+      'type': 'Algorithmus'
     },
     {
-      "id": 26,
-      "name": "Datenstrukturen Teil 1",
-      "description": "In dieser Vorlesung werden die Datenstrukturen Warteschlange (First In - First Out) und Stapel (Last In - First Out) vorgestellt. Außerdem geht es um ihre Rolle für Algorithmen und wie man sie implementieren kann. Das ganze wird am Beispiel des Graphscan Algorithmus gezeigt und somit werden auch Breiten- und Tiefensuche eingeführt.\\n+ Links zu Video und Folien/Beispiel",
-      "type": "Vorlesung"
+      'id': 26,
+      'name': 'Datenstrukturen Teil 1',
+      'description': 'In dieser Vorlesung werden die Datenstrukturen Warteschlange (First In - First Out) und Stapel (Last In - First Out) vorgestellt. Außerdem geht es um ihre Rolle für Algorithmen und wie man sie implementieren kann. Das ganze wird am Beispiel des Graphscan Algorithmus gezeigt und somit werden auch Breiten- und Tiefensuche eingeführt.\n+ Links zu Video und Folien/Beispiel',
+      'type': 'Vorlesung'
     },
     {
-      "id": 27,
-      "name": "Warteschlange",
-      "description": "Eine Warteschlange ist eine Datenstruktur, welche nach dem Prinzip \'First In - First Out\' arbeitet. Man findet sie auch im alltäglichen Leben oft wieder, wenn man sich beispielsweise an der Kasse anstellen muss. Der Kunde der zuerst da war, wir auch zuerst bedient.",
-      "type": "Definition"
+      'id': 27,
+      'name': 'Warteschlange',
+      'description': "Eine Warteschlange ist eine Datenstruktur, welche nach dem Prinzip 'First In - First Out' arbeitet. Man findet sie auch im alltäglichen Leben oft wieder, wenn man sich beispielsweise an der Kasse anstellen muss. Der Kunde der zuerst da war, wir auch zuerst bedient.",
+      'type': 'Definition'
     },
     {
-      "id": 28,
-      "name": "Stapel",
-      "description": "Ein Stapel ist eine Datenstruktur, welche nach dem Prinzip \'Last In - First Out\' arbeitet. Im alltäglichen Leben findet man diese Form der Datenstruktur beim Geschirr abwaschen, man stapelt die Teller und der Teller der zuletzt dreckig wurde wird als erstes gereinigt, da man die Teller von oben herunter nimmt.",
-      "type": "Definition"
+      'id': 28,
+      'name': 'Stapel',
+      'description': "Ein Stapel ist eine Datenstruktur, welche nach dem Prinzip 'Last In - First Out' arbeitet. Im alltäglichen Leben findet man diese Form der Datenstruktur beim Geschirr abwaschen, man stapelt die Teller und der Teller der zuletzt dreckig wurde wird als erstes gereinigt, da man die Teller von oben herunter nimmt.",
+      'type': 'Definition'
     },
     {
-      "id": 29,
-      "name": "Breitensuche",
-      "description": "Die Breitensuche ist im Prinzip der Graphscan Algorithmus, ausgeführt mithilfe einer Warteschlange als Datenstruktur. Sie breitet sich aus wie eine Welle.",
-      "type": "Algorithmus"
+      'id': 29,
+      'name': 'Breitensuche',
+      'description': 'Die Breitensuche ist im Prinzip der Graphscan Algorithmus, ausgeführt mithilfe einer Warteschlange als Datenstruktur. Sie breitet sich aus wie eine Welle.',
+      'type': 'Algorithmus'
     },
     {
-      "id": 30,
-      "name": "Tiefensuche",
-      "description": "Die Breitensuche ist im Prinzip der Graphscan Algorithmus, ausgeführt mithilfe eines Stapels als Datenstruktur. Dabei werden eher einzelne Pfade gelaufen.",
-      "type": "Algorithmus"
+      'id': 30,
+      'name': 'Tiefensuche',
+      'description': 'Die Breitensuche ist im Prinzip der Graphscan Algorithmus, ausgeführt mithilfe eines Stapels als Datenstruktur. Dabei werden eher einzelne Pfade gelaufen.',
+      'type': 'Algorithmus'
     },
     {
-      "id": 31,
-      "name": "Datenstrukturen Teil 2",
-      "description": "In dieser Vorlesung geht es einerseits um die Anwendung der Breitensuche, andererseits werden noch 2 weitere Datenstrukturen eingeführt: Die Inzidenz/-Adjazenzmatrix, sowie die Kantenliste\\n+ Links zu Video und Folien/Notizen",
-      "type": "Vorlesung"
+      'id': 31,
+      'name': 'Datenstrukturen Teil 2',
+      'description': 'In dieser Vorlesung geht es einerseits um die Anwendung der Breitensuche, andererseits werden noch 2 weitere Datenstrukturen eingeführt: Die Inzidenz/-Adjazenzmatrix, sowie die Kantenliste\n+ Links zu Video und Folien/Notizen',
+      'type': 'Vorlesung'
     },
     {
-      "id": 32,
-      "name": "Inzidenz/-Adjazenzmatrix",
-      "description": "In einer Inzidenzmatrix wird mithilfe von 1en und 0en dargestellt, welche Knoten mit welchen Kanten inzident (zusammentreffend) sind. Bei einer Adjazenzmatrix wird dargestellt, welche Knoten adjazent (durch eine Kante verbunden) sind.",
-      "type": "Definition"
+      'id': 32,
+      'name': 'Inzidenz/-Adjazenzmatrix',
+      'description': 'In einer Inzidenzmatrix wird mithilfe von 1en und 0en dargestellt, welche Knoten mit welchen Kanten inzident (zusammentreffend) sind. Bei einer Adjazenzmatrix wird dargestellt, welche Knoten adjazent (durch eine Kante verbunden) sind.',
+      'type': 'Definition'
     },
     {
-      "id": 33,
-      "name": "Kanten-/Adjazenzliste",
-      "description": "Eine Kantenliste ist eine Liste bestehend aus einträgen der Form {vx, vy}, welche bedeuten, dass eine Kante zwischen vx und vy im Graphen existiert.",
-      "type": "Definition"
+      'id': 33,
+      'name': 'Kanten-/Adjazenzliste',
+      'description': 'Eine Kantenliste ist eine Liste bestehend aus einträgen der Form {vx, vy}, welche bedeuten, dass eine Kante zwischen vx und vy im Graphen existiert.',
+      'type': 'Definition'
     },
     {
-      "id": 34,
-      "name": "Wachstum/O-Notation",
-      "description": "In dieser Vorlesung wird noch einmal mit den Adjazenz- und Kantenlisten abgeschlossen. Außerdem schauen wir uns einmal das Wachstum von Funktionen an und definieren und die O-Notation um damit zu arbeiten.\\n+ Links zu Video und Folien/Notizen",
-      "type": "Vorlesung"
+      'id': 34,
+      'name': 'Wachstum/O-Notation',
+      'description': 'In dieser Vorlesung wird noch einmal mit den Adjazenz- und Kantenlisten abgeschlossen. Außerdem schauen wir uns einmal das Wachstum von Funktionen an und definieren und die O-Notation um damit zu arbeiten.\n+ Links zu Video und Folien/Notizen',
+      'type': 'Vorlesung'
     },
     {
-      "id": 35,
-      "name": "O-Notation",
-      "description": "Die O-Notation wird genutzt um das Wachstum von Funktionen abzuschätzen. Damit können Größenordnungen und Wachstumsverhalten beschrieben werden.",
-      "type": "Definition"
+      'id': 35,
+      'name': 'O-Notation',
+      'description': 'Die O-Notation wird genutzt um das Wachstum von Funktionen abzuschätzen. Damit können Größenordnungen und Wachstumsverhalten beschrieben werden.',
+      'type': 'Definition'
     },
     {
-      "id": 36,
-      "name": "Graphscan Ãœbung",
-      "description": "Simple Anwengung des Graphscan Algorithmus, einmal als Breiten- und als Tiefensuche. Wann welcher Algorithmus besser geeignet ist wird in dieser Übung erklärt.",
-      "type": "Ãœbung"
+      'id': 36,
+      'name': 'Graphscan Ãœbung',
+      'description': 'Simple Anwengung des Graphscan Algorithmus, einmal als Breiten- und als Tiefensuche. Wann welcher Algorithmus besser geeignet ist wird in dieser Übung erklärt.',
+      'type': 'Ãœbung'
     },
     {
-      "id": 37,
-      "name": "Wachstum",
-      "description": "Die O-Notation wird genutzt um das Wachstum von Funktionen abzuschätzen. In dieser Übung werden Zusammenhänge zwischen der Größe des Inputs und dem Wachstum, sowie Relationen zwischen Laufzeitklassen näher beleuchtet. Auch wird die O-Notation an verschiedenen Beispielen erklärt.",
-      "type": "Ãœbung"
+      'id': 37,
+      'name': 'Wachstum',
+      'description': 'Die O-Notation wird genutzt um das Wachstum von Funktionen abzuschätzen. In dieser Übung werden Zusammenhänge zwischen der Größe des Inputs und dem Wachstum, sowie Relationen zwischen Laufzeitklassen näher beleuchtet. Auch wird die O-Notation an verschiedenen Beispielen erklärt.',
+      'type': 'Ãœbung'
     },
     {
-      "id": 38,
-      "name": "Wiederholung oder\\nSuche in Graphen Zusammenfassung",
-      "description": "Noch einmal ein Rückblick auf alles, was bisher in \'Kapitel 3: Suche in Graphen\' passiert ist. \\n+ Links zu Video und Folien",
-      "type": "Vorlesung"
+      'id': 38,
+      'name': 'Wiederholung oder\nSuche in Graphen Zusammenfassung',
+      'description': "Noch einmal ein Rückblick auf alles, was bisher in 'Kapitel 3: Suche in Graphen' passiert ist. \n+ Links zu Video und Folien",
+      'type': 'Vorlesung'
     },
     {
-      "id": 39,
-      "name": "Eigenschaften von DFS und BFS",
-      "description": "In dieser Vorlesung betrachten wir die Breiten- und Tiefensuche im Hinblick auf ihre Laufzeit. Dabei wird anschaulich, wie die Algorithmen arbeiten, wann man sie am besten nutzen sollte und wie man Laufzeiten beweisen kann.\\n+ Links zu Video und Folien/Notizen",
-      "type": "Vorlesung"
+      'id': 39,
+      'name': 'Eigenschaften von DFS und BFS',
+      'description': 'In dieser Vorlesung betrachten wir die Breiten- und Tiefensuche im Hinblick auf ihre Laufzeit. Dabei wird anschaulich, wie die Algorithmen arbeiten, wann man sie am besten nutzen sollte und wie man Laufzeiten beweisen kann.\n+ Links zu Video und Folien/Notizen',
+      'type': 'Vorlesung'
     },
     {
-      "id": 40,
-      "name": "Induktionsbeweise Bsp.",
-      "description": "Einige Beispiele, bei denen der Induktionsbeweis auch in der Graphentheorie zum Einsatz kommt. ",
-      "type": "Beispiel"
+      'id': 40,
+      'name': 'Induktionsbeweise Bsp.',
+      'description': 'Einige Beispiele, bei denen der Induktionsbeweis auch in der Graphentheorie zum Einsatz kommt. ',
+      'type': 'Beispiel'
     },
     {
-      "id": 41,
-      "name": "Adjazenzliste",
-      "description": "Wie eine Adjazenzliste für einen Graphen erstellt werden kann wird hier einmal genauer beleuchtet.",
-      "type": "Beispiel"
+      'id': 41,
+      'name': 'Adjazenzliste',
+      'description': 'Wie eine Adjazenzliste für einen Graphen erstellt werden kann wird hier einmal genauer beleuchtet.',
+      'type': 'Beispiel'
     },
     {
-      "id": 42,
-      "name": "Graphscan Beispiel",
-      "description": "Hier wird der Graphscan Algorithmus einmal mithilfe einer Adjazenzliste als Datenstruktur durchgeführt.",
-      "type": "Beispiel"
+      'id': 42,
+      'name': 'Graphscan Beispiel',
+      'description': 'Hier wird der Graphscan Algorithmus einmal mithilfe einer Adjazenzliste als Datenstruktur durchgeführt.',
+      'type': 'Beispiel'
     },
     {
-      "id": 43,
-      "name": "Dynamische Datenstrukturen",
-      "description": "In dieser Vorlesung beginnen wir dynamische Datenstrukturen einzuführen. Es werden Stapel, Warteschlangen und verkettete Listen vorgestellt. Außerdem beschäftigen wir uns mit binärer Suche.\\n+ Links zu Video und Folien",
-      "type": "Vorlesung"
+      'id': 43,
+      'name': 'Verschiedene dynamische Datenstrukturen',
+      'description': 'In dieser Vorlesung beginnen wir dynamische Datenstrukturen einzuführen. Es werden Stapel, Warteschlangen und verkettete Listen vorgestellt. Außerdem beschäftigen wir uns mit binärer Suche.\n+ Links zu Video und Folien',
+      'type': 'Vorlesung'
     },
     {
-      "id": 44,
-      "name": "Verkettete Liste",
-      "description": "Eine verkettete Liste ist eine dynamische Datenstruktur. Dabei werden für die einzelnen Elemente jeweils Vorgänger und Nachfolger mit gespeichert. Der Vorteil hierbei ist, dass neue Einträge überall eingefügt werden können.",
-      "type": "Definition"
+      'id': 44,
+      'name': 'Verkettete Liste',
+      'description': 'Eine verkettete Liste ist eine dynamische Datenstruktur. Dabei werden für die einzelnen Elemente jeweils Vorgänger und Nachfolger mit gespeichert. Der Vorteil hierbei ist, dass neue Einträge überall eingefügt werden können.',
+      'type': 'Definition'
     },
     {
-      "id": 45,
-      "name": "Binäre Suche",
-      "description": "Dieser Algorithmus (4.1) erhält als Input einen sortierten Array mit Einträgen S[I], Suchwert WERT, linke Randposition LINKS, rechte Randposition RECHTS und liefert als Output die Position von WERT zwischen Arraypositionen LINKS und RECHTS, falls existent.",
-      "type": "Algorithmus"
+      'id': 45,
+      'name': 'Binäre Suche',
+      'description': 'Dieser Algorithmus (4.1) erhält als Input einen sortierten Array mit Einträgen S[I], Suchwert WERT, linke Randposition LINKS, rechte Randposition RECHTS und liefert als Output die Position von WERT zwischen Arraypositionen LINKS und RECHTS, falls existent.',
+      'type': 'Algorithmus'
     },
     {
-      "id": 46,
-      "name": "Binäre Suche Idee",
-      "description": "Ein einleitendes Beispiel zur Binären Suche.",
-      "type": "Beispiel"
+      'id': 46,
+      'name': 'Binäre Suche Idee',
+      'description': 'Ein einleitendes Beispiel zur Binären Suche.',
+      'type': 'Beispiel'
     },
     {
-      "id": 47,
-      "name": "Binäre Suche Beispiel",
-      "description": "Der Algorithmus für die binäre Suche einmal an zwei Beispielen angewandt.",
-      "type": "Beispiel"
+      'id': 47,
+      'name': 'Binäre Suche Beispiel',
+      'description': 'Der Algorithmus für die binäre Suche einmal an zwei Beispielen angewandt.',
+      'type': 'Beispiel'
     },
     {
-      "id": 48,
-      "name": "Binäre Suchbäume",
-      "description": "In dieser Vorlesung beschäftigen wir uns genauer mit binären Suchbäumen und den darauf anwendbaren Operationen, wie Maximum, Minimum, einfügen und löschen von Knoten, sowie mit der binären Suche.\\n+ Links zu Video und Folien",
-      "type": "Vorlesung"
+      'id': 48,
+      'name': 'Binäre Suchbäume',
+      'description': 'In dieser Vorlesung beschäftigen wir uns genauer mit binären Suchbäumen und den darauf anwendbaren Operationen, wie Maximum, Minimum, einfügen und löschen von Knoten, sowie mit der binären Suche.\n+ Links zu Video und Folien',
+      'type': 'Vorlesung'
     },
     {
-      "id": 49,
-      "name": "Binärer Suchbaum",
-      "description": "In dieser Definition werden die Begriffe \'gerichteter Graph/Baum\', \'Höhe eines Baumes\', \'(voller/vollständiger) binärer Baum\', \'Blatt eines Baumes\', \'Teilbaum eines Knotens\' und \'binärer Suchbaum\' definiert und erklärt.",
-      "type": "Definition"
+      'id': 49,
+      'name': 'Binärer Suchbaum',
+      'description': "In dieser Definition werden die Begriffe 'gerichteter Graph/Baum', 'Höhe eines Baumes', '(voller/vollständiger) binärer Baum', 'Blatt eines Baumes', 'Teilbaum eines Knotens' und 'binärer Suchbaum' definiert und erklärt.",
+      'type': 'Definition'
     },
     {
-      "id": 50,
-      "name": "Grundoperationen Suchbaum",
-      "description": "Minimum/Maximum finden, Suche im Baum, Nachfolger finden, Einfügen und Löschen sind die Grundoperationen, welche auf binäre Suchbäume angewendet werden können. Und hier findet ihr die Algorithmen dazu.",
-      "type": "Algorithmus"
+      'id': 50,
+      'name': 'Grundoperationen Suchbaum',
+      'description': 'Minimum/Maximum finden, Suche im Baum, Nachfolger finden, Einfügen und Löschen sind die Grundoperationen, welche auf binäre Suchbäume angewendet werden können. Und hier findet ihr die Algorithmen dazu.',
+      'type': 'Algorithmus'
     },
     {
-      "id": 51,
-      "name": "AVL-Bäume",
-      "description": "In dieser Vorlesung beschäftigen wir uns mit speziellen binären Suchbäumen, den AVL-Bäumen und ihren Eigenschaften.\\n+ Links zu Video und Folien/Notizen",
-      "type": "Vorlesung"
+      'id': 51,
+      'name': 'AVL-Bäume',
+      'description': 'In dieser Vorlesung beschäftigen wir uns mit speziellen binären Suchbäumen, den AVL-Bäumen und ihren Eigenschaften.\n+ Links zu Video und Folien/Notizen',
+      'type': 'Vorlesung'
     },
     {
-      "id": 52,
-      "name": "AVL-Baum",
-      "description": "Ein binärer Suchbaum ist höhenbalanciert, wenn sich für jeden Knoten v die Höhe der beiden Kinder von v um höchstens 1 unterscheidet. Ein höhenbalancierter Suchbaum heißt auch AVL-Baum.",
-      "type": "Definition"
+      'id': 52,
+      'name': 'AVL-Baum',
+      'description': 'Ein binärer Suchbaum ist höhenbalanciert, wenn sich für jeden Knoten v die Höhe der beiden Kinder von v um höchstens 1 unterscheidet. Ein höhenbalancierter Suchbaum heißt auch AVL-Baum.',
+      'type': 'Definition'
     },
     {
-      "id": 53,
-      "name": "dyn. Operationen auf AVL-Bäumen",
-      "description": "In dieser Vorlesung beschäftigen wir uns mit dem Erhalt der AVL-Eigenschaft eines binären Suchbaumes bei Einfüge- und Löschoperationen. Außerdem werfen wir einen Blick auf die Fibonacci-Zahlen.\\n+ Links zu Video und Folien",
-      "type": "Vorlesung"
+      'id': 53,
+      'name': 'dyn. Operationen auf AVL-Bäumen',
+      'description': 'In dieser Vorlesung beschäftigen wir uns mit dem Erhalt der AVL-Eigenschaft eines binären Suchbaumes bei Einfüge- und Löschoperationen. Außerdem werfen wir einen Blick auf die Fibonacci-Zahlen.\n+ Links zu Video und Folien',
+      'type': 'Vorlesung'
     },
     {
-      "id": 54,
-      "name": "AVL-Rotation",
-      "description": "Dieser Algorithmus (4.9) erhält als Input einen Knoten x eines binären Suchbaumes T, Vaterknoten y, Großvaterknoten z und liefert als Output den binären Suchbaum T nach Umstrukturierung mit x, y, z.",
-      "type": "Algorithmus"
+      'id': 54,
+      'name': 'AVL-Rotation',
+      'description': 'Dieser Algorithmus (4.9) erhält als Input einen Knoten x eines binären Suchbaumes T, Vaterknoten y, Großvaterknoten z und liefert als Output den binären Suchbaum T nach Umstrukturierung mit x, y, z.',
+      'type': 'Algorithmus'
     },
     {
-      "id": 55,
-      "name": "Fibonacci-Zahlen",
-      "description": "Die Fibonacci-Zahlen sind eine rekursiv definierte Zahlenfolge, bei der sich eine Zahl aus der Summe ihrer zwei Vorgänger ergibt. Dabei sind die ersten beiden Elemente gegeben als 1. Die Fibonacci-Zahlen finden sich überall in der Natur wieder und haben nicht wenig mit unserer Auffassung von Schönheit zu tun.",
-      "type": "Definition"
+      'id': 55,
+      'name': 'Fibonacci-Zahlen',
+      'description': 'Die Fibonacci-Zahlen sind eine rekursiv definierte Zahlenfolge, bei der sich eine Zahl aus der Summe ihrer zwei Vorgänger ergibt. Dabei sind die ersten beiden Elemente gegeben als 1. Die Fibonacci-Zahlen finden sich überall in der Natur wieder und haben nicht wenig mit unserer Auffassung von Schönheit zu tun.',
+      'type': 'Definition'
     },
     {
-      "id": 56,
-      "name": "Bäume-Übung",
-      "description": "In dieser Übung beschäftigen wir uns noch einmal genauer mit einigen Datenstrukturen wie verketteten Listen, binären Bäumen und AVL-Bäumen.",
-      "type": "Ãœbung"
+      'id': 56,
+      'name': 'Bäume-Übung',
+      'description': 'In dieser Übung beschäftigen wir uns noch einmal genauer mit einigen Datenstrukturen wie verketteten Listen, binären Bäumen und AVL-Bäumen.',
+      'type': 'Ãœbung'
     },
     {
-      "id": 57,
-      "name": "Laufzeit von Algorithmus 2.7",
-      "description": "Wir betrachten einmal die Laufzeit des Hierholzer-Algorithmus (2.7) und im Zusammenhang damit auch verkettete Listen.",
-      "type": "Beispiel"
+      'id': 57,
+      'name': 'Laufzeit von Algorithmus 2.7',
+      'description': 'Wir betrachten einmal die Laufzeit des Hierholzer-Algorithmus (2.7) und im Zusammenhang damit auch verkettete Listen.',
+      'type': 'Beispiel'
     },
     {
-      "id": 58,
-      "name": "Grundoperationen Suchbaum",
-      "description": "In diesem Teil der Übung werden einmal die Operationen Einfügen, Suchen, Vorgänger/Nachfolger finden, löschen und verschmelzen von binären Suchbäumen geübt.",
-      "type": "Beispiel"
+      'id': 58,
+      'name': 'Beispiel Suchbaumoperationen',
+      'description': 'In diesem Teil der Übung werden einmal die Operationen Einfügen, Suchen, Vorgänger/Nachfolger finden, löschen und verschmelzen von binären Suchbäumen geübt.',
+      'type': 'Beispiel'
     },
     {
-      "id": 59,
-      "name": "AVL-Baum-Operationen",
-      "description": "Wir schauen uns noch einmal genauer die AVL-Bäume an und was man damit machen kann. Insbesondere auch die Operationen Löschen und Einfügen.",
-      "type": "Beispiel"
+      'id': 59,
+      'name': 'AVL-Baum-Operationen',
+      'description': 'Wir schauen uns noch einmal genauer die AVL-Bäume an und was man damit machen kann. Insbesondere auch die Operationen Löschen und Einfügen.',
+      'type': 'Beispiel'
     },
     {
-      "id": 60,
-      "name": "Dynamische Datenstrukturen 2",
-      "description": "In dieser Vorlesung schauen wir noch einmal auf das bisher in Kapitel 4 gelernte zurück. Außerdem geben wir einen Überblick über einige weitere dynamische Datenstrukturen wie Rot-Scharz-Bäumme, B-Bäume und Heaps.\\n+ Links zu Video und Folien",
-      "type": "Vorlesung"
+      'id': 60,
+      'name': 'Dynamische Datenstrukturen 2',
+      'description': 'In dieser Vorlesung schauen wir noch einmal auf das bisher in Kapitel 4 gelernte zurück. Außerdem geben wir einen Überblick über einige weitere dynamische Datenstrukturen wie Rot-Scharz-Bäumme, B-Bäume und Heaps.\n+ Links zu Video und Folien',
+      'type': 'Vorlesung'
     },
     {
-      "id": 61,
-      "name": "Rot-Schwarz-Bäume",
-      "description": "Ein binärer Suchbaum heißt Rot-Schwarz-Baum, wenn er die folgenden Eigenschaften erfüllt:\\n1. Jeder Knoten ist entweder rot oder schwarz.\\n2. Die Wurzel ist schwarz.\\n3. Jedes Blatt (NIL) ist schwarz.\\n4. Wenn ein Knoten rot ist, sind seine beiden Kinder schwarz.\\n5. Für jeden Knoten enthalten alle Pfade nach unten zu einem Blatt des Teilbaumes die gleiche Anzahl schwarzer Knoten.",
-      "type": "Definition"
+      'id': 61,
+      'name': 'Rot-Schwarz-Bäume',
+      'description': 'Ein binärer Suchbaum heißt Rot-Schwarz-Baum, wenn er die folgenden Eigenschaften erfüllt:\n1. Jeder Knoten ist entweder rot oder schwarz.\n2. Die Wurzel ist schwarz.\n3. Jedes Blatt (NIL) ist schwarz.\n4. Wenn ein Knoten rot ist, sind seine beiden Kinder schwarz.\n5. Für jeden Knoten enthalten alle Pfade nach unten zu einem Blatt des Teilbaumes die gleiche Anzahl schwarzer Knoten.',
+      'type': 'Definition'
     },
     {
-      "id": 62,
-      "name": "B-Bäume",
-      "description": "B-Bäume sind binäre Suchbäume, welche für externen Speicher (HDDs) optimiert sind. Dabei wird die Höhe des Baumes minimiert und es werden den Knoten mehr Schlüssel zugewiesen.",
-      "type": "Definition"
+      'id': 62,
+      'name': 'B-Bäume',
+      'description': 'B-Bäume sind binäre Suchbäume, welche für externen Speicher (HDDs) optimiert sind. Dabei wird die Höhe des Baumes minimiert und es werden den Knoten mehr Schlüssel zugewiesen.',
+      'type': 'Definition'
     },
     {
-      "id": 63,
-      "name": "Heaps",
-      "description": "Ein gerichteter binärer Baum heißt binärer Min/Max-Heap, wenn jeder Knoten einen Schlüssel hat, alle Ebenen außer der \'letzten\' genau 2 Knoten haben, auf der \'letzten\' Ebene die linken n-(2^h)+1 Positionen besetzt sind und jeder Schlüssel eines Knotens höchstens/mindestens so groß ist wie die seiner Kinder.",
-      "type": "Definition"
+      'id': 63,
+      'name': 'Heaps',
+      'description': "Ein gerichteter binärer Baum heißt binärer Min/Max-Heap, wenn jeder Knoten einen Schlüssel hat, alle Ebenen außer der 'letzten' genau 2 Knoten haben, auf der 'letzten' Ebene die linken n-(2^h)+1 Positionen besetzt sind und jeder Schlüssel eines Knotens höchstens/mindestens so groß ist wie die seiner Kinder.",
+      'type': 'Definition'
     },
     {
-      "id": 64,
-      "name": "Sortieren",
-      "description": "In dieser Vorlesung geben wir eine Einführung in das Oberthema Sortieren. Wir stellen außerdem einen Sortieralgorithmus mit dem Namen Mergesort vor und stellen grundlegende Überlegungen zur Laufzeit von Sortieralgorithmen an.\\n+ Links zu Video und Folien/Notizen",
-      "type": "Vorlesung"
+      'id': 64,
+      'name': 'Einführung in das Sortieren',
+      'description': 'In dieser Vorlesung geben wir eine Einführung in das Oberthema Sortieren. Wir stellen außerdem einen Sortieralgorithmus mit dem Namen Mergesort vor und stellen grundlegende Überlegungen zur Laufzeit von Sortieralgorithmen an.\n+ Links zu Video und Folien/Notizen',
+      'type': 'Vorlesung'
     },
     {
-      "id": 65,
-      "name": "Merge-Sort",
-      "description": "Dieser Algorithmus (5.1) erhält als Input ein Subarray von A=[1,...,n], der bei Index p beginnt und bei Index r endet, d.h. A[p,...,r] und liefert als Output ein sortiertes Subarray. Wichtig ist dafür auch die Subroutine (5.2), welche als Input zwei sortierte Subarrays von A=[1,...,n], d.h. A[p,...,q] und A[q+1,...,r] erhält und als Output das sortierte Subarray A[p,...,r] liefert.",
-      "type": "Algorithmus"
+      'id': 65,
+      'name': 'Merge-Sort',
+      'description': 'Dieser Algorithmus (5.1) erhält als Input ein Subarray von A=[1,...,n], der bei Index p beginnt und bei Index r endet, d.h. A[p,...,r] und liefert als Output ein sortiertes Subarray. Wichtig ist dafür auch die Subroutine (5.2), welche als Input zwei sortierte Subarrays von A=[1,...,n], d.h. A[p,...,q] und A[q+1,...,r] erhält und als Output das sortierte Subarray A[p,...,r] liefert.',
+      'type': 'Algorithmus'
     },
     {
-      "id": 66,
-      "name": "Sortier-Laufzeitschranken",
-      "description": "In dieser Vorlesung leiten wir konkrete Laufzeitschranken für das Problem des Sortierens einer Liste von Zahlen her. Zudem machen wir uns Gedanken über das Lösen von Rekursionsgleichungen.\\n+ Links zu Video und Folien/Notizen",
-      "type": "Vorlesung"
+      'id': 66,
+      'name': 'Sortier-Laufzeitschranken',
+      'description': 'In dieser Vorlesung leiten wir konkrete Laufzeitschranken für das Problem des Sortierens einer Liste von Zahlen her. Zudem machen wir uns Gedanken über das Lösen von Rekursionsgleichungen.\n+ Links zu Video und Folien/Notizen',
+      'type': 'Vorlesung'
     },
     {
-      "id": 67,
-      "name": "Permutation",
-      "description": "Eine Permutation P ist eine Umsortierung von n Objekten.",
-      "type": "Definition"
+      'id': 67,
+      'name': 'Permutation',
+      'description': 'Eine Permutation P ist eine Umsortierung von n Objekten.',
+      'type': 'Definition'
     },
     {
-      "id": 68,
-      "name": "Erzeugende Funktionen",
-      "description": "Erzeugende Funktionen können genutzt werden um Rekursionen zu lösen.",
-      "type": "Definition"
+      'id': 68,
+      'name': 'Erzeugende Funktionen',
+      'description': 'Erzeugende Funktionen können genutzt werden um Rekursionen zu lösen.',
+      'type': 'Definition'
     },
     {
-      "id": 69,
-      "name": "Erzeugende Funktionen/Mastertheorem",
-      "description": "In dieser Vorlesung besprechen wir weitere Details zu erzeugenden Funktionen und führen das Master-Theorem ein.\\n+ Links zu Video und Folien/Notizen",
-      "type": "Vorlesung"
+      'id': 69,
+      'name': 'Erzeugende Funktionen/Mastertheorem',
+      'description': 'In dieser Vorlesung besprechen wir weitere Details zu erzeugenden Funktionen und führen das Master-Theorem ein.\n+ Links zu Video und Folien/Notizen',
+      'type': 'Vorlesung'
     },
     {
-      "id": 70,
-      "name": "erzeugende Funktionen Fibonacci-Zahlen",
-      "description": "In diesem Beispiel wird einmal die erzeugende Funktion der Fibonacci-Zahlen hergeleitet.",
-      "type": "Beispiel"
+      'id': 70,
+      'name': 'erzeugende Funktionen Fibonacci-Zahlen',
+      'description': 'In diesem Beispiel wird einmal die erzeugende Funktion der Fibonacci-Zahlen hergeleitet.',
+      'type': 'Beispiel'
     },
     {
-      "id": 71,
-      "name": "Master-Theorem",
-      "description": "Das Master-Theorem bietet eine schnelle Lösung für die Frage, in welcher Laufzeitklasse eine gegebene rekursiv definierte Funktion liegt. Dies funktioniert leider nur, solange einer der drei Fälle des Theorems auf die Funktion angewandt werden kann, ansonsten liefert das Theorem keine Aussage.",
-      "type": "Definition"
+      'id': 71,
+      'name': 'Master-Theorem',
+      'description': 'Das Master-Theorem bietet eine schnelle Lösung für die Frage, in welcher Laufzeitklasse eine gegebene rekursiv definierte Funktion liegt. Dies funktioniert leider nur, solange einer der drei Fälle des Theorems auf die Funktion angewandt werden kann, ansonsten liefert das Theorem keine Aussage.',
+      'type': 'Definition'
     },
     {
-      "id": 72,
-      "name": "Master-Theorem Beispiele",
-      "description": "Einige Beispiele, an denen das Master-Theorem und seine Funktion noch einmal verdeutlicht wird.",
-      "type": "Beispiel"
+      'id': 72,
+      'name': 'Master-Theorem Beispiele',
+      'description': 'Einige Beispiele, an denen das Master-Theorem und seine Funktion noch einmal verdeutlicht wird.',
+      'type': 'Beispiel'
     },
     {
-      "id": 73,
-      "name": "Sortieralgorithmen und Master-Theorem",
-      "description": "Wir betrachten ein weiteres Beispiel für Mergesort und leiten erneut die Laufzeit des Sortieralgorithmus her, indem das Master-Theorem benutzt wird. Außerdem betrachten wir einen weiteren Sortieralgorithmus: Heapsort.\\n+ Links zu Video und Folien",
-      "type": "Ãœbung"
+      'id': 73,
+      'name': 'Sortieralgorithmen und Master-Theorem',
+      'description': 'Wir betrachten ein weiteres Beispiel für Mergesort und leiten erneut die Laufzeit des Sortieralgorithmus her, indem das Master-Theorem benutzt wird. Außerdem betrachten wir einen weiteren Sortieralgorithmus: Heapsort.\n+ Links zu Video und Folien',
+      'type': 'Ãœbung'
     },
     {
-      "id": 74,
-      "name": "Merge-Sort Beispiel",
-      "description": "Hier wird der Merge-Sort Algorithmus einmal mit einem Beispiel komplett durchgeführt und die Laufzeit des Algorithmus betrachtet.",
-      "type": "Beispiel"
+      'id': 74,
+      'name': 'Merge-Sort Beispiel',
+      'description': 'Hier wird der Merge-Sort Algorithmus einmal mit einem Beispiel komplett durchgeführt und die Laufzeit des Algorithmus betrachtet.',
+      'type': 'Beispiel'
     },
     {
-      "id": 75,
-      "name": "Master-Theorem Beispiel",
-      "description": "3 weitere Beispiele, welche dabei helfen das Master-Theorem zu verstehen und anzuwenden.",
-      "type": "Beispiel"
+      'id': 75,
+      'name': 'Master-Theorem Beispiel',
+      'description': '3 weitere Beispiele, welche dabei helfen das Master-Theorem zu verstehen und anzuwenden.',
+      'type': 'Beispiel'
     },
     {
-      "id": 76,
-      "name": "Max-Heaps",
-      "description": "Hier wir aufgezeigt, wie man mithilfe eines Algorithmus Max-Heaps bildet. ",
-      "type": "Algorithmus"
+      'id': 76,
+      'name': 'Max-Heaps',
+      'description': 'Hier wir aufgezeigt, wie man mithilfe eines Algorithmus Max-Heaps bildet. ',
+      'type': 'Algorithmus'
     },
     {
-      "id": 77,
-      "name": "Max-Heaps",
-      "description": "Hier wird der Algorithmus aus der Ãœbung 6 zum Erstellen eines Max-Heaps einmal an einem Beispiel angewandt.",
-      "type": "Beispiel"
+      'id': 77,
+      'name': 'Max-Heaps Anwendung',
+      'description': 'Hier wird der Algorithmus aus der Ãœbung 6 zum Erstellen eines Max-Heaps einmal an einem Beispiel angewandt.',
+      'type': 'Beispiel'
     },
     {
-      "id": 78,
-      "name": "Heapsort",
-      "description": "Heapsort ist ein Algorithmus bei dem mithilfe von Max-Heaps eine Reihe von Elementen sortiert werden kann. Der Algorithmus hat dabei eine Laufzeit von O(n log n), wie auch in Ãœbung 6 bewiesen wird.",
-      "type": "Algorithmus"
+      'id': 78,
+      'name': 'Heapsort',
+      'description': 'Heapsort ist ein Algorithmus bei dem mithilfe von Max-Heaps eine Reihe von Elementen sortiert werden kann. Der Algorithmus hat dabei eine Laufzeit von O(n log n), wie auch in Ãœbung 6 bewiesen wird.',
+      'type': 'Algorithmus'
     },
     {
-      "id": 79,
-      "name": "nichtlineare Rekursionen (Exkurs)",
-      "description": "In dieser Vorlesung haben wir einen Exkurs in die nichtlineare Rekursion gemacht.\\n+ Links zu Video und Folien",
-      "type": "Vorlesung"
+      'id': 79,
+      'name': 'nichtlineare Rekursionen (Exkurs)',
+      'description': 'In dieser Vorlesung haben wir einen Exkurs in die nichtlineare Rekursion gemacht.\n+ Links zu Video und Folien',
+      'type': 'Vorlesung'
     },
     {
-      "id": 80,
-      "name": "logistische Rekursion",
-      "description": "Logistische Rekursion bezeichnet ein Wachstum proportional zu einer Größe. Dabei betrachtet man beispielsweise eine Bevölkerung, welche zwar durch Fruchtbarkeit immer weiter wächst, aber beispielsweise durch Tod auch wieder im Wachstum beschränkt wird.",
-      "type": "Definition"
+      'id': 80,
+      'name': 'logistische Rekursion',
+      'description': 'Logistische Rekursion bezeichnet ein Wachstum proportional zu einer Größe. Dabei betrachtet man beispielsweise eine Bevölkerung, welche zwar durch Fruchtbarkeit immer weiter wächst, aber beispielsweise durch Tod auch wieder im Wachstum beschränkt wird.',
+      'type': 'Definition'
     },
     {
-      "id": 81,
-      "name": "Mandelbrot-Menge",
-      "description": "Die Mandelbrot-Menge, benannt nach Benoît Mandelbrot, ist eine Menge in den komplexen Zahlen. Interpretiert man sie als geometrische Figur, so ergibt sich ein Fraktal, welches im allgemeinen Sprachgebrauch auch als Apfelmännchen bekannt ist.",
-      "type": "Definition"
+      'id': 81,
+      'name': 'Mandelbrot-Menge',
+      'description': 'Die Mandelbrot-Menge, benannt nach Benoît Mandelbrot, ist eine Menge in den komplexen Zahlen. Interpretiert man sie als geometrische Figur, so ergibt sich ein Fraktal, welches im allgemeinen Sprachgebrauch auch als Apfelmännchen bekannt ist.',
+      'type': 'Definition'
     },
     {
-      "id": 82,
-      "name": "Fraktale",
-      "description": "Ein Fraktal beschreibt natürliche oder künstliche Gebilde oder geometrische Muster und ist ein von Benoît Mandelbrot geprägter Begriff. - Wikipedia",
-      "type": "Definition"
+      'id': 82,
+      'name': 'Fraktale',
+      'description': 'Ein Fraktal beschreibt natürliche oder künstliche Gebilde oder geometrische Muster und ist ein von Benoît Mandelbrot geprägter Begriff. - Wikipedia',
+      'type': 'Definition'
     },
     {
-      "id": 83,
-      "name": "Zelluläre Automaten",
-      "description": "Zelluläre oder auch zellulare Automaten dienen der Modellierung räumlich diskreter dynamischer Systeme, wobei die Entwicklung einzelner Zellen zum Zeitpunkt t+1 primär von den Zellzuständen in einer vorgegebenen Nachbarschaft und vom eigenen Zustand zum Zeitpunkt t abhängt. - Wikipedia",
-      "type": "Definition"
+      'id': 83,
+      'name': 'Zelluläre Automaten',
+      'description': 'Zelluläre oder auch zellulare Automaten dienen der Modellierung räumlich diskreter dynamischer Systeme, wobei die Entwicklung einzelner Zellen zum Zeitpunkt t+1 primär von den Zellzuständen in einer vorgegebenen Nachbarschaft und vom eigenen Zustand zum Zeitpunkt t abhängt. - Wikipedia',
+      'type': 'Definition'
     },
     {
-      "id": 84,
-      "name": "Game of Life",
-      "description": "Das \'Game of Life\' ist das wohl bekannteste Beispiel eines zellulären Automaten. ",
-      "type": "Beispiel"
+      'id': 84,
+      'name': 'Game of Life',
+      'description': "Das 'Game of Life' ist das wohl bekannteste Beispiel eines zellulären Automaten. ",
+      'type': 'Beispiel'
     },
     {
-      "id": 85,
-      "name": "Quick-Sort",
-      "description": "In dieser Vorlesung kehren wir zurück zu Sortieralgorithmen und stellen den Quicksort-Algorithmus vor.\\n+ Links zu Video und Folien/Notizen",
-      "type": "Vorlesung"
+      'id': 85,
+      'name': 'Einführung von Quick-Sort',
+      'description': 'In dieser Vorlesung kehren wir zurück zu Sortieralgorithmen und stellen den Quicksort-Algorithmus vor.\n+ Links zu Video und Folien/Notizen',
+      'type': 'Vorlesung'
     },
     {
-      "id": 86,
-      "name": "Quick-Sort",
-      "description": "Dieser Algorithmus (5.14) erhält als Input ein Subarray von A=[1,...,n], der bei Index p beginnt und bei Index r endet, d.h. A[p,...,r] und liefert als Output einen sortierten Subarray. Dabei ist auch Subroutine 5.15 wichtig, welche als Input ein Subarray von A=[1,...,n], d.h. A[p,...,r] erhält und als Output zwei Subarrays A[p,...,q-1] und A[q+1,...,r] mit A[i]≤A[q] und A[q]<A[j] für i=p,...,q-1 und j=q+1,...,r liefert.",
-      "type": "Algorithmus"
+      'id': 86,
+      'name': 'Quick-Sort',
+      'description': 'Dieser Algorithmus (5.14) erhält als Input ein Subarray von A=[1,...,n], der bei Index p beginnt und bei Index r endet, d.h. A[p,...,r] und liefert als Output einen sortierten Subarray. Dabei ist auch Subroutine 5.15 wichtig, welche als Input ein Subarray von A=[1,...,n], d.h. A[p,...,r] erhält und als Output zwei Subarrays A[p,...,q-1] und A[q+1,...,r] mit A[i]≤A[q] und A[q]<A[j] für i=p,...,q-1 und j=q+1,...,r liefert.',
+      'type': 'Algorithmus'
     },
     {
-      "id": 87,
-      "name": "Laufzeit von Quick-Sort",
-      "description": "Die Laufzeit des Quick-Sort Algorithmus lässt sich mithilfe vom Master-Theorem ermitteln. Dazu betrachten wir die 3 Fälle best-case, average-case und worst-case für den Algorithmus.",
-      "type": "Beispiel"
+      'id': 87,
+      'name': 'Laufzeit von Quick-Sort',
+      'description': 'Die Laufzeit des Quick-Sort Algorithmus lässt sich mithilfe vom Master-Theorem ermitteln. Dazu betrachten wir die 3 Fälle best-case, average-case und worst-case für den Algorithmus.',
+      'type': 'Beispiel'
     },
     {
-      "id": 88,
-      "name": "Mediane",
-      "description": "In dieser Vorlesung beschäftigen wir uns mit Medianen.\\n+ Links zu Video und Folien",
-      "type": "Vorlesung"
+      'id': 88,
+      'name': 'Mediane',
+      'description': 'In dieser Vorlesung beschäftigen wir uns mit Medianen.\n+ Links zu Video und Folien',
+      'type': 'Vorlesung'
     },
     {
-      "id": 89,
-      "name": "Standortprobleme",
-      "description": "Was ist der optimale Standort für beispielsweise ein Amazon-Lagerhaus? Idee: Die durchschnittliche Distanz zu den zu beliefernden Gebäuden minimieren. In Amerika ist dies leicht umgesetzt mit der sogenannten Manhatten-Distanz. Dieses Problem ist die Einführung in das Thema der Mediane.",
-      "type": "Definition"
+      'id': 89,
+      'name': 'Standortprobleme',
+      'description': 'Was ist der optimale Standort für beispielsweise ein Amazon-Lagerhaus? Idee: Die durchschnittliche Distanz zu den zu beliefernden Gebäuden minimieren. In Amerika ist dies leicht umgesetzt mit der sogenannten Manhatten-Distanz. Dieses Problem ist die Einführung in das Thema der Mediane.',
+      'type': 'Definition'
     },
     {
-      "id": 90,
-      "name": "Median (diskret)",
-      "description": "Der Rank k eines Elements x (auch \'k-tes Element\') ist definiert durch |{y ∈ X |y<=x}| = k. Also die Anzahl der Elemente, welche kleiner oder gleich x sind. Speziell heißt x Median, wenn er das [n/2]-te Element ist. [n/2] wird dabei abgerundet.",
-      "type": "Definition"
+      'id': 90,
+      'name': 'Median (diskret)',
+      'description': "Der Rank k eines Elements x (auch 'k-tes Element') ist definiert durch |{y ∈ X |y<=x}| = k. Also die Anzahl der Elemente, welche kleiner oder gleich x sind. Speziell heißt x Median, wenn er das [n/2]-te Element ist. [n/2] wird dabei abgerundet.",
+      'type': 'Definition'
     },
     {
-      "id": 91,
-      "name": "Median (kontinuierlich)",
-      "description": "Der kontinuierliche Median hat als Eigenschaft, dass das sowohl Integral bis zum Median, als auch ab dem Median größer-gleich 1/2 ist.",
-      "type": "Definition"
+      'id': 91,
+      'name': 'Median (kontinuierlich)',
+      'description': 'Der kontinuierliche Median hat als Eigenschaft, dass das sowohl Integral bis zum Median, als auch ab dem Median größer-gleich 1/2 ist.',
+      'type': 'Definition'
     },
     {
-      "id": 92,
-      "name": "Sortieralgorithmen Sonderfälle",
-      "description": "In dieser Vorlesung beschäftigen wir uns mit Sonderfällen für Sortieralgorithmen, durch die Sortieren in linearer Zeit ermöglicht wird. Dabei werfen wir einen näheren Blick auf die Sortierverfahren Countingsort und Radixsort.\\n+ Links zu Video und Folien/Notizen",
-      "type": "Vorlesung"
+      'id': 92,
+      'name': 'Sortieralgorithmen Sonderfälle',
+      'description': 'In dieser Vorlesung beschäftigen wir uns mit Sonderfällen für Sortieralgorithmen, durch die Sortieren in linearer Zeit ermöglicht wird. Dabei werfen wir einen näheren Blick auf die Sortierverfahren Countingsort und Radixsort.\n+ Links zu Video und Folien/Notizen',
+      'type': 'Vorlesung'
     },
     {
-      "id": 93,
-      "name": "Counting-Sort",
-      "description": "Dieser Algorithmus (5.14) erhält als Input ein Array von A=[1],...,A[n] mit Schlüsselwerten aus {1,…, k} und liefert als Output eine sortierte Kopie B[1],…,B[n] von [1],...,A[n].",
-      "type": "Algorithmus"
+      'id': 93,
+      'name': 'Counting-Sort',
+      'description': 'Dieser Algorithmus (5.14) erhält als Input ein Array von A=[1],...,A[n] mit Schlüsselwerten aus {1,…, k} und liefert als Output eine sortierte Kopie B[1],…,B[n] von [1],...,A[n].',
+      'type': 'Algorithmus'
     },
     {
-      "id": 94,
-      "name": "Radix-Sort",
-      "description": "Dieser Algorithmus (5.18) erhält als Input n Zahlen mit je d Ziffern, die k verschiedene Werte annehmen können, [1],...,A[n]  und liefert als Output einen sortierten Array. Dabei geht Radix-Sort im Gegensatz zu anderen Sortieralgorithmen ziffernweise vor.",
-      "type": "Algorithmus"
+      'id': 94,
+      'name': 'Radix-Sort',
+      'description': 'Dieser Algorithmus (5.18) erhält als Input n Zahlen mit je d Ziffern, die k verschiedene Werte annehmen können, [1],...,A[n]  und liefert als Output einen sortierten Array. Dabei geht Radix-Sort im Gegensatz zu anderen Sortieralgorithmen ziffernweise vor.',
+      'type': 'Algorithmus'
     },
     {
-      "id": 95,
-      "name": "Quick-Sort, Mediane, kd-Bäume",
-      "description": "In dieser Übung schauen wir uns noch einmal das Sortierverfahren Quicksort an und sprechen über die Berechnung von Medianen. Außerdem schauen wir uns mit den kd-Bäumen eine spezielle Datenstruktur für mehrdimensionale Daten an.\\n+ Links zu Video und Folien",
-      "type": "Ãœbung"
+      'id': 95,
+      'name': 'Quick-Sort, Mediane, kd-Bäume',
+      'description': 'In dieser Übung schauen wir uns noch einmal das Sortierverfahren Quicksort an und sprechen über die Berechnung von Medianen. Außerdem schauen wir uns mit den kd-Bäumen eine spezielle Datenstruktur für mehrdimensionale Daten an.\n+ Links zu Video und Folien',
+      'type': 'Ãœbung'
     },
     {
-      "id": 96,
-      "name": "Quick-Sort Beispiel",
-      "description": "In diesem Beispiel wird die Funktionsweise von Quick-Sort, sowie die Laufzeit betrachtet.",
-      "type": "Beispiel"
+      'id': 96,
+      'name': 'Quick-Sort Beispiel',
+      'description': 'In diesem Beispiel wird die Funktionsweise von Quick-Sort, sowie die Laufzeit betrachtet.',
+      'type': 'Beispiel'
     },
     {
-      "id": 97,
-      "name": "Mediane Beispiel",
-      "description": "In diesem Teil der Übung schauen wir uns noch einmal genauer an, was Mediane sind, wie man sie algorithmisch bestimmen kann und in welcher Laufzeit das möglich ist.",
-      "type": "Beispiel"
+      'id': 97,
+      'name': 'Mediane Beispiel',
+      'description': 'In diesem Teil der Übung schauen wir uns noch einmal genauer an, was Mediane sind, wie man sie algorithmisch bestimmen kann und in welcher Laufzeit das möglich ist.',
+      'type': 'Beispiel'
     },
     {
-      "id": 98,
-      "name": "kd-Bäume (Exkurs)",
-      "description": "kd-Bäume sind Bäume mit einer höheren Dimension. Mithilfe der Idee den Baum abwechselnd nach x- und y-Koordinate zu durchsuchen und so zu konstruieren entsteht ein Algorithmus mit dem man mehrdimensionale Suchbäume erstellen kann. Auch schauen wir uns an, wie man in einem solchen Baum sucht.",
-      "type": "Definition"
+      'id': 98,
+      'name': 'kd-Bäume (Exkurs)',
+      'description': 'kd-Bäume sind Bäume mit einer höheren Dimension. Mithilfe der Idee den Baum abwechselnd nach x- und y-Koordinate zu durchsuchen und so zu konstruieren entsteht ein Algorithmus mit dem man mehrdimensionale Suchbäume erstellen kann. Auch schauen wir uns an, wie man in einem solchen Baum sucht.',
+      'type': 'Definition'
     },
     {
-      "id": 99,
-      "name": "(parallelisierte) Sortierverfahren",
-      "description": "In dieser Vorlesung beenden wir das Kapitel zum Thema Sortieralgorithmen und werfen abschließend einen Blick auf parallelisierte Sortierverfahren.\\n+ Links zu Video und Folien/Notizen",
-      "type": "Vorlesung"
+      'id': 99,
+      'name': '(parallelisierte) Sortierverfahren',
+      'description': 'In dieser Vorlesung beenden wir das Kapitel zum Thema Sortieralgorithmen und werfen abschließend einen Blick auf parallelisierte Sortierverfahren.\n+ Links zu Video und Folien/Notizen',
+      'type': 'Vorlesung'
     },
     {
-      "id": 100,
-      "name": "Bubble-Sort Beispiel",
-      "description": "Einige Beispiele, wie Bubble-Sort funktioniert, inklusive einiger verschiedener Darstellungen/Animationen und dem Vergleich mit Quick-Sort.",
-      "type": "Algorithmus"
+      'id': 100,
+      'name': 'Bubble-Sort Beispiel',
+      'description': 'Einige Beispiele, wie Bubble-Sort funktioniert, inklusive einiger verschiedener Darstellungen/Animationen und dem Vergleich mit Quick-Sort.',
+      'type': 'Algorithmus'
     },
     {
-      "id": 101,
-      "name": "paralleles Bubble-Sort",
-      "description": "Mithilfe von Parallelisierung lässt sich Bubble-Sort auch in linearer Zeit umsetzen. Die Idee dafür wird hier einmal erläutert.",
-      "type": "Definition"
+      'id': 101,
+      'name': 'paralleles Bubble-Sort',
+      'description': 'Mithilfe von Parallelisierung lässt sich Bubble-Sort auch in linearer Zeit umsetzen. Die Idee dafür wird hier einmal erläutert.',
+      'type': 'Definition'
     },
     {
-      "id": 102,
-      "name": "Bogo-Sort",
-      "description": "Bogo-Sort ist ein eher als Scherz gemeinter Sortieralgorithmus. Dabei wird die gegebene Menge solange zufällig durchpermutiert und überprüft bis die korrekte Lösung erreicht ist.",
-      "type": "Algorithmus"
+      'id': 102,
+      'name': 'Bogo-Sort',
+      'description': 'Bogo-Sort ist ein eher als Scherz gemeinter Sortieralgorithmus. Dabei wird die gegebene Menge solange zufällig durchpermutiert und überprüft bis die korrekte Lösung erreicht ist.',
+      'type': 'Algorithmus'
     },
     {
-      "id": 103,
-      "name": "Zusammenfassung",
-      "description": "Diese Vorlesung markiert das Ende der Vorlesungszeit. Wir gehen deshalb noch einmal Rückblickend über die verschiedenen Themen die in den vergangenen Monaten behandelt wurden und geben die Möglichkeit Fragen zu stellen.\\n+ Links zu Video und Folien",
-      "type": "Vorlesung"
+      'id': 103,
+      'name': 'Zusammenfassung',
+      'description': 'Diese Vorlesung markiert das Ende der Vorlesungszeit. Wir gehen deshalb noch einmal Rückblickend über die verschiedenen Themen die in den vergangenen Monaten behandelt wurden und geben die Möglichkeit Fragen zu stellen.\n+ Links zu Video und Folien',
+      'type': 'Vorlesung'
     },
     {
-      "id": 104,
-      "name": "Klausurvorbereitung",
-      "description": "Die letzte große Übung von AuD mit Spiel, Spaß, Spannung und vielen Fragen.\\n+ Links zu Video und Folien",
-      "type": "Ãœbung"
+      'id': 104,
+      'name': 'Klausurvorbereitung',
+      'description': 'Die letzte große Übung von AuD mit Spiel, Spaß, Spannung und vielen Fragen.\n+ Links zu Video und Folien',
+      'type': 'Ãœbung'
     },
     {
-      "id": 105,
-      "name": "Einleitung",
-      "description": "Eine Einleitung in die Welt der Algorithmen und Datenstrukturen. Was ist ein Algorithmus und wozu wird er benötigt? Und was haben Datenstrukturen damit zu tun?",
-      "type": "Kapitel"
+      'id': 105,
+      'name': 'Einleitung',
+      'description': 'Eine Einleitung in die Welt der Algorithmen und Datenstrukturen. Was ist ein Algorithmus und wozu wird er benötigt? Und was haben Datenstrukturen damit zu tun?',
+      'type': 'Kapitel'
     },
     {
-      "id": 106,
-      "name": "Graphen",
-      "description": "Graphen sind eine wichtige Darstellungsform von Daten in der Informatik. Wie Graphen aufgebaut sind und was man alles mit ihnen machen kann wird in diesem Kapitel behandelt.",
-      "type": "Kapitel"
+      'id': 106,
+      'name': 'Graphen',
+      'description': 'Graphen sind eine wichtige Darstellungsform von Daten in der Informatik. Wie Graphen aufgebaut sind und was man alles mit ihnen machen kann wird in diesem Kapitel behandelt.',
+      'type': 'Kapitel'
     },
     {
-      "id": 107,
-      "name": "Suche in Graphen",
-      "description": "Die Suche in Graphen ist ein wichtiges Werkzeug. Allerdings gibt es mehrere Wege, welche zum Ziel führen und nicht alle funktionieren gleich gut. Wie man effizient in Graphen sucht wird in diesem Kapitel behandelt.",
-      "type": "Kapitel"
+      'id': 107,
+      'name': 'Suche in Graphen',
+      'description': 'Die Suche in Graphen ist ein wichtiges Werkzeug. Allerdings gibt es mehrere Wege, welche zum Ziel führen und nicht alle funktionieren gleich gut. Wie man effizient in Graphen sucht wird in diesem Kapitel behandelt.',
+      'type': 'Kapitel'
     },
     {
-      "id": 108,
-      "name": "Dynamische Datenstrukturen",
-      "description": "Im Laufe der Vorlesung wurden bereits einige Datenstrukturen vorgestellt. In diesem Kapitel beschäftigen wir uns mit einer weiteren Klasse der Datenstrukturen, den dynamischen Datenstrukturen. Und damit, welche Möglichkeiten sie bieten.",
-      "type": "Kapitel"
+      'id': 108,
+      'name': 'Dynamische Datenstrukturen',
+      'description': 'Im Laufe der Vorlesung wurden bereits einige Datenstrukturen vorgestellt. In diesem Kapitel beschäftigen wir uns mit einer weiteren Klasse der Datenstrukturen, den dynamischen Datenstrukturen. Und damit, welche Möglichkeiten sie bieten.',
+      'type': 'Kapitel'
     },
     {
-      "id": 109,
-      "name": "Sortieren",
-      "description": "Neben der Suche von Elementen spielt auch das Sortieren in der Informatik eine große Rolle. Wie man das macht wird in diesem Kapitel behandelt.",
-      "type": "Kapitel"
+      'id': 109,
+      'name': 'Sortieren',
+      'description': 'Neben der Suche von Elementen spielt auch das Sortieren in der Informatik eine große Rolle. Wie man das macht wird in diesem Kapitel behandelt.',
+      'type': 'Kapitel'
     },
     {
-      "id": 0,
-      "name": "AuD1",
-      "description": "Algorithmen und Datenstrukturen 1",
-      "type": "Kapitel"
+      'id': 0,
+      'name': 'AuD1',
+      'description': 'Algorithmen und Datenstrukturen 1',
+      'type': 'Kapitel'
     }
   ],
-  "links": [
+  'links': [
     {
-      "source": 1,
-      "target": 105
+      'source': 1,
+      'target': 105
     },
     {
-      "source": 2,
-      "target": 1
+      'source': 2,
+      'target': 1
     },
     {
-      "source": 3,
-      "target": 1
+      'source': 3,
+      'target': 1
     },
     {
-      "source": 4,
-      "target": 105
+      'source': 4,
+      'target': 105
     },
     {
-      "source": 4,
-      "target": 7
+      'source': 4,
+      'target': 7
     },
     {
-      "source": 5,
-      "target": 1
+      'source': 5,
+      'target': 1
     },
     {
-      "source": 6,
-      "target": 1
+      'source': 6,
+      'target': 1
     },
     {
-      "source": 7,
-      "target": 105
+      'source': 7,
+      'target': 105
     },
     {
-      "source": 8,
-      "target": 7
+      'source': 8,
+      'target': 7
     },
     {
-      "source": 21,
-      "target": 105
+      'source': 21,
+      'target': 105
     },
     {
-      "source": 9,
-      "target": 105
+      'source': 9,
+      'target': 105
     },
     {
-      "source": 9,
-      "target": 21
+      'source': 9,
+      'target': 21
     },
     {
-      "source": 10,
-      "target": 106
+      'source': 10,
+      'target': 106
     },
     {
-      "source": 11,
-      "target": 14
+      'source': 11,
+      'target': 14
     },
     {
-      "source": 12,
-      "target": 106
+      'source': 12,
+      'target': 106
     },
     {
-      "source": 12,
-      "target": 15
+      'source': 12,
+      'target': 15
     },
     {
-      "source": 12,
-      "target": 17
+      'source': 12,
+      'target': 17
     },
     {
-      "source": 12,
-      "target": 19
+      'source': 12,
+      'target': 19
     },
     {
-      "source": 12,
-      "target": 20
+      'source': 12,
+      'target': 20
     },
     {
-      "source": 13,
-      "target": 14
+      'source': 13,
+      'target': 14
     },
     {
-      "source": 13,
-      "target": 15
+      'source': 13,
+      'target': 15
     },
     {
-      "source": 14,
-      "target": 106
+      'source': 14,
+      'target': 106
     },
     {
-      "source": 15,
-      "target": 106
+      'source': 15,
+      'target': 106
     },
     {
-      "source": 16,
-      "target": 106
+      'source': 16,
+      'target': 106
     },
     {
-      "source": 17,
-      "target": 18
+      'source': 17,
+      'target': 18
     },
     {
-      "source": 18,
-      "target": 106
+      'source': 18,
+      'target': 106
     },
     {
-      "source": 19,
-      "target": 18
+      'source': 19,
+      'target': 18
     },
     {
-      "source": 20,
-      "target": 18
+      'source': 20,
+      'target': 18
     },
     {
-      "source": 22,
-      "target": 107
+      'source': 22,
+      'target': 107
     },
     {
-      "source": 23,
-      "target": 107
+      'source': 23,
+      'target': 107
     },
     {
-      "source": 23,
-      "target": 16
+      'source': 23,
+      'target': 16
     },
     {
-      "source": 24,
-      "target": 25
+      'source': 24,
+      'target': 25
     },
     {
-      "source": 25,
-      "target": 107
+      'source': 25,
+      'target': 107
     },
     {
-      "source": 26,
-      "target": 27
+      'source': 26,
+      'target': 27
     },
     {
-      "source": 26,
-      "target": 28
+      'source': 26,
+      'target': 28
     },
     {
-      "source": 26,
-      "target": 29
+      'source': 26,
+      'target': 29
     },
     {
-      "source": 26,
-      "target": 30
+      'source': 26,
+      'target': 30
     },
     {
-      "source": 26,
-      "target": 31
+      'source': 26,
+      'target': 31
     },
     {
-      "source": 27,
-      "target": 107
+      'source': 27,
+      'target': 107
     },
     {
-      "source": 28,
-      "target": 107
+      'source': 28,
+      'target': 107
     },
     {
-      "source": 29,
-      "target": 107
+      'source': 29,
+      'target': 107
     },
     {
-      "source": 29,
-      "target": 25
+      'source': 29,
+      'target': 25
     },
     {
-      "source": 30,
-      "target": 107
+      'source': 30,
+      'target': 107
     },
     {
-      "source": 30,
-      "target": 25
+      'source': 30,
+      'target': 25
     },
     {
-      "source": 31,
-      "target": 32
+      'source': 31,
+      'target': 32
     },
     {
-      "source": 31,
-      "target": 33
+      'source': 31,
+      'target': 33
     },
     {
-      "source": 32,
-      "target": 107
+      'source': 32,
+      'target': 107
     },
     {
-      "source": 33,
-      "target": 107
+      'source': 33,
+      'target': 107
     },
     {
-      "source": 34,
-      "target": 33
+      'source': 34,
+      'target': 33
     },
     {
-      "source": 34,
-      "target": 35
+      'source': 34,
+      'target': 35
     },
     {
-      "source": 35,
-      "target": 107
+      'source': 35,
+      'target': 107
     },
     {
-      "source": 36,
-      "target": 30
+      'source': 36,
+      'target': 30
     },
     {
-      "source": 36,
-      "target": 29
+      'source': 36,
+      'target': 29
     },
     {
-      "source": 36,
-      "target": 24
+      'source': 36,
+      'target': 24
     },
     {
-      "source": 37,
-      "target": 35
+      'source': 37,
+      'target': 35
     },
     {
-      "source": 38,
-      "target": 107
+      'source': 38,
+      'target': 107
     },
     {
-      "source": 39,
-      "target": 35
+      'source': 39,
+      'target': 35
     },
     {
-      "source": 39,
-      "target": 29
+      'source': 39,
+      'target': 29
     },
     {
-      "source": 39,
-      "target": 30
+      'source': 39,
+      'target': 30
     },
     {
-      "source": 40,
-      "target": 23
+      'source': 40,
+      'target': 23
     },
     {
-      "source": 41,
-      "target": 33
+      'source': 41,
+      'target': 33
     },
     {
-      "source": 42,
-      "target": 25
+      'source': 42,
+      'target': 25
     },
     {
-      "source": 42,
-      "target": 33
+      'source': 42,
+      'target': 33
     },
     {
-      "source": 43,
-      "target": 26
+      'source': 43,
+      'target': 26
     },
     {
-      "source": 43,
-      "target": 44
+      'source': 43,
+      'target': 44
     },
     {
-      "source": 44,
-      "target": 108
+      'source': 44,
+      'target': 108
     },
     {
-      "source": 45,
-      "target": 108
+      'source': 45,
+      'target': 108
     },
     {
-      "source": 46,
-      "target": 45
+      'source': 46,
+      'target': 45
     },
     {
-      "source": 47,
-      "target": 45
+      'source': 47,
+      'target': 45
     },
     {
-      "source": 48,
-      "target": 49
+      'source': 48,
+      'target': 49
     },
     {
-      "source": 48,
-      "target": 50
+      'source': 48,
+      'target': 50
     },
     {
-      "source": 49,
-      "target": 108
+      'source': 49,
+      'target': 108
     },
     {
-      "source": 50,
-      "target": 108
+      'source': 50,
+      'target': 108
     },
     {
-      "source": 50,
-      "target": 49
+      'source': 50,
+      'target': 49
     },
     {
-      "source": 51,
-      "target": 52
+      'source': 51,
+      'target': 52
     },
     {
-      "source": 52,
-      "target": 49
+      'source': 52,
+      'target': 49
     },
     {
-      "source": 52,
-      "target": 108
+      'source': 52,
+      'target': 108
     },
     {
-      "source": 53,
-      "target": 52
+      'source': 53,
+      'target': 52
     },
     {
-      "source": 54,
-      "target": 108
+      'source': 54,
+      'target': 108
     },
     {
-      "source": 54,
-      "target": 53
+      'source': 54,
+      'target': 53
     },
     {
-      "source": 54,
-      "target": 52
+      'source': 54,
+      'target': 52
     },
     {
-      "source": 55,
-      "target": 108
+      'source': 55,
+      'target': 108
     },
     {
-      "source": 56,
-      "target": 44
+      'source': 56,
+      'target': 44
     },
     {
-      "source": 56,
-      "target": 45
+      'source': 56,
+      'target': 45
     },
     {
-      "source": 56,
-      "target": 49
+      'source': 56,
+      'target': 49
     },
     {
-      "source": 56,
-      "target": 50
+      'source': 56,
+      'target': 50
     },
     {
-      "source": 56,
-      "target": 52
+      'source': 56,
+      'target': 52
     },
     {
-      "source": 56,
-      "target": 54
+      'source': 56,
+      'target': 54
     },
     {
-      "source": 57,
-      "target": 18
+      'source': 57,
+      'target': 18
     },
     {
-      "source": 57,
-      "target": 44
+      'source': 57,
+      'target': 44
     },
     {
-      "source": 58,
-      "target": 50
+      'source': 58,
+      'target': 50
     },
     {
-      "source": 58,
-      "target": 49
+      'source': 58,
+      'target': 49
     },
     {
-      "source": 59,
-      "target": 54
+      'source': 59,
+      'target': 54
     },
     {
-      "source": 59,
-      "target": 52
+      'source': 59,
+      'target': 52
     },
     {
-      "source": 60,
-      "target": 48
+      'source': 60,
+      'target': 48
     },
     {
-      "source": 60,
-      "target": 61
+      'source': 60,
+      'target': 61
     },
     {
-      "source": 60,
-      "target": 62
+      'source': 60,
+      'target': 62
     },
     {
-      "source": 60,
-      "target": 63
+      'source': 60,
+      'target': 63
     },
     {
-      "source": 61,
-      "target": 108
+      'source': 61,
+      'target': 108
     },
     {
-      "source": 61,
-      "target": 49
+      'source': 61,
+      'target': 49
     },
     {
-      "source": 62,
-      "target": 108
+      'source': 62,
+      'target': 108
     },
     {
-      "source": 62,
-      "target": 49
+      'source': 62,
+      'target': 49
     },
     {
-      "source": 63,
-      "target": 108
+      'source': 63,
+      'target': 108
     },
     {
-      "source": 64,
-      "target": 65
+      'source': 64,
+      'target': 65
     },
     {
-      "source": 64,
-      "target": 66
+      'source': 64,
+      'target': 66
     },
     {
-      "source": 65,
-      "target": 109
+      'source': 65,
+      'target': 109
     },
     {
-      "source": 66,
-      "target": 67
+      'source': 66,
+      'target': 67
     },
     {
-      "source": 66,
-      "target": 68
+      'source': 66,
+      'target': 68
     },
     {
-      "source": 67,
-      "target": 109
+      'source': 67,
+      'target': 109
     },
     {
-      "source": 68,
-      "target": 109
+      'source': 68,
+      'target': 109
     },
     {
-      "source": 69,
-      "target": 68
+      'source': 69,
+      'target': 68
     },
     {
-      "source": 70,
-      "target": 68
+      'source': 70,
+      'target': 68
     },
     {
-      "source": 70,
-      "target": 55
+      'source': 70,
+      'target': 55
     },
     {
-      "source": 71,
-      "target": 109
+      'source': 71,
+      'target': 109
     },
     {
-      "source": 72,
-      "target": 71
+      'source': 72,
+      'target': 71
     },
     {
-      "source": 73,
-      "target": 65
+      'source': 73,
+      'target': 65
     },
     {
-      "source": 73,
-      "target": 71
+      'source': 73,
+      'target': 71
     },
     {
-      "source": 74,
-      "target": 65
+      'source': 74,
+      'target': 65
     },
     {
-      "source": 75,
-      "target": 71
+      'source': 75,
+      'target': 71
     },
     {
-      "source": 76,
-      "target": 63
+      'source': 76,
+      'target': 63
     },
     {
-      "source": 76,
-      "target": 77
+      'source': 76,
+      'target': 77
     },
     {
-      "source": 76,
-      "target": 109
+      'source': 76,
+      'target': 109
     },
     {
-      "source": 76,
-      "target": 74
+      'source': 76,
+      'target': 74
     },
     {
-      "source": 77,
-      "target": 76
+      'source': 77,
+      'target': 76
     },
     {
-      "source": 78,
-      "target": 109
+      'source': 78,
+      'target': 109
     },
     {
-      "source": 78,
-      "target": 76
+      'source': 78,
+      'target': 76
     },
     {
-      "source": 78,
-      "target": 74
+      'source': 78,
+      'target': 74
     },
     {
-      "source": 79,
-      "target": 80
+      'source': 79,
+      'target': 80
     },
     {
-      "source": 79,
-      "target": 81
+      'source': 79,
+      'target': 81
     },
     {
-      "source": 79,
-      "target": 82
+      'source': 79,
+      'target': 82
     },
     {
-      "source": 79,
-      "target": 83
+      'source': 79,
+      'target': 83
     },
     {
-      "source": 80,
-      "target": 109
+      'source': 80,
+      'target': 109
     },
     {
-      "source": 81,
-      "target": 109
+      'source': 81,
+      'target': 109
     },
     {
-      "source": 82,
-      "target": 109
+      'source': 82,
+      'target': 109
     },
     {
-      "source": 82,
-      "target": 81
+      'source': 82,
+      'target': 81
     },
     {
-      "source": 83,
-      "target": 109
+      'source': 83,
+      'target': 109
     },
     {
-      "source": 84,
-      "target": 83
+      'source': 84,
+      'target': 83
     },
     {
-      "source": 85,
-      "target": 86
+      'source': 85,
+      'target': 86
     },
     {
-      "source": 86,
-      "target": 109
+      'source': 86,
+      'target': 109
     },
     {
-      "source": 87,
-      "target": 86
+      'source': 87,
+      'target': 86
     },
     {
-      "source": 87,
-      "target": 71
+      'source': 87,
+      'target': 71
     },
     {
-      "source": 88,
-      "target": 90
+      'source': 88,
+      'target': 90
     },
     {
-      "source": 88,
-      "target": 91
+      'source': 88,
+      'target': 91
     },
     {
-      "source": 89,
-      "target": 88
+      'source': 89,
+      'target': 88
     },
     {
-      "source": 90,
-      "target": 109
+      'source': 90,
+      'target': 109
     },
     {
-      "source": 91,
-      "target": 109
+      'source': 91,
+      'target': 109
     },
     {
-      "source": 91,
-      "target": 90
+      'source': 91,
+      'target': 90
     },
     {
-      "source": 92,
-      "target": 93
+      'source': 92,
+      'target': 93
     },
     {
-      "source": 92,
-      "target": 94
+      'source': 92,
+      'target': 94
     },
     {
-      "source": 93,
-      "target": 109
+      'source': 93,
+      'target': 109
     },
     {
-      "source": 94,
-      "target": 109
+      'source': 94,
+      'target': 109
     },
     {
-      "source": 95,
-      "target": 86
+      'source': 95,
+      'target': 86
     },
     {
-      "source": 95,
-      "target": 90
+      'source': 95,
+      'target': 90
     },
     {
-      "source": 95,
-      "target": 91
+      'source': 95,
+      'target': 91
     },
     {
-      "source": 96,
-      "target": 86
+      'source': 96,
+      'target': 86
     },
     {
-      "source": 97,
-      "target": 90
+      'source': 97,
+      'target': 90
     },
     {
-      "source": 97,
-      "target": 91
+      'source': 97,
+      'target': 91
     },
     {
-      "source": 98,
-      "target": 109
+      'source': 98,
+      'target': 109
     },
     {
-      "source": 98,
-      "target": 49
+      'source': 98,
+      'target': 49
     },
     {
-      "source": 98,
-      "target": 95
+      'source': 98,
+      'target': 95
     },
     {
-      "source": 99,
-      "target": 100
+      'source': 99,
+      'target': 100
     },
     {
-      "source": 99,
-      "target": 101
+      'source': 99,
+      'target': 101
     },
     {
-      "source": 99,
-      "target": 102
+      'source': 99,
+      'target': 102
     },
     {
-      "source": 100,
-      "target": 109
+      'source': 100,
+      'target': 109
     },
     {
-      "source": 100,
-      "target": 86
+      'source': 100,
+      'target': 86
     },
     {
-      "source": 101,
-      "target": 100
+      'source': 101,
+      'target': 100
     },
     {
-      "source": 102,
-      "target": 109
+      'source': 102,
+      'target': 109
     },
     {
-      "source": 103,
-      "target": 0
+      'source': 103,
+      'target': 0
     },
     {
-      "source": 104,
-      "target": 103
+      'source': 104,
+      'target': 103
     },
     {
-      "source": 105,
-      "target": 0
+      'source': 105,
+      'target': 0
     },
     {
-      "source": 106,
-      "target": 0
+      'source': 106,
+      'target': 0
     },
     {
-      "source": 107,
-      "target": 0
+      'source': 107,
+      'target': 0
     },
     {
-      "source": 108,
-      "target": 0
+      'source': 108,
+      'target': 0
     },
     {
-      "source": 109,
-      "target": 0
+      'source': 109,
+      'target': 0
     }
   ]
-}
+}
\ No newline at end of file
diff --git a/datasets/xlsxTOjson.ipynb b/datasets/xlsxTOjson.ipynb
index 093a548..b8766d8 100644
--- a/datasets/xlsxTOjson.ipynb
+++ b/datasets/xlsxTOjson.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 5,
    "id": "86f8df89-a483-4093-9098-41196f891c64",
    "metadata": {},
    "outputs": [],
@@ -13,71 +13,79 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 6,
    "id": "b6873712-56e4-46a9-8bec-031093dd28b1",
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "ename": "ImportError",
+     "evalue": "Missing optional dependency 'openpyxl'.  Use pip or conda to install openpyxl.",
+     "output_type": "error",
+     "traceback": [
+      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
+      "\u001B[1;31mImportError\u001B[0m                               Traceback (most recent call last)",
+      "\u001B[1;32m~\\AppData\\Local\\Temp/ipykernel_3872/3644074374.py\u001B[0m in \u001B[0;36m<module>\u001B[1;34m\u001B[0m\n\u001B[1;32m----> 1\u001B[1;33m \u001B[0mtable\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mpd\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mread_excel\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;34m\"AuD-Inhalt2.xlsx\"\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m      2\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n",
+      "\u001B[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python38\\site-packages\\pandas\\util\\_decorators.py\u001B[0m in \u001B[0;36mwrapper\u001B[1;34m(*args, **kwargs)\u001B[0m\n\u001B[0;32m    309\u001B[0m                     \u001B[0mstacklevel\u001B[0m\u001B[1;33m=\u001B[0m\u001B[0mstacklevel\u001B[0m\u001B[1;33m,\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m    310\u001B[0m                 )\n\u001B[1;32m--> 311\u001B[1;33m             \u001B[1;32mreturn\u001B[0m \u001B[0mfunc\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;33m*\u001B[0m\u001B[0margs\u001B[0m\u001B[1;33m,\u001B[0m \u001B[1;33m**\u001B[0m\u001B[0mkwargs\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m    312\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m    313\u001B[0m         \u001B[1;32mreturn\u001B[0m \u001B[0mwrapper\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n",
+      "\u001B[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python38\\site-packages\\pandas\\io\\excel\\_base.py\u001B[0m in \u001B[0;36mread_excel\u001B[1;34m(io, sheet_name, header, names, index_col, usecols, squeeze, dtype, engine, converters, true_values, false_values, skiprows, nrows, na_values, keep_default_na, na_filter, verbose, parse_dates, date_parser, thousands, comment, skipfooter, convert_float, mangle_dupe_cols, storage_options)\u001B[0m\n\u001B[0;32m    362\u001B[0m     \u001B[1;32mif\u001B[0m \u001B[1;32mnot\u001B[0m \u001B[0misinstance\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mio\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mExcelFile\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m    363\u001B[0m         \u001B[0mshould_close\u001B[0m \u001B[1;33m=\u001B[0m \u001B[1;32mTrue\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m--> 364\u001B[1;33m         \u001B[0mio\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mExcelFile\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mio\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mstorage_options\u001B[0m\u001B[1;33m=\u001B[0m\u001B[0mstorage_options\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mengine\u001B[0m\u001B[1;33m=\u001B[0m\u001B[0mengine\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m    365\u001B[0m     \u001B[1;32melif\u001B[0m \u001B[0mengine\u001B[0m \u001B[1;32mand\u001B[0m \u001B[0mengine\u001B[0m \u001B[1;33m!=\u001B[0m \u001B[0mio\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mengine\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m    366\u001B[0m         raise ValueError(\n",
+      "\u001B[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python38\\site-packages\\pandas\\io\\excel\\_base.py\u001B[0m in \u001B[0;36m__init__\u001B[1;34m(self, path_or_buffer, engine, storage_options)\u001B[0m\n\u001B[0;32m   1231\u001B[0m         \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mstorage_options\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mstorage_options\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m   1232\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m-> 1233\u001B[1;33m         \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0m_reader\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0m_engines\u001B[0m\u001B[1;33m[\u001B[0m\u001B[0mengine\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mself\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0m_io\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mstorage_options\u001B[0m\u001B[1;33m=\u001B[0m\u001B[0mstorage_options\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m   1234\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m   1235\u001B[0m     \u001B[1;32mdef\u001B[0m \u001B[0m__fspath__\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mself\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n",
+      "\u001B[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python38\\site-packages\\pandas\\io\\excel\\_openpyxl.py\u001B[0m in \u001B[0;36m__init__\u001B[1;34m(self, filepath_or_buffer, storage_options)\u001B[0m\n\u001B[0;32m    519\u001B[0m             \u001B[0mpassed\u001B[0m \u001B[0mto\u001B[0m \u001B[0mfsspec\u001B[0m \u001B[1;32mfor\u001B[0m \u001B[0mappropriate\u001B[0m \u001B[0mURLs\u001B[0m \u001B[1;33m(\u001B[0m\u001B[0msee\u001B[0m\u001B[0;31m \u001B[0m\u001B[0;31m`\u001B[0m\u001B[0;31m`\u001B[0m\u001B[0m_get_filepath_or_buffer\u001B[0m\u001B[0;31m`\u001B[0m\u001B[0;31m`\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m    520\u001B[0m         \"\"\"\n\u001B[1;32m--> 521\u001B[1;33m         \u001B[0mimport_optional_dependency\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;34m\"openpyxl\"\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m    522\u001B[0m         \u001B[0msuper\u001B[0m\u001B[1;33m(\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0m__init__\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mfilepath_or_buffer\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mstorage_options\u001B[0m\u001B[1;33m=\u001B[0m\u001B[0mstorage_options\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m    523\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n",
+      "\u001B[1;32m~\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python38\\site-packages\\pandas\\compat\\_optional.py\u001B[0m in \u001B[0;36mimport_optional_dependency\u001B[1;34m(name, extra, errors, min_version)\u001B[0m\n\u001B[0;32m    116\u001B[0m     \u001B[1;32mexcept\u001B[0m \u001B[0mImportError\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m    117\u001B[0m         \u001B[1;32mif\u001B[0m \u001B[0merrors\u001B[0m \u001B[1;33m==\u001B[0m \u001B[1;34m\"raise\"\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m--> 118\u001B[1;33m             \u001B[1;32mraise\u001B[0m \u001B[0mImportError\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mmsg\u001B[0m\u001B[1;33m)\u001B[0m \u001B[1;32mfrom\u001B[0m \u001B[1;32mNone\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m    119\u001B[0m         \u001B[1;32melse\u001B[0m\u001B[1;33m:\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m    120\u001B[0m             \u001B[1;32mreturn\u001B[0m \u001B[1;32mNone\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n",
+      "\u001B[1;31mImportError\u001B[0m: Missing optional dependency 'openpyxl'.  Use pip or conda to install openpyxl."
+     ]
+    }
+   ],
    "source": [
     "table = pd.read_excel(\"AuD-Inhalt2.xlsx\")"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "id": "e9481135-3734-45ed-9847-8f9426bd0f00",
    "metadata": {},
    "outputs": [],
    "source": [
-    "nodes = []\n",
-    "links = []"
+    "nds = []\n",
+    "lks = []"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "id": "a138d20d-4dc3-4eb8-8ebd-71d1fb3f0cbf",
    "metadata": {},
    "outputs": [],
    "source": [
     "for row in table.itertuples():\n",
-    "    nodes.append({'id':row[1], 'name':row[5], 'description':row[9], 'type':row[4]})\n",
+    "    nds.append({'id':row[1], 'name':row[5], 'description':row[9], 'type':row[4]})\n",
     "    for link in str(row[7]).split(', '):\n",
     "        if link != \"nan\": \n",
-    "            links.append({'source':row[1], 'target':int(link)})"
+    "            lks.append({'source':row[1], 'target':int(link)})"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": null,
    "id": "c06e658c-33d1-4ba8-8a47-ae857984d6ce",
    "metadata": {},
    "outputs": [],
    "source": [
-    "result = {'nodes':nodes, 'links':links}"
+    "result = {'nodes':nds, 'links':lks}"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "id": "565d11cd-47b6-402e-a734-b4b8a5a66181",
    "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/plain": "'{\"nodes\": [{\"id\": 1, \"name\": \"Einführung\", \"description\": \"Eine Einführung in die Algorithmen und Datenstrukturen\\\\n+ Links zu Video und Folien\", \"type\": \"Vorlesung\"}, {\"id\": 2, \"name\": \"Rundreise Problem\", \"description\": \"Gegeben: Ein Graph G = (V, E) mit Kantenlängen we, Gesucht: Eine kürzeste Rundreise, welche alle Knoten im Graphen einmal besucht und im Startknoten wieder endet.\", \"type\": \"Beispiel\"}, {\"id\": 3, \"name\": \"Puzzle\", \"description\": \"Jeder hat schon einmal ein Puzzle gelöst, doch wie sieht das aus algorithmischer Sicht aus?\", \"type\": \"Beispiel\"}, {\"id\": 4, \"name\": \"Algorithmus-Definition\", \"description\": \"“Ein Algorithmus ist eine aus endlich vielen Schritten bestehende eindeutige Handlungsvorschrift zur Lösung eines Problems oder einer Klasse von Problemen.”-Wikipedia. Dabei wird als Input eine Problembeschreibung gegeben und durch Anwendung des Algorithmus eine fertige Lösung des Problems ermittelt. Oft spielt die Laufzeit des Algorithmus eine große Rolle. Sie beschreibt, wie viele einzelne Schritte nötig sind um das Problem zu lösen, in Abhängigkeit von der Größe des Problems.\", \"type\": \"Definition\"}, {\"id\": 5, \"name\": \"Kofferpacken\", \"description\": \"Kann ich alle meine Gepäckstücke auf zwei gleich große Koffer aufteilen? Gegeben: Eine Menge von n Objekten, jedes mit\\\\neiner Größe li; Gesamtgröße ∑ li = 2K\\\\nGesucht: Eine Verteilung auf zwei Koffer der Größe K\", \"type\": \"Beispiel\"}, {\"id\": 6, \"name\": \"P und NP\", \"description\": \"Die Klassen P und NP teilen algorithmische Probleme in zwei Kategorien auf. Die eine, bei der man mithilfe eines Algorithmus eine Lösung Pfinden kann (P) und eine zweite, bei der bisher nur das NachPrüfen einer existierenden Lösung gelingt (NP). Wenn es allerdings keine Lösung gibt, so lässt sich das bei Problemen der Klasse NP nur schlecht beweisen.\", \"type\": \"Definition\"}, {\"id\": 7, \"name\": \"Algorithmen und Datenstrukturen\", \"description\": \"In dieser Vorlesung wird der Begriff \\'Algorithmus\\' definiert und erklärt.\\\\n+ Links zu Video und Folien\", \"type\": \"Vorlesung\"}, {\"id\": 8, \"name\": \"Datenstrukturen\", \"description\": \"Eine Datenstruktur erlaubt es, die für eine Aufgabe notwendigen Informationen geeignet zu repräsentieren und den Zugriff und die Verwaltung während der Bearbeitung in effizienter Weise zu ermöglichen.\", \"type\": \"Definition\"}, {\"id\": 21, \"name\": \"Organisation und Pseudocode\", \"description\": \"In dieser Übung haben wir noch einmal organisatorische Dinge besprochen und uns mit dem Thema Pseudocode auseinandergesetzt.\\\\n+ Links zu Video und Folien\", \"type\": \"Übung\"}, {\"id\": 9, \"name\": \"Pseudocode\", \"description\": \"Pseudocode ist eine Art Algorithmen einigermaßen einheitlich zu notieren. Dabei werden zwar Schlüsselwörter genutzt um eine gewisse Einheitlichkeit zu bieten und gleichzeitig die Logik zu beschreiben, allerdings geht es noch nicht darum einen compilierbaren Code mit korrekter Syntax zu schreiben.\\\\n+ Link zu Pseudocodeblatt, Übung 1\", \"type\": \"Definition\"}, {\"id\": 10, \"name\": \"Graphen\", \"description\": \"Eine Einleitung in die Welt der Graphen am wohl bekanntesten Beispiel, dem Haus des Nikolaus.\\\\n+ Links zu Video und Folien\", \"type\": \"Vorlesung\"}, {\"id\": 11, \"name\": \"Haus des Nikolaus\", \"description\": \"Jeder kennt das Haus vom Nikolaus, doch wie wird es gemalt? Wo setzt man den Stift an und wo wieder ab?\", \"type\": \"Beispiel\"}, {\"id\": 12, \"name\": \"Eulertouren\", \"description\": \"Ein Eulerweg ist ein Weg in einem Graphen, welcher alle Kanten nutzt. Eine Eulertour kehrt darüber hinaus auch zum Startknoten zurück.\", \"type\": \"Definition\"}, {\"id\": 13, \"name\": \"Graphenbegriffe\", \"description\": \"Ein Graph besteht aus Knoten und Kanten das sollte inzwischen jeder wissen, doch was parallele Kanten, Schleifen, (geschlossene) Wege, Pfade, Kreise, Eulerwege/-touren, sowie Hamiltonpfade und -kreise sind wird in dieser Vorlesung noch einmal genau definiert.\\\\n+ Links zu Video und Folien\", \"type\": \"Vorlesung\"}, {\"id\": 14, \"name\": \"Graph\", \"description\": \"Über Graphen haben wir bereits viel gesprochen, doch was ein Graph genau ist und wie man ihn definiert erfährst du hier.\", \"type\": \"Definition\"}, {\"id\": 15, \"name\": \"Wege in Graphen\", \"description\": \"Eine Kantenfolge W in einem Graphen G heißt Weg, wenn sich keine Kante darin wiederholt und geschlossener Weg (Tour), wenn man am Ende wieder am Startknoten ankommt. Wiederholt sich kein Knoten spricht man von einem Pfad. Ein Kreis ist ein geschlossener Pfad. Bei einem Eulerweg/ einer Eulertour werden alle Kanten des Graphen genutzt. Ein Hamiltonpfad/kreis nutzt hingegen alle Knoten.\", \"type\": \"Definition\"}, {\"id\": 16, \"name\": \"Beweistechniken\", \"description\": \"In der Mathematik und auch in der Algorithmik spielen Beweise immer wieder eine große Rolle. Es geht darum Aussagen zu belegen, zu widerlegen oder auf bestimmte Elemente anzuwenden. Dazu gibt es verschiedene Beweistechniken, welche ihr hier finden könnt:\\\\n+ Link zu Beweisblatt, Übung 2\", \"type\": \"Übung\"}, {\"id\": 17, \"name\": \"Eulertouren\", \"description\": \"In dieser Vorlesung werden notwendige Bedingungen für Eulertouren erleutert. Zusätzlich wird das Kapitel 2 noch einmal zusammengefasst und es werden Algorithmen eingeführt um die uns bisher bekannten Probleme zu lösen.\\\\n+ Links zu Video und Folien\", \"type\": \"Vorlesung\"}, {\"id\": 18, \"name\": \"Algorithmus Wegfindung\", \"description\": \"Dieser Algorithmus (2.7) erhält als Input einen Graphen G mit höchstens zwei ungeraden Knoten und liefert als Output einen Weg in G\", \"type\": \"Algorithmus\"}, {\"id\": 19, \"name\": \"Algorithmus von Hierholzer\", \"description\": \"Dieser Algorithmus (2.8) erhält als Input einen zusammenhängenden Graphen G mit höchstens zwei ungeraden Knoten und liefert als Output einen Eulerweg, bzw. eine Eulertour in G. Dazu wird auch Algorithmus 2.7 zum Finden von Wegen in G verwendet.\", \"type\": \"Algorithmus\"}, {\"id\": 20, \"name\": \"Algorithmus von Fleury\", \"description\": \"Dieser Algorithmus(2.13) erhält als Input einen Graphen G mit höchstens 2 ungeraden Knoten und liefert als Output einen Weg in G. Der Algorithmus hat als Grundlage Algorithmus 2.7 zum Finden von Wegen. Auch lässt sich zeigen, dass man mit diesem Algorithmus eine Eulertour/einen Eulerweg finden kann\", \"type\": \"Algorithmus\"}, {\"id\": 22, \"name\": \"Anwendung von Graphen\", \"description\": \"In dieser Vorlesung geht es um den Einsatzzweck von Graphen und es wird am Beispiel der Erdös- und der Kevin Bacon Zahl gezeigt, welche Zusammenhänge dargestellt werden können.\\\\n+ Links zu Video und Folien\", \"type\": \"Vorlesung\"}, {\"id\": 23, \"name\": \"Beweistechniken Teil 2\", \"description\": \"In dieser Übung geht es um die Beweistechnik der vollständigen Induktion. Diese ist die wohl meist benutzte Beweistechnik in der Algorithmik. Auch werden Anwendungsbeispiele wie z.B. die Gauß\\'sche Summenformel oder der Zusammenhang in Graphen  erläutert.\\\\n+ Links zu Video und Folien/Notizen\", \"type\": \"Übung\"}, {\"id\": 24, \"name\": \"Graphenscan\", \"description\": \"In dieser Vorlesung wird der Graphenscanalgorithmus vorgestellt um Zusammenhangskomponenten in Graphen zu finden.\\\\n+ Links zu Video und Folien/Notizen/Beweis\", \"type\": \"Vorlesung\"}, {\"id\": 25, \"name\": \"Algorithmus Graphenscan\", \"description\": \"Dieser Algorithmus (3.7) erhählt als Input einen Graphen G = (V,E) und einen Knoten s darin und liefert als Output eine Knotenmenge Y aus V, die von s aus erreichbar ist, sowie eine Kantenmenge T aus E, welche die Erreichbarkeit sicherstellt\", \"type\": \"Algorithmus\"}, {\"id\": 26, \"name\": \"Datenstrukturen Teil 1\", \"description\": \"In dieser Vorlesung werden die Datenstrukturen Warteschlange (First In - First Out) und Stapel (Last In - First Out) vorgestellt. Außerdem geht es um ihre Rolle für Algorithmen und wie man sie implementieren kann. Das ganze wird am Beispiel des Graphscan Algorithmus gezeigt und somit werden auch Breiten- und Tiefensuche eingeführt.\\\\n+ Links zu Video und Folien/Beispiel\", \"type\": \"Vorlesung\"}, {\"id\": 27, \"name\": \"Warteschlange\", \"description\": \"Eine Warteschlange ist eine Datenstruktur, welche nach dem Prinzip \\'First In - First Out\\' arbeitet. Man findet sie auch im alltäglichen Leben oft wieder, wenn man sich beispielsweise an der Kasse anstellen muss. Der Kunde der zuerst da war, wir auch zuerst bedient.\", \"type\": \"Definition\"}, {\"id\": 28, \"name\": \"Stapel\", \"description\": \"Ein Stapel ist eine Datenstruktur, welche nach dem Prinzip \\'Last In - First Out\\' arbeitet. Im alltäglichen Leben findet man diese Form der Datenstruktur beim Geschirr abwaschen, man stapelt die Teller und der Teller der zuletzt dreckig wurde wird als erstes gereinigt, da man die Teller von oben herunter nimmt.\", \"type\": \"Definition\"}, {\"id\": 29, \"name\": \"Breitensuche\", \"description\": \"Die Breitensuche ist im Prinzip der Graphscan Algorithmus, ausgeführt mithilfe einer Warteschlange als Datenstruktur. Sie breitet sich aus wie eine Welle.\", \"type\": \"Algorithmus\"}, {\"id\": 30, \"name\": \"Tiefensuche\", \"description\": \"Die Breitensuche ist im Prinzip der Graphscan Algorithmus, ausgeführt mithilfe eines Stapels als Datenstruktur. Dabei werden eher einzelne Pfade gelaufen.\", \"type\": \"Algorithmus\"}, {\"id\": 31, \"name\": \"Datenstrukturen Teil 2\", \"description\": \"In dieser Vorlesung geht es einerseits um die Anwendung der Breitensuche, andererseits werden noch 2 weitere Datenstrukturen eingeführt: Die Inzidenz/-Adjazenzmatrix, sowie die Kantenliste\\\\n+ Links zu Video und Folien/Notizen\", \"type\": \"Vorlesung\"}, {\"id\": 32, \"name\": \"Inzidenz/-Adjazenzmatrix\", \"description\": \"In einer Inzidenzmatrix wird mithilfe von 1en und 0en dargestellt, welche Knoten mit welchen Kanten inzident (zusammentreffend) sind. Bei einer Adjazenzmatrix wird dargestellt, welche Knoten adjazent (durch eine Kante verbunden) sind.\", \"type\": \"Definition\"}, {\"id\": 33, \"name\": \"Kanten-/Adjazenzliste\", \"description\": \"Eine Kantenliste ist eine Liste bestehend aus einträgen der Form {vx, vy}, welche bedeuten, dass eine Kante zwischen vx und vy im Graphen existiert.\", \"type\": \"Definition\"}, {\"id\": 34, \"name\": \"Wachstum/O-Notation\", \"description\": \"In dieser Vorlesung wird noch einmal mit den Adjazenz- und Kantenlisten abgeschlossen. Außerdem schauen wir uns einmal das Wachstum von Funktionen an und definieren und die O-Notation um damit zu arbeiten.\\\\n+ Links zu Video und Folien/Notizen\", \"type\": \"Vorlesung\"}, {\"id\": 35, \"name\": \"O-Notation\", \"description\": \"Die O-Notation wird genutzt um das Wachstum von Funktionen abzuschätzen. Damit können Größenordnungen und Wachstumsverhalten beschrieben werden.\", \"type\": \"Definition\"}, {\"id\": 36, \"name\": \"Graphscan Übung\", \"description\": \"Simple Anwengung des Graphscan Algorithmus, einmal als Breiten- und als Tiefensuche. Wann welcher Algorithmus besser geeignet ist wird in dieser Übung erklärt.\", \"type\": \"Übung\"}, {\"id\": 37, \"name\": \"Wachstum\", \"description\": \"Die O-Notation wird genutzt um das Wachstum von Funktionen abzuschätzen. In dieser Übung werden Zusammenhänge zwischen der Größe des Inputs und dem Wachstum, sowie Relationen zwischen Laufzeitklassen näher beleuchtet. Auch wird die O-Notation an verschiedenen Beispielen erklärt.\", \"type\": \"Übung\"}, {\"id\": 38, \"name\": \"Wiederholung oder\\\\nSuche in Graphen Zusammenfassung\", \"description\": \"Noch einmal ein Rückblick auf alles, was bisher in \\'Kapitel 3: Suche in Graphen\\' passiert ist. \\\\n+ Links zu Video und Folien\", \"type\": \"Vorlesung\"}, {\"id\": 39, \"name\": \"Eigenschaften von DFS und BFS\", \"description\": \"In dieser Vorlesung betrachten wir die Breiten- und Tiefensuche im Hinblick auf ihre Laufzeit. Dabei wird anschaulich, wie die Algorithmen arbeiten, wann man sie am besten nutzen sollte und wie man Laufzeiten beweisen kann.\\\\n+ Links zu Video und Folien/Notizen\", \"type\": \"Vorlesung\"}, {\"id\": 40, \"name\": \"Induktionsbeweise Bsp.\", \"description\": \"Einige Beispiele, bei denen der Induktionsbeweis auch in der Graphentheorie zum Einsatz kommt. \", \"type\": \"Beispiel\"}, {\"id\": 41, \"name\": \"Adjazenzliste\", \"description\": \"Wie eine Adjazenzliste für einen Graphen erstellt werden kann wird hier einmal genauer beleuchtet.\", \"type\": \"Beispiel\"}, {\"id\": 42, \"name\": \"Graphscan Beispiel\", \"description\": \"Hier wird der Graphscan Algorithmus einmal mithilfe einer Adjazenzliste als Datenstruktur durchgeführt.\", \"type\": \"Beispiel\"}, {\"id\": 43, \"name\": \"Dynamische Datenstrukturen\", \"description\": \"In dieser Vorlesung beginnen wir dynamische Datenstrukturen einzuführen. Es werden Stapel, Warteschlangen und verkettete Listen vorgestellt. Außerdem beschäftigen wir uns mit binärer Suche.\\\\n+ Links zu Video und Folien\", \"type\": \"Vorlesung\"}, {\"id\": 44, \"name\": \"Verkettete Liste\", \"description\": \"Eine verkettete Liste ist eine dynamische Datenstruktur. Dabei werden für die einzelnen Elemente jeweils Vorgänger und Nachfolger mit gespeichert. Der Vorteil hierbei ist, dass neue Einträge überall eingefügt werden können.\", \"type\": \"Definition\"}, {\"id\": 45, \"name\": \"Binäre Suche\", \"description\": \"Dieser Algorithmus (4.1) erhält als Input einen sortierten Array mit Einträgen S[I], Suchwert WERT, linke Randposition LINKS, rechte Randposition RECHTS und liefert als Output die Position von WERT zwischen Arraypositionen LINKS und RECHTS, falls existent.\", \"type\": \"Algorithmus\"}, {\"id\": 46, \"name\": \"Binäre Suche Idee\", \"description\": \"Ein einleitendes Beispiel zur Binären Suche.\", \"type\": \"Beispiel\"}, {\"id\": 47, \"name\": \"Binäre Suche Beispiel\", \"description\": \"Der Algorithmus für die binäre Suche einmal an zwei Beispielen angewandt.\", \"type\": \"Beispiel\"}, {\"id\": 48, \"name\": \"Binäre Suchbäume\", \"description\": \"In dieser Vorlesung beschäftigen wir uns genauer mit binären Suchbäumen und den darauf anwendbaren Operationen, wie Maximum, Minimum, einfügen und löschen von Knoten, sowie mit der binären Suche.\\\\n+ Links zu Video und Folien\", \"type\": \"Vorlesung\"}, {\"id\": 49, \"name\": \"Binärer Suchbaum\", \"description\": \"In dieser Definition werden die Begriffe \\'gerichteter Graph/Baum\\', \\'Höhe eines Baumes\\', \\'(voller/vollständiger) binärer Baum\\', \\'Blatt eines Baumes\\', \\'Teilbaum eines Knotens\\' und \\'binärer Suchbaum\\' definiert und erklärt.\", \"type\": \"Definition\"}, {\"id\": 50, \"name\": \"Grundoperationen Suchbaum\", \"description\": \"Minimum/Maximum finden, Suche im Baum, Nachfolger finden, Einfügen und Löschen sind die Grundoperationen, welche auf binäre Suchbäume angewendet werden können. Und hier findet ihr die Algorithmen dazu.\", \"type\": \"Algorithmus\"}, {\"id\": 51, \"name\": \"AVL-Bäume\", \"description\": \"In dieser Vorlesung beschäftigen wir uns mit speziellen binären Suchbäumen, den AVL-Bäumen und ihren Eigenschaften.\\\\n+ Links zu Video und Folien/Notizen\", \"type\": \"Vorlesung\"}, {\"id\": 52, \"name\": \"AVL-Baum\", \"description\": \"Ein binärer Suchbaum ist höhenbalanciert, wenn sich für jeden Knoten v die Höhe der beiden Kinder von v um höchstens 1 unterscheidet. Ein höhenbalancierter Suchbaum heißt auch AVL-Baum.\", \"type\": \"Definition\"}, {\"id\": 53, \"name\": \"dyn. Operationen auf AVL-Bäumen\", \"description\": \"In dieser Vorlesung beschäftigen wir uns mit dem Erhalt der AVL-Eigenschaft eines binären Suchbaumes bei Einfüge- und Löschoperationen. Außerdem werfen wir einen Blick auf die Fibonacci-Zahlen.\\\\n+ Links zu Video und Folien\", \"type\": \"Vorlesung\"}, {\"id\": 54, \"name\": \"AVL-Rotation\", \"description\": \"Dieser Algorithmus (4.9) erhält als Input einen Knoten x eines binären Suchbaumes T, Vaterknoten y, Großvaterknoten z und liefert als Output den binären Suchbaum T nach Umstrukturierung mit x, y, z.\", \"type\": \"Algorithmus\"}, {\"id\": 55, \"name\": \"Fibonacci-Zahlen\", \"description\": \"Die Fibonacci-Zahlen sind eine rekursiv definierte Zahlenfolge, bei der sich eine Zahl aus der Summe ihrer zwei Vorgänger ergibt. Dabei sind die ersten beiden Elemente gegeben als 1. Die Fibonacci-Zahlen finden sich überall in der Natur wieder und haben nicht wenig mit unserer Auffassung von Schönheit zu tun.\", \"type\": \"Definition\"}, {\"id\": 56, \"name\": \"Bäume-Übung\", \"description\": \"In dieser Übung beschäftigen wir uns noch einmal genauer mit einigen Datenstrukturen wie verketteten Listen, binären Bäumen und AVL-Bäumen.\", \"type\": \"Übung\"}, {\"id\": 57, \"name\": \"Laufzeit von Algorithmus 2.7\", \"description\": \"Wir betrachten einmal die Laufzeit des Hierholzer-Algorithmus (2.7) und im Zusammenhang damit auch verkettete Listen.\", \"type\": \"Beispiel\"}, {\"id\": 58, \"name\": \"Grundoperationen Suchbaum\", \"description\": \"In diesem Teil der Übung werden einmal die Operationen Einfügen, Suchen, Vorgänger/Nachfolger finden, löschen und verschmelzen von binären Suchbäumen geübt.\", \"type\": \"Beispiel\"}, {\"id\": 59, \"name\": \"AVL-Baum-Operationen\", \"description\": \"Wir schauen uns noch einmal genauer die AVL-Bäume an und was man damit machen kann. Insbesondere auch die Operationen Löschen und Einfügen.\", \"type\": \"Beispiel\"}, {\"id\": 60, \"name\": \"Dynamische Datenstrukturen 2\", \"description\": \"In dieser Vorlesung schauen wir noch einmal auf das bisher in Kapitel 4 gelernte zurück. Außerdem geben wir einen Überblick über einige weitere dynamische Datenstrukturen wie Rot-Scharz-Bäumme, B-Bäume und Heaps.\\\\n+ Links zu Video und Folien\", \"type\": \"Vorlesung\"}, {\"id\": 61, \"name\": \"Rot-Schwarz-Bäume\", \"description\": \"Ein binärer Suchbaum heißt Rot-Schwarz-Baum, wenn er die folgenden Eigenschaften erfüllt:\\\\n1. Jeder Knoten ist entweder rot oder schwarz.\\\\n2. Die Wurzel ist schwarz.\\\\n3. Jedes Blatt (NIL) ist schwarz.\\\\n4. Wenn ein Knoten rot ist, sind seine beiden Kinder schwarz.\\\\n5. Für jeden Knoten enthalten alle Pfade nach unten zu einem Blatt des Teilbaumes die gleiche Anzahl schwarzer Knoten.\", \"type\": \"Definition\"}, {\"id\": 62, \"name\": \"B-Bäume\", \"description\": \"B-Bäume sind binäre Suchbäume, welche für externen Speicher (HDDs) optimiert sind. Dabei wird die Höhe des Baumes minimiert und es werden den Knoten mehr Schlüssel zugewiesen.\", \"type\": \"Definition\"}, {\"id\": 63, \"name\": \"Heaps\", \"description\": \"Ein gerichteter binärer Baum heißt binärer Min/Max-Heap, wenn jeder Knoten einen Schlüssel hat, alle Ebenen außer der \\'letzten\\' genau 2 Knoten haben, auf der \\'letzten\\' Ebene die linken n-(2^h)+1 Positionen besetzt sind und jeder Schlüssel eines Knotens höchstens/mindestens so groß ist wie die seiner Kinder.\", \"type\": \"Definition\"}, {\"id\": 64, \"name\": \"Sortieren\", \"description\": \"In dieser Vorlesung geben wir eine Einführung in das Oberthema Sortieren. Wir stellen außerdem einen Sortieralgorithmus mit dem Namen Mergesort vor und stellen grundlegende Überlegungen zur Laufzeit von Sortieralgorithmen an.\\\\n+ Links zu Video und Folien/Notizen\", \"type\": \"Vorlesung\"}, {\"id\": 65, \"name\": \"Merge-Sort\", \"description\": \"Dieser Algorithmus (5.1) erhält als Input ein Subarray von A=[1,...,n], der bei Index p beginnt und bei Index r endet, d.h. A[p,...,r] und liefert als Output ein sortiertes Subarray. Wichtig ist dafür auch die Subroutine (5.2), welche als Input zwei sortierte Subarrays von A=[1,...,n], d.h. A[p,...,q] und A[q+1,...,r] erhält und als Output das sortierte Subarray A[p,...,r] liefert.\", \"type\": \"Algorithmus\"}, {\"id\": 66, \"name\": \"Sortier-Laufzeitschranken\", \"description\": \"In dieser Vorlesung leiten wir konkrete Laufzeitschranken für das Problem des Sortierens einer Liste von Zahlen her. Zudem machen wir uns Gedanken über das Lösen von Rekursionsgleichungen.\\\\n+ Links zu Video und Folien/Notizen\", \"type\": \"Vorlesung\"}, {\"id\": 67, \"name\": \"Permutation\", \"description\": \"Eine Permutation P ist eine Umsortierung von n Objekten.\", \"type\": \"Definition\"}, {\"id\": 68, \"name\": \"Erzeugende Funktionen\", \"description\": \"Erzeugende Funktionen können genutzt werden um Rekursionen zu lösen.\", \"type\": \"Definition\"}, {\"id\": 69, \"name\": \"Erzeugende Funktionen/Mastertheorem\", \"description\": \"In dieser Vorlesung besprechen wir weitere Details zu erzeugenden Funktionen und führen das Master-Theorem ein.\\\\n+ Links zu Video und Folien/Notizen\", \"type\": \"Vorlesung\"}, {\"id\": 70, \"name\": \"erzeugende Funktionen Fibonacci-Zahlen\", \"description\": \"In diesem Beispiel wird einmal die erzeugende Funktion der Fibonacci-Zahlen hergeleitet.\", \"type\": \"Beispiel\"}, {\"id\": 71, \"name\": \"Master-Theorem\", \"description\": \"Das Master-Theorem bietet eine schnelle Lösung für die Frage, in welcher Laufzeitklasse eine gegebene rekursiv definierte Funktion liegt. Dies funktioniert leider nur, solange einer der drei Fälle des Theorems auf die Funktion angewandt werden kann, ansonsten liefert das Theorem keine Aussage.\", \"type\": \"Definition\"}, {\"id\": 72, \"name\": \"Master-Theorem Beispiele\", \"description\": \"Einige Beispiele, an denen das Master-Theorem und seine Funktion noch einmal verdeutlicht wird.\", \"type\": \"Beispiel\"}, {\"id\": 73, \"name\": \"Sortieralgorithmen und Master-Theorem\", \"description\": \"Wir betrachten ein weiteres Beispiel für Mergesort und leiten erneut die Laufzeit des Sortieralgorithmus her, indem das Master-Theorem benutzt wird. Außerdem betrachten wir einen weiteren Sortieralgorithmus: Heapsort.\\\\n+ Links zu Video und Folien\", \"type\": \"Übung\"}, {\"id\": 74, \"name\": \"Merge-Sort Beispiel\", \"description\": \"Hier wird der Merge-Sort Algorithmus einmal mit einem Beispiel komplett durchgeführt und die Laufzeit des Algorithmus betrachtet.\", \"type\": \"Beispiel\"}, {\"id\": 75, \"name\": \"Master-Theorem Beispiel\", \"description\": \"3 weitere Beispiele, welche dabei helfen das Master-Theorem zu verstehen und anzuwenden.\", \"type\": \"Beispiel\"}, {\"id\": 76, \"name\": \"Max-Heaps\", \"description\": \"Hier wir aufgezeigt, wie man mithilfe eines Algorithmus Max-Heaps bildet. \", \"type\": \"Algorithmus\"}, {\"id\": 77, \"name\": \"Max-Heaps\", \"description\": \"Hier wird der Algorithmus aus der Übung 6 zum Erstellen eines Max-Heaps einmal an einem Beispiel angewandt.\", \"type\": \"Beispiel\"}, {\"id\": 78, \"name\": \"Heapsort\", \"description\": \"Heapsort ist ein Algorithmus bei dem mithilfe von Max-Heaps eine Reihe von Elementen sortiert werden kann. Der Algorithmus hat dabei eine Laufzeit von O(n log n), wie auch in Übung 6 bewiesen wird.\", \"type\": \"Algorithmus\"}, {\"id\": 79, \"name\": \"nichtlineare Rekursionen (Exkurs)\", \"description\": \"In dieser Vorlesung haben wir einen Exkurs in die nichtlineare Rekursion gemacht.\\\\n+ Links zu Video und Folien\", \"type\": \"Vorlesung\"}, {\"id\": 80, \"name\": \"logistische Rekursion\", \"description\": \"Logistische Rekursion bezeichnet ein Wachstum proportional zu einer Größe. Dabei betrachtet man beispielsweise eine Bevölkerung, welche zwar durch Fruchtbarkeit immer weiter wächst, aber beispielsweise durch Tod auch wieder im Wachstum beschränkt wird.\", \"type\": \"Definition\"}, {\"id\": 81, \"name\": \"Mandelbrot-Menge\", \"description\": \"Die Mandelbrot-Menge, benannt nach Benoît Mandelbrot, ist eine Menge in den komplexen Zahlen. Interpretiert man sie als geometrische Figur, so ergibt sich ein Fraktal, welches im allgemeinen Sprachgebrauch auch als Apfelmännchen bekannt ist.\", \"type\": \"Definition\"}, {\"id\": 82, \"name\": \"Fraktale\", \"description\": \"Ein Fraktal beschreibt natürliche oder künstliche Gebilde oder geometrische Muster und ist ein von Benoît Mandelbrot geprägter Begriff. - Wikipedia\", \"type\": \"Definition\"}, {\"id\": 83, \"name\": \"Zelluläre Automaten\", \"description\": \"Zelluläre oder auch zellulare Automaten dienen der Modellierung räumlich diskreter dynamischer Systeme, wobei die Entwicklung einzelner Zellen zum Zeitpunkt t+1 primär von den Zellzuständen in einer vorgegebenen Nachbarschaft und vom eigenen Zustand zum Zeitpunkt t abhängt. - Wikipedia\", \"type\": \"Definition\"}, {\"id\": 84, \"name\": \"Game of Life\", \"description\": \"Das \\'Game of Life\\' ist das wohl bekannteste Beispiel eines zellulären Automaten. \", \"type\": \"Beispiel\"}, {\"id\": 85, \"name\": \"Quick-Sort\", \"description\": \"In dieser Vorlesung kehren wir zurück zu Sortieralgorithmen und stellen den Quicksort-Algorithmus vor.\\\\n+ Links zu Video und Folien/Notizen\", \"type\": \"Vorlesung\"}, {\"id\": 86, \"name\": \"Quick-Sort\", \"description\": \"Dieser Algorithmus (5.14) erhält als Input ein Subarray von A=[1,...,n], der bei Index p beginnt und bei Index r endet, d.h. A[p,...,r] und liefert als Output einen sortierten Subarray. Dabei ist auch Subroutine 5.15 wichtig, welche als Input ein Subarray von A=[1,...,n], d.h. A[p,...,r] erhält und als Output zwei Subarrays A[p,...,q-1] und A[q+1,...,r] mit A[i]≤A[q] und A[q]<A[j] für i=p,...,q-1 und j=q+1,...,r liefert.\", \"type\": \"Algorithmus\"}, {\"id\": 87, \"name\": \"Laufzeit von Quick-Sort\", \"description\": \"Die Laufzeit des Quick-Sort Algorithmus lässt sich mithilfe vom Master-Theorem ermitteln. Dazu betrachten wir die 3 Fälle best-case, average-case und worst-case für den Algorithmus.\", \"type\": \"Beispiel\"}, {\"id\": 88, \"name\": \"Mediane\", \"description\": \"In dieser Vorlesung beschäftigen wir uns mit Medianen.\\\\n+ Links zu Video und Folien\", \"type\": \"Vorlesung\"}, {\"id\": 89, \"name\": \"Standortprobleme\", \"description\": \"Was ist der optimale Standort für beispielsweise ein Amazon-Lagerhaus? Idee: Die durchschnittliche Distanz zu den zu beliefernden Gebäuden minimieren. In Amerika ist dies leicht umgesetzt mit der sogenannten Manhatten-Distanz. Dieses Problem ist die Einführung in das Thema der Mediane.\", \"type\": \"Definition\"}, {\"id\": 90, \"name\": \"Median (diskret)\", \"description\": \"Der Rank k eines Elements x (auch \\'k-tes Element\\') ist definiert durch |{y ∈ X |y<=x}| = k. Also die Anzahl der Elemente, welche kleiner oder gleich x sind. Speziell heißt x Median, wenn er das [n/2]-te Element ist. [n/2] wird dabei abgerundet.\", \"type\": \"Definition\"}, {\"id\": 91, \"name\": \"Median (kontinuierlich)\", \"description\": \"Der kontinuierliche Median hat als Eigenschaft, dass das sowohl Integral bis zum Median, als auch ab dem Median größer-gleich 1/2 ist.\", \"type\": \"Definition\"}, {\"id\": 92, \"name\": \"Sortieralgorithmen Sonderfälle\", \"description\": \"In dieser Vorlesung beschäftigen wir uns mit Sonderfällen für Sortieralgorithmen, durch die Sortieren in linearer Zeit ermöglicht wird. Dabei werfen wir einen näheren Blick auf die Sortierverfahren Countingsort und Radixsort.\\\\n+ Links zu Video und Folien/Notizen\", \"type\": \"Vorlesung\"}, {\"id\": 93, \"name\": \"Counting-Sort\", \"description\": \"Dieser Algorithmus (5.14) erhält als Input ein Array von A=[1],...,A[n] mit Schlüsselwerten aus {1,…, k} und liefert als Output eine sortierte Kopie B[1],…,B[n] von [1],...,A[n].\", \"type\": \"Algorithmus\"}, {\"id\": 94, \"name\": \"Radix-Sort\", \"description\": \"Dieser Algorithmus (5.18) erhält als Input n Zahlen mit je d Ziffern, die k verschiedene Werte annehmen können, [1],...,A[n]  und liefert als Output einen sortierten Array. Dabei geht Radix-Sort im Gegensatz zu anderen Sortieralgorithmen ziffernweise vor.\", \"type\": \"Algorithmus\"}, {\"id\": 95, \"name\": \"Quick-Sort, Mediane, kd-Bäume\", \"description\": \"In dieser Übung schauen wir uns noch einmal das Sortierverfahren Quicksort an und sprechen über die Berechnung von Medianen. Außerdem schauen wir uns mit den kd-Bäumen eine spezielle Datenstruktur für mehrdimensionale Daten an.\\\\n+ Links zu Video und Folien\", \"type\": \"Übung\"}, {\"id\": 96, \"name\": \"Quick-Sort Beispiel\", \"description\": \"In diesem Beispiel wird die Funktionsweise von Quick-Sort, sowie die Laufzeit betrachtet.\", \"type\": \"Beispiel\"}, {\"id\": 97, \"name\": \"Mediane Beispiel\", \"description\": \"In diesem Teil der Übung schauen wir uns noch einmal genauer an, was Mediane sind, wie man sie algorithmisch bestimmen kann und in welcher Laufzeit das möglich ist.\", \"type\": \"Beispiel\"}, {\"id\": 98, \"name\": \"kd-Bäume (Exkurs)\", \"description\": \"kd-Bäume sind Bäume mit einer höheren Dimension. Mithilfe der Idee den Baum abwechselnd nach x- und y-Koordinate zu durchsuchen und so zu konstruieren entsteht ein Algorithmus mit dem man mehrdimensionale Suchbäume erstellen kann. Auch schauen wir uns an, wie man in einem solchen Baum sucht.\", \"type\": \"Definition\"}, {\"id\": 99, \"name\": \"(parallelisierte) Sortierverfahren\", \"description\": \"In dieser Vorlesung beenden wir das Kapitel zum Thema Sortieralgorithmen und werfen abschließend einen Blick auf parallelisierte Sortierverfahren.\\\\n+ Links zu Video und Folien/Notizen\", \"type\": \"Vorlesung\"}, {\"id\": 100, \"name\": \"Bubble-Sort Beispiel\", \"description\": \"Einige Beispiele, wie Bubble-Sort funktioniert, inklusive einiger verschiedener Darstellungen/Animationen und dem Vergleich mit Quick-Sort.\", \"type\": \"Algorithmus\"}, {\"id\": 101, \"name\": \"paralleles Bubble-Sort\", \"description\": \"Mithilfe von Parallelisierung lässt sich Bubble-Sort auch in linearer Zeit umsetzen. Die Idee dafür wird hier einmal erläutert.\", \"type\": \"Definition\"}, {\"id\": 102, \"name\": \"Bogo-Sort\", \"description\": \"Bogo-Sort ist ein eher als Scherz gemeinter Sortieralgorithmus. Dabei wird die gegebene Menge solange zufällig durchpermutiert und überprüft bis die korrekte Lösung erreicht ist.\", \"type\": \"Algorithmus\"}, {\"id\": 103, \"name\": \"Zusammenfassung\", \"description\": \"Diese Vorlesung markiert das Ende der Vorlesungszeit. Wir gehen deshalb noch einmal Rückblickend über die verschiedenen Themen die in den vergangenen Monaten behandelt wurden und geben die Möglichkeit Fragen zu stellen.\\\\n+ Links zu Video und Folien\", \"type\": \"Vorlesung\"}, {\"id\": 104, \"name\": \"Klausurvorbereitung\", \"description\": \"Die letzte große Übung von AuD mit Spiel, Spaß, Spannung und vielen Fragen.\\\\n+ Links zu Video und Folien\", \"type\": \"Übung\"}, {\"id\": 105, \"name\": \"Einleitung\", \"description\": \"Eine Einleitung in die Welt der Algorithmen und Datenstrukturen. Was ist ein Algorithmus und wozu wird er benötigt? Und was haben Datenstrukturen damit zu tun?\", \"type\": \"Kapitel\"}, {\"id\": 106, \"name\": \"Graphen\", \"description\": \"Graphen sind eine wichtige Darstellungsform von Daten in der Informatik. Wie Graphen aufgebaut sind und was man alles mit ihnen machen kann wird in diesem Kapitel behandelt.\", \"type\": \"Kapitel\"}, {\"id\": 107, \"name\": \"Suche in Graphen\", \"description\": \"Die Suche in Graphen ist ein wichtiges Werkzeug. Allerdings gibt es mehrere Wege, welche zum Ziel führen und nicht alle funktionieren gleich gut. Wie man effizient in Graphen sucht wird in diesem Kapitel behandelt.\", \"type\": \"Kapitel\"}, {\"id\": 108, \"name\": \"Dynamische Datenstrukturen\", \"description\": \"Im Laufe der Vorlesung wurden bereits einige Datenstrukturen vorgestellt. In diesem Kapitel beschäftigen wir uns mit einer weiteren Klasse der Datenstrukturen, den dynamischen Datenstrukturen. Und damit, welche Möglichkeiten sie bieten.\", \"type\": \"Kapitel\"}, {\"id\": 109, \"name\": \"Sortieren\", \"description\": \"Neben der Suche von Elementen spielt auch das Sortieren in der Informatik eine große Rolle. Wie man das macht wird in diesem Kapitel behandelt.\", \"type\": \"Kapitel\"}, {\"id\": 0, \"name\": \"AuD1\", \"description\": \"Algorithmen und Datenstrukturen 1\", \"type\": \"Kapitel\"}], \"links\": [{\"source\": 1, \"target\": 105}, {\"source\": 2, \"target\": 1}, {\"source\": 3, \"target\": 1}, {\"source\": 4, \"target\": 105}, {\"source\": 4, \"target\": 7}, {\"source\": 5, \"target\": 1}, {\"source\": 6, \"target\": 1}, {\"source\": 7, \"target\": 105}, {\"source\": 8, \"target\": 7}, {\"source\": 21, \"target\": 105}, {\"source\": 9, \"target\": 105}, {\"source\": 9, \"target\": 21}, {\"source\": 10, \"target\": 106}, {\"source\": 11, \"target\": 14}, {\"source\": 12, \"target\": 106}, {\"source\": 12, \"target\": 15}, {\"source\": 12, \"target\": 17}, {\"source\": 12, \"target\": 19}, {\"source\": 12, \"target\": 20}, {\"source\": 13, \"target\": 14}, {\"source\": 13, \"target\": 15}, {\"source\": 14, \"target\": 106}, {\"source\": 15, \"target\": 106}, {\"source\": 16, \"target\": 106}, {\"source\": 17, \"target\": 18}, {\"source\": 18, \"target\": 106}, {\"source\": 19, \"target\": 18}, {\"source\": 20, \"target\": 18}, {\"source\": 22, \"target\": 107}, {\"source\": 23, \"target\": 107}, {\"source\": 23, \"target\": 16}, {\"source\": 24, \"target\": 25}, {\"source\": 25, \"target\": 107}, {\"source\": 26, \"target\": 27}, {\"source\": 26, \"target\": 28}, {\"source\": 26, \"target\": 29}, {\"source\": 26, \"target\": 30}, {\"source\": 26, \"target\": 31}, {\"source\": 27, \"target\": 107}, {\"source\": 28, \"target\": 107}, {\"source\": 29, \"target\": 107}, {\"source\": 29, \"target\": 25}, {\"source\": 30, \"target\": 107}, {\"source\": 30, \"target\": 25}, {\"source\": 31, \"target\": 32}, {\"source\": 31, \"target\": 33}, {\"source\": 32, \"target\": 107}, {\"source\": 33, \"target\": 107}, {\"source\": 34, \"target\": 33}, {\"source\": 34, \"target\": 35}, {\"source\": 35, \"target\": 107}, {\"source\": 36, \"target\": 30}, {\"source\": 36, \"target\": 29}, {\"source\": 36, \"target\": 24}, {\"source\": 37, \"target\": 35}, {\"source\": 38, \"target\": 107}, {\"source\": 39, \"target\": 35}, {\"source\": 39, \"target\": 29}, {\"source\": 39, \"target\": 30}, {\"source\": 40, \"target\": 23}, {\"source\": 41, \"target\": 33}, {\"source\": 42, \"target\": 25}, {\"source\": 42, \"target\": 33}, {\"source\": 43, \"target\": 26}, {\"source\": 43, \"target\": 44}, {\"source\": 44, \"target\": 108}, {\"source\": 45, \"target\": 108}, {\"source\": 46, \"target\": 45}, {\"source\": 47, \"target\": 45}, {\"source\": 48, \"target\": 49}, {\"source\": 48, \"target\": 50}, {\"source\": 49, \"target\": 108}, {\"source\": 50, \"target\": 108}, {\"source\": 50, \"target\": 49}, {\"source\": 51, \"target\": 52}, {\"source\": 52, \"target\": 49}, {\"source\": 52, \"target\": 108}, {\"source\": 53, \"target\": 52}, {\"source\": 54, \"target\": 108}, {\"source\": 54, \"target\": 53}, {\"source\": 54, \"target\": 52}, {\"source\": 55, \"target\": 108}, {\"source\": 56, \"target\": 44}, {\"source\": 56, \"target\": 45}, {\"source\": 56, \"target\": 49}, {\"source\": 56, \"target\": 50}, {\"source\": 56, \"target\": 52}, {\"source\": 56, \"target\": 54}, {\"source\": 57, \"target\": 18}, {\"source\": 57, \"target\": 44}, {\"source\": 58, \"target\": 50}, {\"source\": 58, \"target\": 49}, {\"source\": 59, \"target\": 54}, {\"source\": 59, \"target\": 52}, {\"source\": 60, \"target\": 48}, {\"source\": 60, \"target\": 61}, {\"source\": 60, \"target\": 62}, {\"source\": 60, \"target\": 63}, {\"source\": 61, \"target\": 108}, {\"source\": 61, \"target\": 49}, {\"source\": 62, \"target\": 108}, {\"source\": 62, \"target\": 49}, {\"source\": 63, \"target\": 108}, {\"source\": 64, \"target\": 65}, {\"source\": 64, \"target\": 66}, {\"source\": 65, \"target\": 109}, {\"source\": 66, \"target\": 67}, {\"source\": 66, \"target\": 68}, {\"source\": 67, \"target\": 109}, {\"source\": 68, \"target\": 109}, {\"source\": 69, \"target\": 68}, {\"source\": 70, \"target\": 68}, {\"source\": 70, \"target\": 55}, {\"source\": 71, \"target\": 109}, {\"source\": 72, \"target\": 71}, {\"source\": 73, \"target\": 65}, {\"source\": 73, \"target\": 71}, {\"source\": 74, \"target\": 65}, {\"source\": 75, \"target\": 71}, {\"source\": 76, \"target\": 63}, {\"source\": 76, \"target\": 77}, {\"source\": 76, \"target\": 109}, {\"source\": 76, \"target\": 74}, {\"source\": 77, \"target\": 76}, {\"source\": 78, \"target\": 109}, {\"source\": 78, \"target\": 76}, {\"source\": 78, \"target\": 74}, {\"source\": 79, \"target\": 80}, {\"source\": 79, \"target\": 81}, {\"source\": 79, \"target\": 82}, {\"source\": 79, \"target\": 83}, {\"source\": 80, \"target\": 109}, {\"source\": 81, \"target\": 109}, {\"source\": 82, \"target\": 109}, {\"source\": 82, \"target\": 81}, {\"source\": 83, \"target\": 109}, {\"source\": 84, \"target\": 83}, {\"source\": 85, \"target\": 86}, {\"source\": 86, \"target\": 109}, {\"source\": 87, \"target\": 86}, {\"source\": 87, \"target\": 71}, {\"source\": 88, \"target\": 90}, {\"source\": 88, \"target\": 91}, {\"source\": 89, \"target\": 88}, {\"source\": 90, \"target\": 109}, {\"source\": 91, \"target\": 109}, {\"source\": 91, \"target\": 90}, {\"source\": 92, \"target\": 93}, {\"source\": 92, \"target\": 94}, {\"source\": 93, \"target\": 109}, {\"source\": 94, \"target\": 109}, {\"source\": 95, \"target\": 86}, {\"source\": 95, \"target\": 90}, {\"source\": 95, \"target\": 91}, {\"source\": 96, \"target\": 86}, {\"source\": 97, \"target\": 90}, {\"source\": 97, \"target\": 91}, {\"source\": 98, \"target\": 109}, {\"source\": 98, \"target\": 49}, {\"source\": 98, \"target\": 95}, {\"source\": 99, \"target\": 100}, {\"source\": 99, \"target\": 101}, {\"source\": 99, \"target\": 102}, {\"source\": 100, \"target\": 109}, {\"source\": 100, \"target\": 86}, {\"source\": 101, \"target\": 100}, {\"source\": 102, \"target\": 109}, {\"source\": 103, \"target\": 0}, {\"source\": 104, \"target\": 103}, {\"source\": 105, \"target\": 0}, {\"source\": 106, \"target\": 0}, {\"source\": 107, \"target\": 0}, {\"source\": 108, \"target\": 0}, {\"source\": 109, \"target\": 0}]}'"
-     },
-     "execution_count": 6,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
-    "json.dumps(result, ensure_ascii=False)"
+    "result"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "id": "841e41aa-edcf-4b6a-b946-e4696b9e5ddc",
    "metadata": {},
    "outputs": [],
-- 
GitLab