Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Prüfungen im Bachelor-Studium (1. - 5. Semester) » pfp » Aufgabe 1 (Wissensfragen)   (Ü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
pruefungen:bachelor:pfp:loesungws12 [16.07.2014 11:41] lemurpruefungen:bachelor:pfp:loesungws12 [01.08.2017 19:45] (aktuell) ab21ajus
Zeile 1: Zeile 1:
 ==== Aufgabe 1 (Wissensfragen) ==== ==== Aufgabe 1 (Wissensfragen) ====
   a) falsch   a) falsch
-  b) richtig (z.B. durch Prüfe-Handle-Situationen)+  b) richtig (z. B. durch Prüfe-Handle-Situationen)
   c) falsch   c) falsch
   d) falsch   d) falsch
Zeile 12: Zeile 12:
  
   S:    S: 
-  (1, 1, 0, 0, 0) (Traversiert)+  (1, 1, 0, 0, 0) (Transponiert)
      
   M:    M: 
Zeile 28: Zeile 28:
 d) E: (0, 7, 0, 0)  d) E: (0, 7, 0, 0) 
  
-====Aufgabe (Scala Snake-Sort) ====+====Aufgabe (Java Präfixsumme) ==== 
 +a) Gauß-Filter / Weichzeichner (? -> eher Zeigerverdopplung) 
 +<code java> 
 +import java.util.concurrent.*;
  
-sortAscsortDes waren nicht Teil der Aufgabe, sind aber zum Testen implementiert.+public class ParallelPrefixSums { 
 + private static CyclicBarrier barrier; 
 + public static void calculateSums(int[] values) throws InterruptedException { 
 + barrier = new CyclicBarrier(values.length); 
 + Thread[] workers = new Thread[values.length]; 
 + for (int i = 0; i < values.length; i++) { 
 + workers[i] = new Thread(new Worker(valuesi)); 
 + workers[i].start(); 
 +
 + for (int i = 0; i < values.length; i++) { 
 + workers[i].join(); 
 +
 + }
  
 + public static class Worker implements Runnable {
 + private int[] values;
 + private int index;
 + public Worker (int[] values, int index) {
 + this.values = values;
 + this.index = index;
 + }
 + public void run() {
 + try {
 + int distance = 1;
 + while (distance < values.length) {
 + barrier.await();
 + int target = index + distance;
 + int rem = values[index];
 + barrier.await();
 + if (target < values.length) {
 + values[target] += rem;
 + }
 + dist *= 2;
 + }
 + } catch (Exception e) {
 + e.printStackTrace();
 + }
 + }
 + }
 +}
 +</code>
  
-  import System.{ currentTimeMillis => ct }+==== Aufgabe 4 (Schreibtischlauf - Barrieren) ====
  
-  type Row = List[Int] +  * a) a = 1, weil sowohl a++ als auch die System.out.println-Ausgabe in einem synchronized-Block stehen und beide Threads auf dieselbe Marke synchronisieren. 
-  type Matrix = List[Row]+  * b) Mögliche Ausgaben sind: 
 + 
 +<code> 
 +a=1 
 +a=2 
 +a=3 
 +Threads 1, 2, 3 started. 
 +</code> 
 + 
 +Und 
 + 
 +<code> 
 +a=1 
 +a=2 
 +Threads 1, 2, 3 started. 
 +a=3 
 +</code> 
 + 
 +Der Main-Thread synchronisiert nicht auf irgendeine Marke (insb. nicht auf BarrierTest.class), daher erscheinen ihm die synchronized-Blöcke der Threads nicht als unteilbare Einheit und er kann bereits nach a++, aber vor System.out.println die While-Schleife verlassen. 
 + 
 +  * c) 1, 2, 3, oder 4 Mal. Jeder Thread könnte gleichzeitig b=0 am Anfang feststellen oder erst prüfen, nachdem die anderen Threads (oder ein Teil davon) das IF verlassen. 
 +  * d) Vorletzte oder letzte Zeile. Der CountDownLatch ist nur mit 3 initialisiert worden. Daher kann sich der letzte Thread irgendwo zwischen barrier.await() und latch.countDown() befinden. 
 + 
 + 
 +==== Aufgabe 5 (Scala - Snake-Sort) ==== 
 + 
 +sortAsc, sortDes waren nicht Teil der Aufgabe, sind aber zum Testen implementiert. 
 + 
 +<code=Scala> 
 +import System.{ currentTimeMillis => ct } 
 + 
 +type Row = List[Int] 
 +type Matrix = List[Row]
      
