Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Prüfungen im Bachelor-Studium (1. - 5. Semester) » pfp » Aufgabe 1 (Übersicht)
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige ÜberarbeitungVorherige ÜberarbeitungNächste Überarbeitung | Vorherige Überarbeitung | ||
pruefungen:bachelor:pfp:loesungws15 [16.07.2016 16:31] – Aufgaben 1, 4, 5 eingefügt Marcel[Inf] | pruefungen:bachelor:pfp:loesungws15 [19.07.2018 15:50] (aktuell) – evren | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Aufgabe 1 ====== | ====== Aufgabe 1 ====== | ||
+ | * a) 1 und 4 | ||
- | * a) volatile, synchronized. (static ? Aber keine Sichtbarkeitsgarantie im ' | + | * b) 2 und 4 |
- | * b) p(n) ist der parallele Anteil. B_p ist der Speedup. | + | Da nur nach gefragt |
- | | + | |
- | | + | |
- | ====== Aufgabe 4 ====== | + | * c) 2 und 3 (siehe Seite 26 VL Folie: https:// |
- | == Block 1 == | + | |
- | new CyclicBarrier(threads + 1); | + | ====== |
- | + | ||
- | == Block 2 == | + | |
- | | + | <code=java> |
- | int end = start + step; // exclusive upper bound | + | |
- | if (i == threads - 1) { | + | * b) |
- | | + | <code=java> |
- | } | + | boolean manageThreads(String linkUrl) { |
- | Thread thread | + | |
- | | + | |
+ | t.start(); | ||
} | } | ||
+ | else { | ||
+ | curThreads.decrementAndGet(); | ||
+ | return false; | ||
+ | } | ||
+ | } // END OF manageThreads | ||
+ | </ | ||
- | == Block 3 == | + | * c) |
- | | + | <code=java> |
- | | + | public void run() { |
- | } | + | |
+ | | ||
+ | } | ||
+ | </ | ||
- | == Block 4 == | + | * d) |
- | // oben | + | <code=java> |
- | | + | synchronized(visitedUrls) { |
+ | if(!visitedUrls.contains(linkUrl)){ | ||
+ | doVisit | ||
+ | visitedUrls.add(linkUrl); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ====== Aufgabe 3 ====== | ||
+ | {{: | ||
+ | |||
+ | Nicht gefragt, hier aber erwähnt: | ||
+ | |||
+ | Beschränktheit: | ||
+ | |||
+ | Lebendigkeit: | ||
+ | |||
+ | ====== Aufgabe | ||
+ | | ||
+ | Nein ist nicht möglich, s wird bereits mit anderen Werten belegt, bevor das Programm parallel ausgeführt wird. Die Sichtbarkeit der in Zeile 25 festgelegten Werte ist gewährleistet (genauer [nicht VL-Stoff]: Es existiert im Allgemeinen eine Happens-Before Ordnung zwischen Code vor start() und dem Thread-Code.) | ||
+ | |||
+ | * b) 2 | ||
+ | Nein, " | ||
+ | |||
+ | * c) 4 | ||
+ | | ||
| | ||
- | // unten | + | Was bringt hier, dass s als volatile deklariert ist? volatile wirkt sich nur auf die Referenz selbst aus, diese wird aber nie geändert, könnte also genauso gut finaln sein. |
- | barrier.await(); | + | |
====== Aufgabe 5 ====== | ====== Aufgabe 5 ====== | ||
* a) | * a) | ||
+ | < | ||
+ | def insert: (List[Int], Int) => List[Int] = (ls, v) => ls match { | ||
+ | case Nil => List(v) | ||
+ | case x::xs => { | ||
+ | if (v <= x) { | ||
+ | v :: x :: xs | ||
+ | } | ||
+ | else { | ||
+ | x :: insert(xs, v) | ||
+ | } | ||
+ | }</ | ||
+ | |||
+ | Alternativ: | ||
+ | < | ||
+ | def insert: (List[Int], Int) => List[Int] = (ls, v) => { | ||
+ | val p = ls.partition(_ <= v) | ||
+ | p._1 ::: v :: p._2 | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Alternativ: | ||
+ | < | ||
+ | def insert: (List[Int], Int) => List[Int] = (ls, v) => | ||
+ | (for (l <- ls if l <= v) yield l) ::: (v :: (for (l <- ls if l > v) yield l)) | ||
+ | </ | ||
- | def flatten: List[(Char, Char)] => List[Char] = input => | ||
- | input.map(tuple => List(tuple._1, | ||
- | | ||
* b) | * b) | ||
- | | + | < |
- | cs.par.map(c => (c, cs.par.filter(_ == c).size)).toList | + | def sort: List[Int] => List[Int] = ls => |
- | + | ls.foldRight(List[Int]())((v, | |
+ | // Alternativ zu " | ||
+ | // Nil: List[Int] | ||
+ | // Aber unbedingt mit Typangabe, sonst schlägt Scala' | ||
+ | </ | ||
* c) | * c) | ||
- | | + | < |
- | xs.foldLeft(List[(Char, | + | def sortAllWith: (List[Int] => List[Int]) => List[List[Int]] => List[List[Int]] = |
+ | sortFun => ls => for (cur <- ls) yield sortFun(cur) | ||
+ | </ | ||
+ | |||
+ | Falls man nicht unbedingt eine Listenabstraktion hätte verwenden müssen: | ||
+ | <code=scala> | ||
+ | def sortAllWith: | ||
+ | list.map(x => function(x)) | ||
+ | } | ||
+ | </ | ||
====== Aufgabe 6 ====== | ====== Aufgabe 6 ====== | ||
+ | |||
* a) | * a) | ||
- | | + | < |
- | | + | def testInside: (Ellipse, Ellipse) => (Double, Double) => Boolean |
- | case (c, count) => Stream.Empty | + | (e1, e2) => (x, y) => isInside(e1, x, y) && isInside(e2, x, y) |
- | } | + | </code> |
* b) | * b) | ||
- | | + | < |
- | case Stream.Empty => Stream.Empty | + | def tupleStream: Stream[Double] => Stream[(Double, Double)] = s => |
- | case ts => { | + | (s.head, s.tail.head) #:: tupleStream(s.tail.tail) |
- | | + | |
- | } | + | // alternativ |
- | } | + | (s(0), s(1)) #:: tupleStream(s.drop(2)) |
+ | </ | ||
+ | |||
+ | * c) | ||
+ | |||
+ | <code=scala> | ||
+ | def monteCarlo: (Ellipse, Ellipse) => Int => Int = (e1, e2) => count => { | ||
+ | |||
+ | // Stream aus Punkten | ||
+ | val pointStream = tupleStream(randomStream) | ||
+ | |||
+ | pointStream.take(count).par.filter(p => testInside(e1, | ||
+ | // .count wirft einen komischen Fehler von Scalas Type Inference System | ||
+ | | ||
+ | } | ||
+ | </ | ||