===== Forendiskussionen ===== * [[https://fsi.cs.fau.de/forum/thread/14556-Klausur-WS15-Loesungsdiskusion|https://fsi.cs.fau.de/forum/thread/14556-Klausur-WS15-Loesungsdiskusion]] * [[https://fsi.cs.fau.de/forum/thread/14621-eine-Denkfehler-Ws2015-A4-Halde|Diskussion zur Aufgabe 4]] ===== Lösungsversuch ===== ==== Aufgabe 1 Wissensfragen ==== ** a) ** 1 und 3 ** b) ** 2 und 3 ** c) ** 2 || Ziemlich sicher, dass auch 1 richtig ist. * zu 1) (2. Meinung: "(stimmt hier nicht auch 1?)") => wenn man bei der linearen Suche ("< oder "=") überprüft, müsste man sicherstellen, dass die zu durchsuchende Zahlenreihe immer aufsteigend sortiert ist. Mit einer allgemeinen Methode zur linearen Suche würden die Suchen mit Sicherheit für alle anderen Fälle daneben gehen. * zu 2) Lineare Suche überprüft im intervall [0:n] ob das i-te-Element == gesuchte Element ist, wenn das gesuchte Element das erste Element ist, dann ist man sofort fertig. Die binäre Suche braucht dazu mindestends noch ein schritt. * zu 3) unsicher, ob das hier eine Rolle spielt ( 2.Meinung: "Denke ich nicht") * zu 4) scheidet aus, weil 2 richtig ist ** d) ** 3 ** e) ** 1 und 4 * Man spricht nur bei "ungerichteten" Graphen von "Grad", bei gerichteten unterscheidet man Eingangs- und Ausgangsgrad. Wenn ein Knoten ein Grad 0 hat, dann gibt es keine Kante auf ihn. Der Graph ist also bereits ab einem Knoten mit Grad 0 nicht mehr zusammenhängend. Vorausgesetzt der Graph besteht aus mehr als einem Knoten. Da nichts anderes Korrekt scheint, muss dass also so passen. * Ein stark zusammenhängender Graph hat zyklen, womit der Graph kein DAG mehr sein kann ** f) ** 2 und 4 * "löst das Rucksackproblem für n Elemente mit O(n^2) zusätzlichem Speicher.": Unsicher, ob man mit dem Algorithmus das Problem lösen kann oder wie die Lösung aussieht. ** g) ** 2 (achtung, falsch: Folgendes beachten) * unsicher * Ich denke 4 müsste stimmen * Bei 2 bin ich mir auch unsicher, da das eigentlich die Definition des Theta-Kalküls ist (auch ein Landau-Symbol), in den Folien aber steht, dass man mit dem O-Kalkül meistens das meint. * Meiner Meinung nach: 3 und 4 sind richtig! Da 1 die definition von gross Omega und 2 von gross Theta ist, wobei die 3 und 4 mit den Rechenregeln des O Kalkuels, bzw 3 bei genauerem Nachdenken ueber den Logarithmus richtig sein muessen. T(n) = T(0.666 * n) = T(c * n) = T(n) + w mit c als Konstante > 1 ist. ==== Aufgabe 2 Streuspeicherung ==== ** a) ** Liste * 0 E * 1 A * 2 * 3 B -> C -> D * 4 * 5 * 6 ** b) ** (P)-> entspricht dem Pfeil mit P und (S) dem Pfeil mit S * A 1 * B 3 * C 3 (P)-> 4 * D 3 (P)-> 4 (S)-> 0 * E 0 (S)-> 1 (P)-> 4 (S)-> 2 ==== Aufgabe 3 Binäre Suche ==== [[pruefungen:bachelor:aud:loesungws15:codezuaufgabe3|>>code zum selber testen<<]] int suche(T[] ts, T t, Comparator c1, Comparator c2){ int a=0, m, z=ts.length -1; //Anfang, Mitte, Ende while(z >= a){ m= (a+z)/2; if(c1.compare(t, ts[m]) < 0){ z=m-1; }else if(c1.compare(t, ts[m]) == 0){ if(c2.compare(t, ts[m]) < 0){ z=m-1; }else if(c2.compare(t, ts[m]) == 0){ return m; }else{ a=m+1; } }else { a=m+1; } } return -1; } ==== Aufgabe 4 Halden ==== [[https://www.cs.usfca.edu/~galles/visualization/Heap.html|>>>Tool zum selber Testen<<<]] **a) **Min Heap * 0 * 2 3 * 7 6 5 4 * 8 9 10 11 12 **b) **=> Min-Halde ^2|^6|^3|^7|^10|^5|^4|^8|^9|^12|^11| **c) **=> Min-Halde ^0|^2|^1|^7|^6|^3|^4|^8|^9|^10|^11|^12|^5| ==== Aufgabe 5 Sortieren==== **a)** ^L * ^A1 ^B1 ^F ^A2 ^B2| |A1|L*|B1|F |A2|B2| |A1|B1|L*|F |A2|B2| |A1|B1|F |L*|A2|B2| |A1|A2|B1|F |L*|B2| |A1|A2|B1|B2|F |L*| **b)** [[pruefungen:bachelor:aud:loesungws16:codezuaufgabe5|>>code zum selber testen<<]] void sortierenDurchEinfuegen(String[] a) { String tmp; for (int n = 1; n < a.length; n++) { tmp = a[n]; // entnommenes Element merken int i = n - 1; while (i >= 0 && tmp.compareTo(a[i]) < 0) { a[i + 1] = a[i]; i--; } a[i + 1] = tmp; // entnommenes Element // einsetzen } } ==== Aufgabe 6 Dynamische Programmierung ==== **a)** * kaskadenartige **b)** [[https://fsi.cs.fau.de/forum/thread/13920-Summenzeichen-in-Rekursion|Quelle]] long a(int n) { if (n <= 1) { // Basisfall: return 1; } else { // Rekursion: long an = a(n-1); for(int i = 1; i < n; i++){ an+= a(i)*a(n-i); } return an; } } **c)** [[pruefungen:bachelor:aud:loesungws15:codezuaufgabe6|>>>code zum selber testen<<<]] long aDP(int n){ if(mem == null || n >= mem.length){ // Bemerkung: n > mem.length reicht, da mem mit n+1 initialisiert wird long[] oldMem=mem; mem=new long[n+1]; if(oldMem != null){ for(int i=0; i < oldMem.length;i++) mem[i]=oldMem[i]; } } if(n <= 1){ mem[n]=1; }else if(mem[n] == 0){ mem[n]=aDP(n-1); for(int i=1; i ==== Aufgabe 7 Graphen ==== **a)** void sammle(boolean[][] am, int k, Set verb, Set bes) { if (!bes.contains(k)) { verb.add(k); bes.add(k); for (int i = 0; i < am[k].length; i++) { if (am[k][i]) { sammle(am, i, verb, bes); } } for (int i = 0; i < am.length; i++) { if (am[i][k]) { sammle(am, i, verb, bes); } } } } **b)** List> mszt(boolean[][] am) { // Ergebnisliste: List> ergebnis = new LinkedList<>(); // Menge besuchter Knoten: Set bk = new HashSet<>(); // Ermittle alle Teilgraphen mittels Hilfsmethode sammle: for (int k = 0; k < am.length; k++) { if (!bk.contains(k)) { // falls k noch nicht besucht => sammle mit k verbundene Knoten Set verb = new HashSet(); sammle(am, k, verb, bk); ergebnis.add(verb); //einfacher waere hier statt den letzten drei zeilen folgendes: //sammle(am, k, ergebnis.get(k), bk); } } return ergebnis; } **c)** void itg(boolean[][] am, Set vs) { for (int i = 0; i < am.length; i++) { for (int j = 0; j < am.length; j++) { if (am[i][j]) { if (!vs.contains(i) || !vs.contains(j)) { // es muss sowohl x als auch y in vs enthalten sein am[i][j] = false; // der Graph ist gerichtet, daher reicht die Betrachtung an einer Stelle } } } } } // alte Loesung: void itg(boolean[][] am, Set vs) { for (int i = 0; i < am.length; i++) { for (int j = 0; j < am.length; j++) { if (am[i][j]) { if (!(vs.contains(i) && vs.contains(j))) { am[i][j] = false; am[j][i] = false; } } } } } Code zum selber testen: public static void main(String[] args){ //Beispielaufruf mit aus 3 Subgraphen bestehendem Graph GraphWS15 g = new GraphWS15(); boolean[][] am = {{false, true, false, true, false, false}, {false, false, false, true, false, false}, {false, false, false, false, true, false}, {false, true, false, false, false, false}, {false, false, false, false, false, false}, {false, false, false, false, false, false}}; //Set verb = new HashSet(); List> n = g.mszt(am); System.out.println(n.size()); System.out.println(n.get(0).size()); System.out.println(n.get(1).size()); System.out.println(n.get(2).size()); } } ==== Aufgabe 8 ADT ==== TODO ** a) ** * collect(Node(g, n)) = add(collect(g), n) * collect(Edge(g, a, b)) = add(add(collect(g), a), b) ** b) ** * path(Node(g, n), x, y) = path(g, x, y) * path(Edge(g, a, b), x, y) = true falls (path(g, x, a) ^ path(g, b, y)) v (path(g, y, a) ^ path(g, b, x)) ; path(g, x, y) sonst ** c) ** * isRoot(Edge(g, a, b), x) = isRoot(g,x) falls x!=b false sonst