Aufgabenblock — AFB II
Zehn Aufgaben aus allen Unterkapiteln mit Schwerpunkt Effizienz: Programme analysieren, Suchen und Sortieren verfolgen, Operationen zählen, Laufzeiten hochrechnen und Speicher berechnen — mit gestuften Tipps, wenn du nicht weiterkommst.
Für eine quadratische Tabelle int[][] m = {{3, 1, 4}, {1, 5, 9}, {2, 6, 5}}; läuft:
int s = 0, t = 0;
for (int i = 0; i < m.length; i++) {
s = s + m[i][i];
t = t + m[i][m.length - 1 - i];
}Analysieren Sie das Programm: Welche Werte haben s und t am Ende?
m[i][i] liegt auf der Hauptdiagonale, m[i][2 − i] auf der Gegendiagonale.Vollständige Lösung
In der sortierten Reihung
wird binär nach 36 gesucht. Untersuchen Sie den Ablauf: Wie viele Vergleiche finden statt, und welche Werte haben links und rechts am Ende?
Vollständige Lösung
links > rechts: Rückgabe −1 nach 4 Vergleichen. Die Grenzen zeigen auf die Nachbarn 35 (Index 7) und 40 (Index 8), zwischen denen 36 stehen müsste.Vergleichen Sie Selectionsort und Bubblesort mit Abbruch auf einer bereits sortierten Reihung mit 12 Elementen: Wie viele Vergleiche braucht jedes Verfahren?
Vollständige Lösung
Die Reihung {6, 5, 4, 3, 2, 1} wird mit Insertionsort aufsteigend sortiert. Ermitteln Sie die Zahl der Vergleiche und der Verschiebungen.
Vollständige Lösung
for (int i = 0; i < n; i++)
for (int j = i; j < n; j++)
z++; // Fragment 1
for (int k = n; k > 1; k = k / 2)
y++; // Fragment 2Bestimmen Sie, wie oft z++ für \(n = 20\) und y++ für \(n = 100\) ausgeführt wird.
Vollständige Lösung
j = i, deshalb \(n + 1\) statt \(n - 1\) im Zähler). Fragment 2 läuft für k = 100, 50, 25, 12, 6, 3 — sechsmal, also \(\lfloor\log_2 100\rfloor = 6\).Ein Algorithmus braucht \(T(n) = 5n^2 + 3n\) Schritte. Schätzen Sie ab, um welchen Faktor (gerundet auf eine ganze Zahl) \(T\) steigt, wenn \(n\) von 1000 auf 2000 steigt. Ein anderes \(O(n^2)\)-Programm braucht für 1000 Werte 2 s — wie viele Sekunden für 5000 Werte?
Vollständige Lösung
Berechnen Sie den Nutzspeicher von new double[1000][1000] in Byte und die Anzahl der int-Werte, die in 2 GB (\(2 \cdot 10^9\) Byte) passen.
double 8 Byte, int 4 Byte.Vollständige Lösung
double-Werte belegen 8 MB. In 2 GB passen \(5 \cdot 10^8\) int-Werte — theoretisch; praktisch begrenzt Java die Länge einer Reihung auf etwas über \(2 \cdot 10^9\) Elemente, und der Speicher wird auch für anderes gebraucht.400 unsortierte Werte sollen \(k\)-mal durchsucht werden: entweder \(k\) lineare Suchen oder einmal Selectionsort und dann \(k\) binäre Suchen (jeweils ungünstigster Fall). Leiten Sie her, ab welchem kleinsten \(k\) die zweite Variante weniger Vergleiche braucht.
Vollständige Lösung
Bestätigen Sie durch Rechnung: Die lineare Suche braucht bei 99 Elementen im Mittel 50 Vergleiche, wenn der Wert vorkommt und jede Position gleich wahrscheinlich ist. Geben Sie außerdem die Zahl der Vergleiche der binären Suche im ungünstigsten Fall für \(n = 1000\) an.
Vollständige Lösung
Für {5, 1, 4, 2, 3} gilt die Behauptung: „Bubblesort braucht genau so viele Vertauschungen wie Insertionsort Verschiebungen.“ Weisen Sie das nach, indem Sie beide Anzahlen bestimmen.
