Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| lehrkraefte:blc:informatik:ffprg2-2024:josephus-problem [2024/08/07 18:52] – Ivo Blöchliger | lehrkraefte:blc:informatik:ffprg2-2024:josephus-problem [2024/08/12 13:07] (current) – [Array befüllen] Ivo Blöchliger | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Wiederholtes Abzählen ====== | ||
| + | $n$ Personen stehen im Kreis und sind von $0$ bis $n-1$ der Reihe nach durchnummeriert. | ||
| + | Die Person mit der Zahl 0 beginnt und schickt die Person, die neben ihr steht (d.h. die Person mit der Nummer 1) aus dem Kreis. | ||
| + | |||
| + | Dann wird eine Person weitergegangen (also zur Nummer 2) und diese schickt die nächste Person (also Nummer 3) aus dem Kreis. | ||
| + | |||
| + | Dieser Prozess wird so lange wiederholt, bis nur noch eine Person übrig bleibt. Welche? | ||
| + | |||
| + | Der oben beschriebene Prozess wird mit $s=2$ beschrieben (Abstand zwischen zwei eliminierten Personen). | ||
| + | |||
| + | JavaScript Hinweis: Mit der Array-Methode '' | ||
| + | |||
| + | Eingabe: | ||
| + | <code text> | ||
| + | 6 | ||
| + | 14 2 | ||
| + | 15 2 | ||
| + | 16 2 | ||
| + | 17 2 | ||
| + | 50 7 | ||
| + | 100 13 | ||
| + | </ | ||
| + | |||
| + | Ausgabe: | ||
| + | <code text> | ||
| + | Case #0: 12 | ||
| + | Case #1: 14 | ||
| + | Case #2: 0 | ||
| + | Case #3: 2 | ||
| + | Case #4: 45 | ||
| + | Case #5: 58 | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== Fall $s=2$ ===== | ||
| + | Generieren Sie den Text für den Input für alle $n$ von 0 bis 130 für $s=2$. | ||
| + | Berechnen Sie die Lösungen. Finden Sie eine Gesetzmässigkeit? | ||
| + | |||
| + | |||
| + | ===== Nützliches JavaScript ===== | ||
| + | ==== Array befüllen ==== | ||
| + | === Klassisch === | ||
| + | <code javascript> | ||
| + | let n = 42; | ||
| + | arr = []; // leeres Array | ||
| + | for (let i=0; i<n; i++) { | ||
| + | arr.push(i); | ||
| + | } | ||
| + | </ | ||
| + | === Mit Arrayfunktionen fill und map === | ||
| + | <code javascript> | ||
| + | let n = 42; | ||
| + | arr = new Array(n).fill(null).map((element, | ||
| + | </ | ||
| + | |||
| + | ==== length und splice ==== | ||
| + | <code javascript> | ||
| + | arr = [1, | ||
| + | console.log(arr.length); | ||
| + | arr.splice(4, | ||
| + | console.log(arr); | ||
| + | </ | ||
| + | |||
| + | ===== Mögliche Lösungsansätze ===== | ||
| + | ==== Array mit Einträgen von 0 bis n-1 ==== | ||
| + | Dank '' | ||
| + | |||
| + | Aber jedesmal ein neues Array «zu bauen» ist speicher- und rechenintensiv. Langsam für grosse Arrays (Aufwand proportional zur Grösse vom Array). | ||
| + | ==== Array mit true / false ==== | ||
| + | Array-Länge bleibt fix, zuerst alle Einträge '' | ||
| + | |||
| + | Nachteil: Sind schon viele Personen eliminiert, muss das Array lange nach dem/den nächsten Einträgen durchsucht werden. | ||
| + | |||
| + | ==== Effizienter für kleine s ==== | ||
| + | Doppelt verkettete Liste. | ||
| + | |||
| + | Idee: für jede Person Vorgänger und Nachfolger speichern. Beim Eliminieren updaten. | ||
| + | |||
| + | Implementation: | ||
| + | ==== Noch viel effizienter ==== | ||
| + | Formel zur direkten Berechnung heraustüfteln und anwenden. | ||
| + | |||
| + | |||
| + | |||