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:42] – Horsccht | pruefungen:bachelor:aud:loesungws16 [02.08.2019 07:32] (aktuell) – Aufgabe 4 angepasst dom | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | <note warning> | ||
- | |||
- | </ | ||
- | |||
===== Forendiskussionen ===== | ===== Forendiskussionen ===== | ||
Zeile 27: | Zeile 23: | ||
** a) ** | ** a) ** | ||
- | TODO | + | Bucket 1: 27 - 75 |
+ | |||
+ | Bucket 3: 44 - 4 - 0 | ||
+ | |||
+ | Bucket 5: 13 - 65 - 33 | ||
+ | |||
+ | Bucket 7: 46 - 26 | ||
** b) ** Es werden nur die ungeraden Buckets befüllt, da 2 und 8 nicht teilerfremd sind. | ** b) ** Es werden nur die ungeraden Buckets befüllt, da 2 und 8 nicht teilerfremd sind. | ||
- | ** c) ** TODO | + | ** c) ** |
+ | |||
+ | Bucket 0: 12 S | ||
+ | |||
+ | Bucket 1: 33 D | ||
+ | |||
+ | Bucket 2: 66 S | ||
+ | |||
+ | 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 | + | ==== Aufgabe |
** a) ** | ** a) ** | ||
<code java> | <code java> | ||
void radixSort (LinkedList< | void radixSort (LinkedList< | ||
- | LinkedList< | + | //prepare sufficient buckets bs with empty lists: |
+ | LinkedList< | ||
for (int i = 0; i < bs.length; i++) { | for (int i = 0; i < bs.length; i++) { | ||
- | bs[i] = new LinkedList(); | + | bs[i] = new LinkedList<>(); |
} | } | ||
+ | //for each segment of the Integer radix... | ||
for (int i = 0; i < 10; i++) { | for (int i = 0; i < 10; i++) { | ||
+ | // | ||
for (Integer x: list) { | for (Integer x: list) { | ||
- | int b = (x/ | + | int b = (int) (x/ |
bs[b].addLast(x); | bs[b].addLast(x); | ||
} | } | ||
+ | // | ||
list.clear(); | list.clear(); | ||
- | for (int i = 0; i < bs.length; | + | for (int j = 0; j < bs.length; |
- | list.addAll(bs[i]); | + | list.addAll(bs[j]); |
- | bs[i].clear(); | + | bs[j].clear(); |
} | } | ||
} | } | ||
Zeile 57: | Zeile 84: | ||
<code java> | <code java> | ||
... | ... | ||
- | int b = ((x/ | + | int b = ((int) (x/ |
... | ... | ||
+ | </ | ||
+ | |||
+ | oder einfacher: | ||
+ | <code java> | ||
+ | ... | ||
+ | bs[b + 9].addLast(x); | ||
</ | </ | ||
==== Aufgabe 4 Dynamische Programmierung ==== | ==== Aufgabe 4 Dynamische Programmierung ==== | ||
Zeile 67: | Zeile 100: | ||
return 1; | return 1; | ||
} | } | ||
- | int sum = 0; | + | long sum = 0; |
- | for (int i = 0; i < n; i++){ | + | for (int i = 0; i < n; i++) { |
- | sum = sum + countNaive(i) * countNaive(n-1-i); | + | sum += countNaive(i) * countNaive(n-1-i); |
} | } | ||
return sum; | return sum; | ||
} | } | ||
+ | </ | ||
+ | |||
+ | **b)** | ||
+ | < | ||
long countDP (int n) { | long countDP (int n) { | ||
- | long[] mem = new long[]; | + | long[] mem = new long[n + 1]; |
mem[0] = 1; | mem[0] = 1; | ||
- | mem[1] = 1; | + | |
+ | | ||
return countDPH(mem, | return countDPH(mem, | ||
- | ... | + | } |
+ | |||
+ | private long countDPH (long[] mem, int n) { | ||
+ | // Lookup | ||
+ | if (mem[n] != 0) { | ||
+ | return mem[n]; | ||
+ | } else { | ||
+ | long sum = 0; | ||
+ | for (int i = 0; i < n; i++) { | ||
+ | sum += countDPH(mem, | ||
+ | } | ||
+ | // Memoization | ||
+ | mem[n] = sum; | ||
+ | return sum; | ||
+ | } | ||
} | } | ||
</ | </ | ||
- | ==== Aufgabe 5 Sortieren==== | ||
- | **a)** | ||
- | ^L * ^A1 ^B1 ^F ^A2 ^B2| | + | oder schöner: |
- | |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 7 Graphen ==== | ||
<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()); | + | |
- | } | + | |
} | } | ||
</ | </ |