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:loesungss15 [16.07.2016 17:09] – 6b korrigiert dank tomabrafix Marcel[Inf] | pruefungen:bachelor:pfp:loesungss15 [02.08.2019 08:30] (aktuell) – Destranix | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Aufgabe 1 ====== | ====== Aufgabe 1 ====== | ||
* a) Sequentieller Umstieg, Beschränkung der Parallelität. | * a) Sequentieller Umstieg, Beschränkung der Parallelität. | ||
- | * b) Das Schalten einer Transition erfolgt atomar. | + | * b) Das Schalten einer Transition erfolgt atomar. |
* c) Die parallale Effizienz ist 2. Der Speedup ist 16. | * c) Die parallale Effizienz ist 2. Der Speedup ist 16. | ||
Zeile 29: | Zeile 29: | ||
== Block 5 == | == Block 5 == | ||
- | if (barrier.await() == 0) { // alternativ auch if (id == 0) | + | if (barrier.await() == 0) { // alternativ auch barrier.await() und dann if (id == 0) |
swap(); | swap(); | ||
} | } | ||
Zeile 35: | Zeile 35: | ||
| | ||
== Block 6 == | == Block 6 == | ||
- | barrier.await(); // Eigentlich unnötig bei Nutzung eines ExecutorServices, oder? | + | |
+ | // Falls in 1 new CyclicBarrier(nThreads + 1) und im Mainthread in 3 mittels | ||
====== Aufgabe 3====== | ====== Aufgabe 3====== | ||
* a) {{: | * a) {{: | ||
- | * b) Ein Pfeil von Q zu t1 (Gewicht 1) und ein Pfeil von t2 zu Q (Gewicht 2). | + | * b) Ein Pfeil von Q zu t1 (Gewicht 1) und ein Pfeil von t2 zu Q (Gewicht 2). Desweiteren muss noch verhindert werden, dass t3 schalten und somit unendlich viele Marken generieren kann. Dazu ist z.B. eine Kante von Q zu t3 mit dem Gewicht 3 nötig. |
====== Aufgabe 4====== | ====== Aufgabe 4====== | ||
* a) | * a) | ||
- | * Zeile 27: Ja, weil AtomicInteger intern synchronisiert ist. | + | * Zeile 27: Nein, weil AtomicInteger |
- | * Zeile 34: Ja, weil jeder Thread nur die lokale Variable modifiziert | + | * Zeile 34: Ja, weil jeder Thread nur die lokale Variable modifiziert und synchronized(this) eh sinnlos ist. |
- | * Zeile 38: Nein, globalHits ist allen Threads gemein | + | * Zeile 38: Nein, globalHits ist allen Threads gemein |
* b) | * b) | ||
- | * 14/46: Nein, weil i in #47 zur Berechnung benötigt wird. | + | * 14/46: Nein, weil i in #47 zur Berechnung benötigt wird. D.h. man benötigt sowohl Datensichtbarkeit (wäre mit volatile auch möglich) als auch zeitliche Synchronisation (nur dank barrier.await() hier möglich). |
- | * 19/49: Ja, da v eine volatile Referenz ist und Spin (= aktives Warten) existent. | + | * 19/49: Ja, da v eine volatile Referenz ist und Spin (= aktives Warten) existent. |
- | * 22/ | + | * 22/ |
+ | * 22/52: Begründung unter Annahme, dass 19/49 bereits gestrichen wurde: Nein, denn in Thread 3 könnte | ||
====== | ====== | ||
- | Ist aktuell eine Bonusaufgabe, | + | < |
+ | def aliveNeighbors: | ||
+ | f => cell => f(cell).count(_.alive) | ||
+ | def tick: Field => Field = field => field.map(cell => aliveNeighbors(neighbors(field))(cell) match { | ||
+ | case n i f(n < 2 || n > 3) => Cell(cell.x, | ||
+ | case 3 => Cell(cell.x, | ||
+ | case default => cell | ||
+ | }) | ||
+ | |||
+ | def game: Field => Stream[Field] = f => f #:: game(tick(f)) | ||
+ | </ | ||
====== Aufgabe 6 ====== | ====== Aufgabe 6 ====== | ||
* a) | * a) | ||
- | + | < | |
- | def first: List[Solution] => Solution = sols => | + | def first: List[Solution] => Solution = sols => |
- | sols.foldLeft(List[Transition]())((acc, | + | // alternativ sols.foldLeft(Nil: |
- | case Nil => cur | + | |
- | case default => acc | + | case Nil => cur |
- | }) | + | case default => acc |
+ | }) | ||
+ | </ | ||
* b) Das Kopfelement ist immer das aktuell zu bearbeitende Element. Der Rest der Liste entspricht den bereits besuchten Zuständen. | * b) Das Kopfelement ist immer das aktuell zu bearbeitende Element. Der Rest der Liste entspricht den bereits besuchten Zuständen. | ||
- | | + | < |
- | case (s::ss, sol) if ss.contains(s) => Nil | + | case (s::ss, sol) if s == end => sol |
- | // Unsicher! Bitte Kommentare/ | + | case (s::ss, sol) if ss.contains(s) => Nil |
- | | + | case (s::ss, sol) => { |
- | val next = passage(s) | + | val next = passage(s) |
- | first(next.map({ | + | first(next.map({ |
- | case (nextState, nextTransition) => helper(nextState:: | + | case (nextState, nextTransition) => helper(nextState:: |
- | })) | + | })) |
- | } | + | } |
+ | </ |