Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Prüfungen im Bachelor-Studium (1. - 5. Semester) » aud » Forendiskussionen (Übersicht)
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige ÜberarbeitungVorherige ÜberarbeitungNächste Überarbeitung | Vorherige Überarbeitung | ||
pruefungen:bachelor:aud:loesungws16 [07.02.2018 10:19] – Horsccht | pruefungen:bachelor:aud:loesungws16 [02.08.2019 07:32] (aktuell) – Aufgabe 4 angepasst dom | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | <note warning> | ||
- | |||
- | </ | ||
- | |||
===== Forendiskussionen ===== | ===== Forendiskussionen ===== | ||
Zeile 8: | Zeile 4: | ||
==== Aufgabe 1 Wissensfragen ==== | ==== Aufgabe 1 Wissensfragen ==== | ||
- | ** a) ** 1 und 3 | + | ** a) ** 1 und 4 |
- | ** b) ** 2 und 3 | + | ** b) ** 1 und 2 |
- | ** c) ** 2 | + | ** c) ** 2 und 4 |
- | | + | |
+ | ** d) ** 1 und 3 | ||
- | ** d) ** 3 | + | ** e) ** 2 und 3 |
- | ** e) ** 1 und 4 | + | ** f) ** 1 und 3 |
- | * Man spricht nur bei " | + | |
- | * 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.": | + | |
- | ** g) ** 2 | + | ** g) ** 2 und 3 |
- | * unsicher | + | |
- | ==== Aufgabe 5 Sortieren==== | + | |
- | **a)** | + | |
- | ^L * ^A1 ^B1 ^F ^A2 ^B2| | + | ** h) ** 3 und 4 |
- | |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)** | + | ==== Aufgabe 2 Streupeicherung ==== |
- | <code java> | + | ** a) ** |
- | import static org.junit.Assert.*; | + | |
- | import java.util.*; | + | |
+ | Bucket 1: 27 - 75 | ||
- | public class Insertionsort< | + | Bucket 3: 44 - 4 - 0 |
- | + | ||
- | + | Bucket 5: 13 - 65 - 33 | |
- | public static <E extends Comparable< | + | |
- | E temp; | + | Bucket 7: 46 - 26 |
- | + | ||
- | for (int n = 1; n < a.length; n++) { | + | |
- | + | ** b) ** Es werden nur die ungeraden Buckets befüllt, da 2 und 8 nicht teilerfremd sind. | |
- | temp = a[n]; // entnommenes Element merken | + | |
- | int i = n - 1; | + | ** c) ** |
- | + | ||
- | while (i >= 0 && temp.compareTo(a[i]) < 0) { | + | Bucket 0: 12 S |
- | a[i + 1] = a[i]; | + | |
- | i--; | + | Bucket |
- | } | + | |
- | a[i + 1] = temp; // entnommenes Element | + | Bucket 2: 66 S |
- | // einsetzen | + | |
- | } | + | Bucket 3: 28 P |
+ | |||
+ | Bucket 4: 14 D | ||
+ | |||
+ | Bucket 5: 6 S | ||
+ | |||
+ | Bucket 6: 18 D | ||
+ | |||
+ | Bucket 7: 5 D | ||
+ | |||
+ | Bucket 8: 15 P | ||
+ | |||
+ | Bucket 9: 9 D | ||
+ | |||
+ | ==== Aufgabe 3 RadixSort ==== | ||
+ | ** a) ** | ||
+ | <code java> | ||
+ | void radixSort (LinkedList< | ||
+ | // | ||
+ | LinkedList< | ||
+ | for (int i = 0; i < bs.length; i++) { | ||
+ | bs[i] = new LinkedList<> | ||
} | } | ||
- | + | //for each segment of the Integer radix... | |
- | private static String toString(Element[] x){ | + | for (int i = 0; i < 10; i++) { |
- | String res="" | + | // |
- | for(Element e:x){ | + | for (Integer x: list) { |
- | res=res+e.toString(); | + | int b = (int) (x/ |
+ | bs[b].addLast(x); | ||
+ | } | ||
+ | // | ||
+ | list.clear(); | ||
+ | for (int j = 0; j < bs.length; j++) { | ||
+ | list.addAll(bs[j]); | ||
+ | bs[j].clear(); | ||
} | } | ||
- | return res; | ||
} | } | ||
- | + | } | |
- | public static void main(String[] args) { | + | </ |
- | Element[] nonuniqueElements2 = { | + | ** b) ** |
- | new Element(1, " | + | <code java> |
- | new Element(2, " | + | ... |
- | new Element(4, " | + | int b = ((int) (x/Math.pow(10,i)) % 10) + 9; |
- | new Element(2, " | + | ... |
- | new Element(1, " | + | </ |
- | new Element(2, " | + | |
- | new Element(1, " | + | oder einfacher: |
- | new Element(2, " | + | <code java> |
- | new Element(3, " | + | ... |
- | new Element(2, " | + | bs[b + 9].addLast(x); |
- | new Element(2, " | + | </ |
- | }; | + | ==== Aufgabe 4 Dynamische Programmierung ==== |
- | + | **a)** | |
- | String nonunique2_ElementsExpect=" | + | <code java> |
- | + | long countNaive(int n) { | |
- | Element[] test=nonuniqueElements2.clone(); | + | if (n == 0 || n == 1) { |
- | System.out.println(" | + | return 1; |
- | Insertionsort.sort(test); | + | |
- | String x=toString(test); | + | |
- | + | ||
- | System.out.println(" | + | |
- | assertEquals(nonunique2_ElementsExpect, | + | |
} | } | ||
+ | long sum = 0; | ||
+ | for (int i = 0; i < n; i++) { | ||
+ | sum += countNaive(i) * countNaive(n-1-i); | ||
+ | } | ||
+ | return sum; | ||
} | } | ||
+ | </ | ||
+ | **b)** | ||
- | class Element implements Comparable<Element> { | + | <code=java> |
- | int key; | + | long countDP (int n) { |
- | String value; | + | long[] mem = new long[n + 1]; |
+ | mem[0] = 1; | ||
+ | mem[1] = 1; | ||
+ | |||
+ | return countDPH(mem, | ||
+ | } | ||
- | Element(int key, String value) { | + | private long countDPH |
- | this.key | + | // Lookup |
- | this.value = value; | + | if (mem[n] != 0) { |
- | } | + | return mem[n]; |
- | + | } else { | |
- | @Override | + | long sum = 0; |
- | public int compareTo(Element o) { | + | for (int i = 0; i < n; i++) { |
- | if (key < o.key) { | + | sum += countDPH(mem, |
- | return | + | |
- | } else if (key > o.key) { | + | |
- | return 1; | + | |
} | } | ||
- | return 0; | + | // Memoization |
- | } | + | mem[n] = sum; |
- | + | return | |
- | @Override | + | |
- | public String toString() { | + | |
- | if(value instanceof String){ | + | |
- | return (String) value; | + | |
- | } | + | |
- | + | ||
- | return | + | |
} | } | ||
} | } | ||
</ | </ | ||
- | ==== Aufgabe 7 Graphen ==== | + | |
+ | oder schöner: | ||
<code java> | <code java> | ||
- | public class GraphWS15 | + | private long countDPH (long[] mem, int n) { |
+ | // Lookup | ||
+ | if (mem[n] != 0) { | ||
+ | return mem[n]; | ||
+ | } | ||
+ | for (int i = 0; i < n; i++) { | ||
+ | // Berechnung + Memoization | ||
+ | mem[n] += countDPH(mem, | ||
+ | } | ||
+ | return mem[n]; | ||
+ | } | ||
+ | </ | ||
- | void sammle(boolean[][] am, int k, Set< | + | **c)** |
- | if (!bes.contains(k)) { | + | |
- | verb.add(k); | + | |
- | bes.add(k); | + | |
- | for (int i = 0; i < am[k].length; | + | |
- | if (am[k][i]){ | + | |
- | sammle(am, | + | |
- | } | + | |
- | } | + | |
- | for (int i = 0; i < am.length; i++) { | + | < |
- | if (am[i][k]){ | + | long countIter (int n) { |
- | sammle(am, | + | ... |
- | } | + | for (int k = 2; k < n+1; k++) { // for-Schleife fuer bottom-up |
- | } | + | for (int i = 0; i < k; i++) { |
+ | mem[k] = mem[k] + mem[i] * mem[k-1-i]; | ||
} | } | ||
} | } | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
- | List< | ||
- | // Ergebnisliste: | ||
- | List< | ||
- | // Menge besuchter Knoten: | ||
- | Set< | ||
- | // 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< | ||
- | sammle(am, | ||
- | ergebnis.add(verb); | ||
- | } | ||
- | |||
- | } | ||
- | return ergebnis; | + | ==== Aufgabe 5 Graphen ==== |
- | } | + | ** a) ** |
+ | Ergebnis: A 14, E 18, H4 6, H7 3, M 2, W 0 | ||
- | void itg(boolean[][] am, Set<Integer> vs) { | + | ** b) ** siehe Tafeluebungsfolien |
- | for (int i=0;i<am.length;i++){ | + | |
- | for (int j=0;j< | + | ** c) ** M - H7, M - W, M - H4, A - E, A - H4 oder A - W |
- | if (am[i][j]){ | + | |
- | if (vs.contains(i) && vs.contains(j)){ | + | ** d) ** |
- | // ok | + | nein: bei 4 Knoten ungerader Grad |
- | } | + | nein: nicht mal ein Eulerweg |
- | else | + | |
- | am[i][j] = false; | + | ==== Aufgabe 6 Rekursion ==== |
- | } | + | <code java> |
- | } | + | class MaxFlowMinCut { |
- | } | + | |
- | + | | |
+ | ev.add(v); | ||
+ | | ||
+ | this.erreichbareVerteiler(r.a, | ||
+ | this.erreichbareVerteiler(r.e, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | double schnittDurchfluss(List< | ||
+ | | ||
+ | for(Verteiler v : quelleSeite){ | ||
+ | for(Rohr r : v.rohre){ | ||
+ | if(senkeSeite.contains(r.a) || senkeSeite.contains(r.e)){ | ||
+ | sum += r.df; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | return sum; | ||
+ | } | ||
+ | |||
+ | |||
+ | double durchfluss(List< | ||
+ | Verteiler[] ssa = senkeSeite.toArray(new Verteiler[senkeSeite.size()]); | ||
+ | double df = schnittDurchfluss(quelleSeite, | ||
+ | for(Verteiler v : ssa){ | ||
+ | if(!v.equals(senke)){ | ||
+ | // Hier kann man noch checken, ob zu v auch eine Kante aus quelleSeite existiert, aber nicht notwendig, da der Cut nur länger weden würde -> nur geringere Laufzeit | ||
+ | quelleSeite.add(v); | ||
+ | senkeSeite.remove(v); | ||
+ | df = Math.min(df, | ||
+ | //" | ||
+ | senkeSeite.add(v); | ||
+ | quelleSeite.remove(v); | ||
} | } | ||
} | } | ||
- | + | return df; | |
- | public static void main(String[] args){ | + | |
- | // | + | |
- | GraphWS15 g = new GraphWS15(); | + | |
- | boolean[][] am = {{false, true, false, true, false, false}, | + | |
- | | + | |
- | | + | |
- | {false, true, false, false, false, false}, | + | |
- | {false, false, false, false, false, false}, | + | |
- | {false, false, false, false, false, false}}; | + | |
- | // | + | |
- | List< | + | |
- | 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()); | + | |
- | } | + | |
} | } | ||
</ | </ |