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.

Link zu der Vergleichsansicht

Beide Seiten, vorherige ÜberarbeitungVorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
Letzte ÜberarbeitungBeide Seiten, nächste Überarbeitung
pruefungen:bachelor:aud:loesungws16 [07.02.2018 14:50] Horscchtpruefungen:bachelor:aud:loesungws16 [22.05.2019 12:32] SpeedyGonzalez
Zeile 22: Zeile 22:
 ==== Aufgabe 2 Streupeicherung ==== ==== Aufgabe 2 Streupeicherung ====
 ** a) ** ** a) **
 +
 Bucket 1: 27 - 75 Bucket 1: 27 - 75
 +
 Bucket 3: 44 - 4 - 0 Bucket 3: 44 - 4 - 0
 +
 Bucket 5: 13 - 65 - 33 Bucket 5: 13 - 65 - 33
 +
 Bucket 7: 46 - 26 Bucket 7: 46 - 26
  
Zeile 31: Zeile 35:
  
 ** c) **  ** c) ** 
 +
 Bucket 0: 12 S Bucket 0: 12 S
 +
 Bucket 1: 33 D Bucket 1: 33 D
 +
 Bucket 2: 66 S Bucket 2: 66 S
 +
 Bucket 3: 28 P Bucket 3: 28 P
 +
 Bucket 4: 14 D Bucket 4: 14 D
 +
 Bucket 5: 6 S Bucket 5: 6 S
 +
 Bucket 6: 18 D Bucket 6: 18 D
 +
 Bucket 7: 5 D Bucket 7: 5 D
 +
 Bucket 8: 15 P Bucket 8: 15 P
 +
 Bucket 9: 9 D Bucket 9: 9 D
  
-==== Aufgabe RadixSort ====+==== Aufgabe RadixSort ====
 ** a) ** ** a) **
 <code java> <code java>
 void radixSort (LinkedList<Integer> list) { void radixSort (LinkedList<Integer> list) {
- LinkedList<Integer>[] bs = new LinkedList[];+        //prepare sufficient buckets bs with empty lists: 
 + LinkedList<Integer>[] bs = new LinkedList[10];
  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++) {
 +                //...distribute values into buckets:
  for (Integer x: list) {  for (Integer x: list) {
- int b = (x/Math.pow(10,i)) % 10;+ int b = (int) (x/Math.pow(10,i)) % 10;
  bs[b].addLast(x);  bs[b].addLast(x);
  }  }
 +                //...recollect values from buckets:
  list.clear();  list.clear();
- for (int = 0; < bs.length; i++) { + for (int = 0; < bs.length; j++) { 
- list.addAll(bs[i]); + list.addAll(bs[j]); 
- bs[i].clear();+ bs[j].clear();
  }  }
  }  }
Zeile 66: Zeile 84:
 <code java> <code java>
 ... ...
-int b = ((x/Math.pow(10,i)) % 10) + 9;+int b = ((int) (x/Math.pow(10,i)) % 10) + 9;
 ... ...
 +</code>
 +
 +oder einfacher:
 +<code java>
 +...
 +bs[b + 9].addLast(x);
 </code> </code>
 ==== Aufgabe 4 Dynamische Programmierung ==== ==== Aufgabe 4 Dynamische Programmierung ====
Zeile 76: Zeile 100:
  return 1;  return 1;
  }  }
- int sum = 0;+ int sum = 0; //sum muesste eigentlich ein long sein
  for (int i = 0; i < n; i++){  for (int i = 0; i < n; i++){
  sum = sum + countNaive(i) * countNaive(n-1-i);  sum = sum + countNaive(i) * countNaive(n-1-i);
Zeile 84: Zeile 108:
  
 long countDP (int n) { long countDP (int n) {
- long[] mem = new long[]; + long[] mem = new long[n+1]; 
- mem[0] = 1; + mem[0] = mem[1] = 1;
- mem[1] = 1;+
  return countDPH(mem, n);  return countDPH(mem, n);
 } }
Zeile 96: Zeile 119:
  int sum = 0;  int sum = 0;
  for (int i = 0; i < n; i++){  for (int i = 0; i < n; i++){
- sum = sum + countDPH(i) * countDPH(n-1-i);+ sum = sum + countDPH(mem, i) * countDPH(mem, n-1-i);
  }  }
  mem[n] = sum;  mem[n] = sum;
Zeile 106: Zeile 129:
  ...  ...
  for (int k = 2; k < n+1; k++){  for (int k = 2; k < n+1; k++){
- for (int i = 0; i < n; i++){ + for (int i = 0; i < n; i++){ //Meiner Meinung nach mus hier unbedingt!!! i < k stehen, sonst rechnet man mit unbefuellten werten (buttom up beachten!) 
- mem[k] = mem[k] + mem[i] * mem[n-1-i];+ mem[k] = mem[k] + mem[i] * mem[n-1-i]; //hier auch mem[k-1-i]!
  }  }
  }  }
  ...  ...
 +}
 +</code>
 +
 +oder schöner:
 +
 +<code java>
 +private long countDPH (long[] mem, int n) {
 + if (mem[n] != 0) {
 + return mem[n];
 + }
 + for (int i = 0; i < n; i++){
 +            mem[n] += countDPH(mem, i) * countDPH(mem, n-1-i);
 + }
 + return mem[n];
 } }
 </code> </code>
Zeile 156: Zeile 193:
  double df = schnittDurchfluss(quelleSeite, senkeSeite);  double df = schnittDurchfluss(quelleSeite, senkeSeite);
  for(Verteiler v : ssa){  for(Verteiler v : ssa){
- if(!v.equals(senke)){+ if(!v.equals(senke)){  // v.equals ist gleich zu == (Weil es von Object erbt, aber .equals nicht überschreibt) 
 + // 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);  quelleSeite.add(v);
  senkeSeite.remove(v);  senkeSeite.remove(v);
- df = Math.min(df, durchfluss(quelleSeite, senkeSeite));+ df = Math.min(df, durchfluss(quelleSeite, senkeSeite, senke)); 
 +                        //"Backtracking"
  senkeSeite.add(v);  senkeSeite.add(v);
  quelleSeite.remove(v);  quelleSeite.remove(v);