-  def sortAsc: Row => Row = rs => if(rs == Nil) Nil else rs.min :: sortAsc(rs.filter(_ > rs.min)) +def sortAsc: Row => Row = rs => if(rs == Nil) Nil else rs.min :: sortAsc(rs.filter(_ > rs.min)) 
-  def sortDes: Row => Row = rs => if(rs == Nil) Nil else rs.max :: sortDes(rs.filter(_ < rs.max))+def sortDes: Row => Row = rs => if(rs == Nil) Nil else rs.max :: sortDes(rs.filter(_ < rs.max))
      
  
-  def sortCols: Matrix => Matrix = m => +def sortCols: Matrix => Matrix = m => 
-    (for(col <- m.transpose) yield sortAsc(col)).toList.transpose+  (for(col <- m.transpose) yield sortAsc(col)).toList.transpose
          
-  def sortColsPar: Matrix => Matrix = m => +def sortColsPar: Matrix => Matrix = m => (for(col<m.transpose.par) yield sortAsc(col)).toList.transpose 
-  sortCols(m).par.toList  //wahrscheinlich falsch+   
 +// Alternativ (laut #Scala ist die Paralleliät bei beiden äquivalent gegeben): 
 +     
 +def sortColsPar2: Matrix => Matrix = m => m.transpose.par.map(sortAsc(_)).toList.transpose
     
-   def sortRows: Matrix => Matrix = m =>{ +def sortRows: Matrix => Matrix = m =>{ 
-     def helper: (Matrix, Int) => Matrix = { +  def helper: (Matrix, Int) => Matrix = { 
-       case (Nil, n) => Nil +    case (Nil, n) => Nil 
-       case (m::ms, n) if(n % 2 == 0) => sortAsc(m)::helper(ms,n+1) +    case (m::ms, n) if(n % 2 == 0) => sortAsc(m)::helper(ms,n+1) 
-       case (m::ms, n) if(n % 2 != 0) => sortDes(m)::helper(ms,n+1) +    case (m::ms, n) if(n % 2 != 0) => sortDes(m)::helper(ms,n+1) 
-     +  
-     helper(m,0) +  helper(m,0) 
-   +
-    + 
-   def sortHelper: (Int, Matrix) => Stream[(Matrix,Matrix)] = {  +//Alternative ohne Helfer-Funktion: 
-     case (n,m) =>  if (n%2==0) (m, sortRows(m)) #::sortHelper(n+1,sortRows(m)) else (m,sortCols(m)) #::sortHelper(n+1,sortCols(m))      +  def sortRows2: Matrix => Matrix = m => m match { 
-   }+    case Nil => Nil 
 +    case (row::m)  => if (m.length % 2 == 0) 
 +                          sortAsc(row)::sortRows2(m) 
 +                     else  
 +                          sortDes(row)::sortRows2(m) 
 +  } 
 + 
 + 
 +def sortHelper: (Int, Matrix) => Stream[(Matrix,Matrix)] = {  
 +  case (n,m) =>  if (n%2==0) (m, sortRows(m)) #::sortHelper(n+1,sortRows(m)) else (m,sortCols(m)) #::sortHelper(n+1,sortCols(m))      
 +}
      
-   def snakeSort: Matrix => Matrix = m => { +def snakeSort: Matrix => Matrix = m => { 
-    def helper: (Matrix, Int) => Matrix =+  def helper: (Matrix, Int) => Matrix = (m,n) => { 
-    (m,n) => { +      val a = sortHelper(0,m)(n) 
-    val a = sortHelper(0,m)(n) +      if(a._1 == a._2) a._2 else helper(m,n+1)     
-        if(a._1 == a._2) a._2 else helper(m,n+1)     +  
-     +  helper(m,0) 
-    } +} 
-     +</code> 
-    + 
-    +==== Aufgabe 6 ==== 
-   helper(m,0) +Nicht mehr Teil des Vorlesungsstoffes.
-   }+