Aufgabe 1 — Allgemeine Fragen a) Beschreiben Sie, was man unter einer Datenstruktur versteht. Ihre Lösung: Eine Datenstruktur ist eine bestimmte Art, Daten zu verwalten und miteinander zu verknüpfen, um in geeigneter Weise auf diese zugreifen und diese manipulieren zu können. Datenstrukturen sind immer mit bestimmten Operationen verknüpft, um genau diesen Zugriff und diese Manipulation zu ermöglichen. b) Beschreiben Sie, was man unter einem Algorithmus versteht. Ihre Lösung: Ein Algorithmus ist eine präzise (in einer festgelegten Sprache abgefasste) endliche Beschreibung eines allgemeinen Verfahrens unter Verwendung ausführbarer elementarer (Verarbeitungs-)Schritte. c) Gegeben seien zwei Funktionen f : N → N und g : N → N. Beschreiben Sie, was f ∈ O(g) bedeutet. Ihre Lösung: Mathematische Definition: f ∈ O(g) ⇔ ∃c, n0 ∀n ≥ n0 : f (n) ≤ c + g(n) f wächst asymptotisch nicht schneller als g. DSA - 1/23 Aufgabe 2 — Suchalgorithmen Gegeben sei folgendes Struktogramm: Funktion zur Suche in einem Feld Funktionsname: suche Parameter: feld: Array aus Objekten vom Typ int; element : int Rückgabe: Position in feld, an der element gefunden wurde, -1 sonst feld = null ja nein pos := 0; solange pos < feld.length feld[pos] = element ja return pos nein pos := pos + 1 return -1 a) Geben Sie eine statische Java-Methode suche an, die zu dem gegebenen Struktogramm äquivalent ist. Ihre Lösung: 1 public static int suche(int[] feld , int element) { 2 if ( feld == null) { 3 } else { 4 int pos = 0; 5 while (pos < feld.length) { 6 if ( feld [pos] == element) { 7 return pos; 8 } else { 9 pos++; 10 } 11 } 12 } 13 return −1; 14 } DSA - 2/23 b) Wie wird der oben beschriebene Suchalgorithmus genannt? Ihre Lösung: Lineare Suche oder sequentielle Suche c) Was ist die best-case- und die worst-case-Laufzeit des Algorithmus? Geben Sie jeweils ein Szenario an, wann diese Fälle eintreten. Ihre Lösung: best-case: O(1), wenn feld(0) == element worst-case: O(n), wenn element nicht in feld enthalten ist d) Ein anderes, wesentlich effizienteres Verfahren zur Suche in einem Feld ist die sogenannte binäre Suche. Beschreiben Sie, wie diese funktioniert. Ihre Lösung: 1. Ist das übergebene Feld leer, so ist das gesuchte Element nicht enthalten 2. Prüfe, ob Element in der Mitte des Feldes mit dem gesuchten Element übereinstimmt 3. Stimmt es nicht überein, teile das Feld in zwei Teile 4. Ist das gesuchte Element größer, so rufe den Algorithmus rekursiv mit dem rechten Teilfeld auf 5. Ist das gesuchte Element kleiner, so rufe den Algorithmus rekursiv mit dem rechten Teilfeld auf e) Welche Voraussetzungen müssen erfüllt sein, damit man die binäre Suche anwenden kann? Ihre Lösung: • Das Feld muss sortiert sein • Auf das Feld muss wahlfrei zugegriffen werden können DSA - 3/23 Aufgabe 3 — Listen Gegeben sei folgendes Java-Interface für einen Stack: 1 public interface Stack<T> { 2 public void push(T obj) throws Exception; 3 public T pop() throws Exception; 4 public T top() throws Exception; 5 public boolean isEmpty(); 6 } a) Beschreiben Sie, wie die Methoden push, pop und top arbeiten. Ihre Lösung: push: legt obj als neues oberstes Element auf dem Stack ab pop: nimmt das oberste Element vom Stack ab und gibt es als Rückgabewert zurück top: liefert das oberste Element zurück, belässt es aber auf dem Stack b) Im Zusammenhang mit Stacks spricht man häufig auch von LIFO. Beschreiben Sie, was LIFO bedeutet. Ihre Lösung: LIFO = Last In First Out; das Element, das zuletzt dem Stack hinzugefügt wurde wird als erstes entnommen. c) Eine andere Datenstruktur, die in der Vorlesung behandelt wurde arbeitet nach dem FIFO-Prinzip. Welche ist das? Ihre Lösung: Die Queue oder Warteschlange d) Viele verkettete Datenstrukturen implementieren die Iterable-Schnittstelle. Welche Methoden werden darin definiert und was ist ein Iterator in Java? Ihre Lösung: Die Iterable-Schnittstelle definiert lediglich die Methode iterator(), die einen Iterator für die gegebene Datenstruktur zurückliefert. Ein Iterator ist ein abstrakter Zeiger auf die Elemente der Datenstruktur. Er bietet die öffentlichen Methoden hasNext() (zur Überprüfung, ob er auf dem letzten Element der Datenstruktur steht), next() (zur Übergabe des aktuellen Objekts und zur Vorrückung des Zeigers) und remove() (zur Entfernung des zuletzt gelesenen Objekts aus der Datenstruktur) an. DSA - 4/23 Aufgabe 4 — Sortieren Gegeben sei folgendes Null-basiertes Array A: 0 9 3 1 8 7 5 4 2 6 0 1 2 3 4 5 6 7 8 9 a) Sortieren Sie das Array A mittels Bubblesort. Geben Sie die Belegung des Arrays nach jedem Durchlauf an. Ihre Lösung: 0 9 3 1 8 7 5 4 2 6 0 3 1 8 7 5 4 2 6 9 0 1 3 7 5 4 2 6 8 9 0 1 3 5 4 2 6 7 8 9 0 1 3 4 2 5 6 7 8 9 0 1 3 2 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 b) Bubblesort ist ein sogenanntes stabiles Sortierverfahren. Erklären Sie was das bedeutet. Ihre Lösung: Ein stabiles Sortierverfahren behält die Reihenfolge der Datensätze mit gleichem Sortierschlüssel bei. DSA - 5/23 c) Bubblesort wird in der Regel als in-place-Algorithmus implementiert. Erklären Sie was das bedeutet. Welche Platzkomplexität hat Bubblesort demnach? Ihre Lösung: Ein in-place-Algorithmus benötigt, zusätzlich zu dem für die Speicherung der zu bearbeitenden Daten benötigten Speicherplatz, nur eine konstante Speichermenge. Daher ist die Platzkomplexität von Bubblesort O(1). d) Was ist die best-case- und die worst-case-Laufzeit von Bubblesort? Geben Sie jeweils ein Szenario an, wann diese Fälle eintreten. Ihre Lösung: best-case: O(n), wenn das Feld bereits sortiert ist worst-case: O(n2 ), wenn das Feld absteigend sortiert ist e) Ein Sortieralgorithmus, der nach dem Divide-and-Conquer-Prinzip vorgeht ist Quicksort. Beschreiben Sie welche Rolle das sogenannte Pivot-Element dabei spielt und erklären Sie, wie dieses Element beschaffen sein sollte. Ihre Lösung: Das Pivot-Element wird zur Aufteilung (Divide) des Felds genommen. Alle Elemente, die kleiner (oder gleich) dem Pivot-Element sind werden in einem Array zusammengefasst und alle Elemente, die größer sind in einem anderen. Diese beiden Teilarrays sollten in etwa gleichgroß sein, das Pivot-Element sollte nach Möglichkeit also jeweils in der Mitte der zu sortierenden Elemente liegen. f) Was ist die best-case- und die worst-case-Laufzeit von Quicksort? Geben Sie jeweils ein Szenario an, wann diese Fälle eintreten. Ihre Lösung: best-case: O(n ∗ log(n)), wenn das Pivot-Element das Feld in zwei gleichgroße Teile teilt worst-case: O(n2 ), wenn das Pivot-Element das größte respektive kleinste Element im Feld ist DSA - 6/23 g) Aus dem unsortierten Array A soll ein Heap aufgebaut werden. Geben Sie sowohl den Baum ohne Heap-Eigenschaft an, als auch alle Zwischenschritte nach jeder Einsickerphase. Ihre Lösung: Baum ohne Heap-Eigenschaften: 0 9 3 1 4 8 2 7 5 6 „Einsickern“ von 8: 0 9 3 1 4 6 2 7 5 8 „Einsickern“ von 9: 0 1 3 2 4 6 9 8 DSA - 7/23 7 5 Aufgabe 5 — Bäume Gegeben sei der folgende geordnete Baum B1 : 20 10 15 3 8 1 7 17 19 16 a) Erzeugen Sie mittels Binarisierung aus dem gegebenen geordneten Baum B1 einen Binärbaum B2 . Ihre Lösung: 20 10 3 1 15 8 7 17 16 19 b) Erklären Sie, was man unter einem binären Suchbaum versteht. Handelt es sich bei dem Binärbaum B2 aus Aufgabenteil a) um einen Suchbaum? Ihre Lösung: In einem Suchbaum wird jedem Knoten ein Schlüssel zugeordnet. Der linke Teilbaum eines Knotens enthält nur Schlüssel, die kleiner (oder gleich) dem des Knotens sind und der rechte Teilbaum enthalten nur Schlüssel, die größer (oder gleich) dem des Knotens sind. Der Baum aus Aufgabenteil a) ist ein Suchbaum, da jeder Knoten (maximal) zwei Kinder hat und er die Suchbaumeigenschaften besitzt. DSA - 8/23 c) Geben Sie in Pseudocode ein Verfahren an, mit dem sich die in B2 enthaltenen Elemente absteigend sortiert ausgeben lassen. Die Laufzeit des Verfahrens soll in der Komplexitätsklasse O(|V |) (mit V = Knoten des Baums) liegen. Ihre Lösung: Baumsortierung: Daten : Suchbaum B2 Ergebnis : Ausgabe der Knotenwerte in absteigender Sortierung Beginn wenn B2 ist nicht leer dann rekursiver Aufruf von Baumsortierung mit rechtem Unterbaum; Ausgabe von Knotenwert der Wurzel; rekursiver Aufruf von Baumsortierung mit linkem Unterbaum; Ende Ende Die in B1 gespeicherten Werte werden nun in einem 2 − 3 − 4-Baum B3 gespeichert: 3 1 7 10 8 15 19 16 17 20 d) Fügen Sie den Wert 18 in B3 ein. Gehen Sie dabei nach dem BottomUp-Verfahren vor. Der entstehende Baum wird im Folgenden als B4 bezeichnet. Ihre Lösung: 10 3 1 16 7 8 15 19 17 18 DSA - 9/23 20 e) Wandeln Sie B4 in einen äquivalenten Rot-Schwarz-Baum B5 um. Ihre Lösung: 10 3 19 1 8 7 16 20 15 18 17 f) Wandeln Sie B5 in einen AVL-Baum B6 um. Geben Sie für jeden Knoten die AVL-Balance an. Ihre Lösung: 100 3−1 180 10 81 70 19−1 160 150 170 200 g) Erklären Sie anhand von B5 und B6 , warum AVL-Bäume „nicht ganz ausgeglichen“ sind, Rot-Schwarz-Bäume hingegen als „vollständig ausgeglichen“ bezeichnet werden. Ihre Lösung: Bei einem AVL-Baum darf sich die Tiefe der beiden Unterbäume in jedem Knoten um maximal 1 unterscheiden. Dies bedeutet aber, dass der Baum nicht vollständig ausbalanciert sein muss. Bei einem Rot-Schwarz-Baum hingegen hat jeder Weg von der Wurzel bis zu einem Blatt die exakt gleiche Anzahl an schwarzen Knoten. DSA - 10/23 Die in B6 gespeicherten Werte werden nun in einem B-Baum B7 gespeichert: 16 3 1 8 7 18 10 15 17 19 20 h) Bestimmen Sie die Ordnung m von B7 . Ihre Lösung: m=1 i) Entfernen Sie den Wert 18 aus B7 . Ihre Lösung: 16 3 1 8 7 19 10 15 DSA - 11/23 17 20 Aufgabe 6 — Graphen Durchlaufen Sie die ausgehenden Kanten eines Knotens in folgender Reihenfolge (Uhrzeigersinn): 1 4 α 2 3 a) Führen Sie auf dem folgenden Graphen G1 , beginnend beim grau hinterlegten Knoten ”K”, eine Tiefensuche (rekursive Variante) durch. Geben Sie an, in welcher Reihenfolge die Knoten besucht werden. A D F R O N Z K E U S Ihre Lösung: K-O-N -R-A-D-Z-U -S-E DSA - 12/23 Folgende Knotenliste sei für den Graphen G2 gegeben: 6, 16, 5, 2, 3, 4, 5, 6, 2, 1, 6, 2, 1, 4, 2, 1, 3, 2, 1, 6, 3, 1, 2, 5 b) Geben Sie die Kantenliste für den Graph G2 an. Ihre Lösung: 6, 16, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 2, 1, 2, 6, 3, 1, 3, 4, 4, 1, 4, 3, 5, 1, 5, 6, 6, 1, 6, 2, 6, 5 c) Geben Sie an, ob G2 gerichtet und / oder gewichtet ist. Ihre Lösung: G2 ist ungerichtet, da es paarweise zwischen zwei Knoten jeweils zwei oder keine Kante gibt. G2 ist ungewichtet, da alle Kanten ein uniformes Kostenmaß haben. d) Geben Sie eine grafische Repräsentation von G2 an. Ihre Lösung: 6 5 1 4 2 3 e) Besitzt G2 einen Eulerweg? Falls ja, geben Sie diesen an, falls nein, begründen Sie warum nicht. Ihre Lösung: G2 besitzt einen Eulerweg, da G2 genau zwei Knoten mit einer ungeraden Anzahl an ausgehenden Kanten besitzt, z.B. 1, 2 – 2, 6 – 6, 1 – 1, 3 – 3, 4 – 4, 1 – 1, 5 – 5, 6 DSA - 13/23 Folgende Adjazenzmatrix sei für den Graphen G3 gegeben (ein Kostenmaß ∞ bedeutet, dass hier keine Kante existiert): ∞ 3 ∞ ∞ ∞ 1 ∞ 3 2 ∞ 2 ∞ −2 ∞ ∞ ∞ ∞ ∞ ∞ 1 2 ∞ ∞ ∞ ∞ f) Geben Sie an, ob G3 gerichtet und / oder gewichtet ist. Ihre Lösung: G3 ist gerichtet, da es paarweise zwischen zwei Knoten nicht immer zwei oder keine Kante gibt. G3 ist gewichtet, da für jede Kanten ein Kostenmaß angegeben ist. g) Geben Sie eine grafische Repräsentation von G3 an. Ihre Lösung: 3 2 −2 3 3 1 2 2 4 1 2 1 5 h) Lässt sich der Dijkstra-Algorithmus zur Berechnung eines kürzesten Wegs durch den Graphen G3 (beginnend bei dem Knoten 1) anwenden. Falls ja, wenden Sie Dijkstra auf G3 an (geben Sie auch alle Zwischenschritte an), falls nein, begründen Sie warum nicht. Ihre Lösung: Da der Dijkstra-Algorithmus ein Greedy-Algorithmus ist, muss das Optimalitätsprinzip gelten. Dies ist bei negativen Kantengewichten allerdings nicht gegeben. Daher würde Dijkstra nicht den kürzesten Weg finden. DSA - 14/23 i) Lässt sich der Bellman-Ford-Algorithmus zur Berechnung eines kürzesten Wegs durch den Graphen G3 (beginnend bei dem Knoten 1) anwenden. Falls ja, wenden Sie Bellman-Ford auf G3 an (geben Sie auch alle Zwischenschritte an), falls nein, begründen Sie warum nicht. Ihre Lösung: ∞ 2 ∞ −2 3 2 3 3 ∞ 0 2 ∞ 0 3 1 1 2 ∞ 6 6 −2 3 2 −2 3 3 0 3 2 5 0 3 1 2 4 1 2 1 2 1 ∞ 6 6 6 −2 3 2 3 0 ∞ 1 ∞ 3 2 2 1 2 2 −2 3 −2 3 3 3 2 4 0 3 1 2 4 1 2 1 2 5 1 5 DSA - 15/23 Gegeben sei folgender ungerichteter Graph G4 : 1 1 2 3 4 2 1 5 2 3 4 2 6 3 5 j) Wenden Sie den Kruskal-Algorithmus zur Berechnung eines minimalen Spannbaum auf den Graphen G4 an. Geben Sie den entstehenden Spannbaum grafisch an und berechnen Sie sein Kantengewicht. Ihre Lösung: ((1, 2), 1) + ((3, 4), 1) + ((1, 4), 2)+ ((2, 3), 2) − ((3, 6), 2) + ((1, 3), 3)− ((3, 5), 3) + ((2, 5), 4) − ((4, 6), 5)− 1 1 2 4 2 1 6 3 2 3 Kantengewicht Kw = 1 + 2 + 1 + 3 + 2 = 9 DSA - 16/23 5 Aufgabe 7 — Hashing In dem neuen Verwaltungssystem der Universität sollen die Datensätze der Studenten in einer Hashtafel verwaltet werden. Als Hashkey soll jeweils die Matrikelnummer m (m ∈ N+ ) verwendet werden. In der initialen (leeren) Hashtafel (implementiert als Null-basiertes Array) stehen 11 Plätze zur Verfügung. Um die Hashfunktion möglichst einfach zu gestalten wird vorgeschlagen nur die letzte Stelle zu betrachten und darauf das Divisionsverfahren mit p = 11 anzuwenden. a) Bewerten Sie diese Hashfunktion unter den Gesichtspunkten Surjektivität und Gleichverteiltheit. Ist die Tabellengröße sinnvoll gewählt? Ihre Lösung: Die Hashfunktion verspricht zwar gleichverteilt zu sein (wenn man davon ausgeht, dass die Matrikelnummern gleichmäßig vergeben werden), aber es ist nicht surjektiv, da x mod 11 < 10 ∀x ∈ {0, . . . , 9}. p ist eine Primzahl, wodurch möglichst wenig Kollisionen auftreten sollten, aber da die Anzahl der Studenten voraussichtlich sehr viel größer ist als 11, wird es dennoch häufig zu Kollisionen kommen. In die obige Hashtafel sollen nun die ersten Studenten eingetragen werden: 1. Adam (m = 543) 2. Bettina (m = 123) 3. Christoph (m = 444) 4. Doris (m = 963) 5. Erich (m = 567) 6. Franziska (m = 824) b) Fügen Sie die sechs Studenten in die leere Hashtafel ein. Verwenden Sie die oben beschriebene Hashfunktion. Führen Sie ein offenes Hashing durch und verwenden Sie quadratisches Sondieren (mit c = 1) als Kollisionsstrategie. Ihre Lösung: 0 1 2 3 4 5 6 7 8 9 10 Franziska (4) Adam (3) Bettina (3) Christoph (4) Doris (3) Erich (7) DSA - 17/23 Da die Studentenzahl stetig zunimmt hat die Verwaltung entschieden, dass man besser ein dynamisches Hashverfahren verwenden sollte. Als Bitvektor soll die Matrikelnummer als Binärzahl verwendet werden. 1. Adam (v = 1000011111) 2. Bettina (v = 0001111011) 3. Christoph (v = 0110111100) 4. Doris (v = 1111000011) 5. Erich (v = 1000110111) 6. Franziska (v = 1100111000) c) Fügen Sie die sechs Studenten erneut in die leere Hashtafel ein. Verwenden Sie dynamisches Hashing. Geben Sie alle Zwischenschritte an, wenn ein Split nötig ist und geben Sie jeweils die globale und lokale Tiefe an. Ihre Lösung: Adam Bettina 𝑑𝑙 = 0 Bettina Christoph 𝑑𝑙 = 1 Adam Doris 𝑑𝑙 = 1 Bettina Christoph 𝑑𝑙 = 1 Adam Erich 𝑑𝑙 = 2 Doris Franziska 𝑑𝑙 = 2 𝑑𝑔 = 0 0 1 𝑑𝑔 = 1 00 01 10 11 𝑑𝑔 = 2 DSA - 18/23 Aufgabe 8 — Pattern Matching Gegeben sei folgendes Pattern P = abac sowie der String S = dababac. a) Wenden Sie den primitiven Brute-Force-Algorithmus zur Pattern-Suche auf P und S an. Ihre Lösung: 𝑑 𝑎 𝑏 𝑎 𝑏 𝑎 𝑎 𝑏 𝑎 𝑐 𝑎 𝑏 𝑎 𝑐 𝑎 𝑏 𝑎 𝑐 𝑎 𝑏 𝑎 𝑐 𝑐 b) Welchen worst-case-Aufwand hat der naive Brute-Force-Suchalgorithmus für ein Pattern der Länge m und einen Text der Länge n? Ihre Lösung: Der Algorithmus prüft im worst-case an jeder Stelle des Strings, ob das Pattern hier beginnt. Daher ist die worst-case-Komplexität O(m ∗ n). c) Beschreiben Sie, wie Algorithmen, wie beispielsweise Knuth-Morris-Pratt, die Textsuche beschleunigen. Ihre Lösung: Durch eine vorgelagerte Patternanalyse (∈ O(m)) kann das Pattern bei einem Missmatch im besten Fall gleich um mehrere Stellen verschoben werden. Die Zeichen des Suchstrings müssen nicht mehrfach gelesen werden. Daher ergibt sich eine Laufzeit von O(m + n). DSA - 19/23 Aufgabe 9 — Reguläre Sprachen Die reguläre Sprache L1 enthält alle Wörter w, die über einem gewöhnlichen Ternärsystem (ein Stellwertsystem zur Basis 3 mit den Ziffern 0, 1 und 2) ohne führende Nullen eine durch 9 teilbare positive Zahl z (z ∈ N+ ) darstellen. a) Geben Sie einen regulären Ausdruck RegEx1 an, der die Sprache L1 spezifiziert. Ihre Lösung: RegEx1 : ˆ(1|2)[012] ∗ 00$ b) Geben Sie einen zu RegEx1 äquivalenten ϵ-NEA EA1 an. Ihre Lösung: 𝜀 𝜀 𝑞0 𝜀 𝑞2 1 𝑞4 𝜀 𝜀 𝑞3 2 𝑞5 0 𝑞12 𝜀 𝑞8 𝜀 𝑞1 𝑞10 𝑞6 𝜀 𝑞7 𝜀 𝜀 𝜀 𝑞11 𝜀 𝑞9 1 𝑞14 𝜀 𝑞13 2 𝜀 𝜀 DSA - 20/23 𝜀 𝑞15 𝑞16 𝜀 𝑞17 0 𝑞18 0 𝑞19 𝜀 𝑞20 Gegeben sei folgender endlicher Automat EA2 : 𝑞0 0|1|2 1 𝑞2 0 𝑞3 2 0 𝑞4 𝜀 𝑞1 c) Ist EA2 deterministisch? Geben Sie alle Faktoren an, die bei einem DEA erfüllt sein müssen, und bestimmen Sie ob diese auf EA2 zutreffen. Ihre Lösung: • Ein Startzustand: EA2 hat zwei Startzustände • Keine ϵ-Kanten: EA2 hat eine ϵ-Kante • Je Zustand höchstens eine ausgehende Kante ∀σ ∈ Σ : EA2 hat in Zustand q2 zwei mit 0 beschriftete ausgehende Kanten • Je Zustand mindestens eine ausgehende Kante ∀σ ∈ Σ : EA2 hat in Zustand q3 keine mit 1 oder 2 beschriftete ausgehende Kante ⇒ Je Zustand genau eine ausgehende Kante ∀σ ∈ Σ d) Geben Sie einen zu EA2 äquivalenten DEA EA3 an. Ihre Lösung: {q0 , q1 } {q2 } {q2 , q3 } {q2 , q3 , q4 } 0 — {q0 , q1 } {q2 , q3 , q4 } {q2 , q3 , q4 } 1 {q2 } {q2 } {q2 } {q2 } 1|2 𝑞𝑠 1|2 𝑞2 0 𝑞23 0 1|2 0 1|2 𝑞𝑓 𝑞𝑒 0|1|2 0 DSA - 21/23 2 {q2 } {q2 } {q2 } {q2 } Aufgabe 10 — Petrinetze Gegeben sei das folgende Petrinetz P N1 : 𝒕𝟏 𝒔𝟏 𝒔𝟐 𝒕𝟐 𝒔𝟑 𝒔𝟒 𝒕𝟑 a) Diskutieren Sie anhand von P N1 die Begriffe „aktivierte Transition“, „tote Transition“, „lebendige Transition“, „lebendiges Petrinetze“ und „verklemmungsfreies Petrinetz“. Ihre Lösung: Eine Transition t ist aktiviert, wenn alle vorgelagerten Plätze ausreichend Marken enthalten und t schalten kann (z.B. t1 ). Eine Transition t ist tot, wenn t bei keiner erreichbaren Markierung aktiviert ist (keine tote Transition in P N1 ). Eine Transition t ist lebendig, wenn aus jeder erreichbaren Markierung in endlich vielen Schritten eine Folgemarkierung erreicht werden kann, die t aktiviert (keine lebendige Transition in P N1 ). Ein Petrinetz ist lebendig, wenn alle Transitionen bei der gegebenen Anfangsmarkierung lebendig sind (trifft nicht auf P N1 zu). Ein Petrinetz ist verklemmungsfrei, wenn für jede gültige Markierung mindestens eine Transition aktiviert ist (trifft nicht auf P N1 zu). DSA - 22/23 Aufgabe 11 — Entwurfsmuster für Algorithmen a) Beschreiben Sie, was man unter einem Greedy-Algorithmus versteht. Ihre Lösung: Greedy-Algorithmen (gierige Algorithmen) zeichnen sich dadurch aus, dass sie immer denjenigen Folgezustand auswählen, der zum Zeitpunkt der Wahl den größten Gewinn bzw. das beste Ergebnis verspricht (Optimalitätsprinzip muss gelten). b) Beschreiben Sie, was man unter einem Divide-and-Conquer-Algorithmus versteht. Ihre Lösung: Divide-and-Conquer-Algorithmen führen ein zu lösendes Problem auf ein identisches Problem mit kleinerer Eingabemenge zurück. Die Lösung wird anschließend aus den Teillösungen zusammengesetzt. c) Beschreiben Sie, was man unter einem Backtracking-Algorithmus versteht. Ihre Lösung: Backtracking-Algorithmen bauen aus Teillösungen schrittweise eine Gesamtlösung auf. Führt eine verfolgte Lösungsstrategie zu keiner Lösung, so wird der letzte Schritt (die letzten Schritte) rückgängig gemacht und es wird ein alternativer Lösungsweg gesucht. d) Beschreiben Sie, was man unter dynamischer Programmierung versteht. Ihre Lösung: Bei der dynamischen Programmierung werden kleinere Teilprobleme zuerst gelöst (und abgespeichert), um aus diesen größere Teillösungen zusammenzusetzen. e) Beschreiben Sie, was man unter evolutionären Algorithmen versteht. Ihre Lösung: Ausgehend von zufälligen Initiallösungen werden mittels Kreuzung, Mutation und dem survival of the fittest-Prinzip nach erreichen eines Schwellwerts eine Lösung präsentiert. DSA - 23/23