📘 CodingMarble Learn

Entwurfstechniken für Algorithmen

Um einen Algorithmus zu entwerfen, legst du zuerst das Problem fest: die Eingabedaten, die erwartete Ausgabe und alle Bedingungen. Danach schreibst du klare, endliche Schritte in normaler Sprache, als Liste, als Pseudocode oder als Flussdiagramm. Große Probleme zerlegt man von oben nach unten in kleinere Teile (schrittweise Verfeinerung) oder baut sie von unten nach oben aus kleinen, getesteten Bausteinen auf. Klassische Techniken: Brute Force (alles ausprobieren), Teile und Herrsche (teilen, lösen, zusammensetzen; Halbieren wie bei der binären Suche und beim Mergesort), Greedy (immer die momentan beste Wahl nehmen; schnell, aber nicht immer optimal), dynamische Programmierung (jedes kleine Teilproblem nur einmal lösen und in einer Tabelle speichern) und Backtracking (eine Wahl probieren, an einer Sackgasse zurücknehmen). Wähle die Technik und die Datenstrukturen (Arrays, Stapel, Binärbäume), indem du Korrektheit und Effizienz (Zeitkomplexität) prüfst.

🎬 Geschichte Schritt für Schritt

  1. Zuerst das Problem festlegen. Eingabe: 8 Zahlen. Ausgabe: die größte. Schritte: Schau in jede Box und merke dir die bisher größte.
  2. Teile und Herrsche: Um eine Zahl von 1 bis 16 zu finden, fragst du nach der Mitte und wirfst eine Hälfte weg. Nur 4 Fragen.
  3. Greedy: Nimm immer die größte Münze, die passt. Das ist schnell, aber für 6 mit den Münzen 1, 3, 4 ergibt es 3 Münzen, nicht die besten 2.
  4. Dynamische Programmierung: Löse zuerst kleine Beträge und speichere jede Antwort in einer Tabelle. Die Tabelle findet 6 = 3 + 3.
  5. Backtracking: Geh einen Weg entlang; an einer Sackgasse gehst du zur letzten Wahl zurück und probierst einen anderen Weg, bis du den Ausgang erreichst.
  6. Du bist dran: Wähle einen Betrag und Münzen. Rate: Gibt Greedy die wenigsten Münzen? Vergleiche mit DP.

Tipp: Zieh die 3D-Szene, um sie zu drehen. Mit zwei Fingern zoomst du.

🤔 Häufige Zweifel, geklärt

Warum Eingabe und Ausgabe vor dem Programmieren aufschreiben?

Wenn du nicht genau weißt, was hineingeht und herauskommen muss, kannst du nicht prüfen, ob die Schritte stimmen.

Wie können 4 Fragen für 16 Zahlen reichen?

Jede Antwort wirft eine Hälfte weg: 16, 8, 4, 2, 1. Die grauen Boxen zeigen die entfernte Hälfte.

Wenn Greedy falsch sein kann, warum nutzt man es?

Es ist sehr schnell und einfach, und für viele Probleme (normale Münzen, am frühesten endende Aktivitäten) ist es nachweislich korrekt.

Wie unterscheidet sich DP vom bloßen Ausprobieren von allem?

DP löst jeden kleinen Betrag einmal und verwendet ihn wieder, sodass die Tabelle Schritt für Schritt wächst, statt jede Kombination zu durchsuchen.

Fängt Backtracking wieder ganz von vorn an?

Nein. Es geht nur bis zur letzten Kreuzung mit einem noch nicht probierten Weg zurück und macht dort weiter.

Woher weiß ich, ob Greedy für meine Münzen funktioniert?

Vergleiche es für viele Beträge mit DP. Probiere im freien Spiel die Münzen 1, 7, 10.

Ein Problem festlegen: Eingabe, Ausgabe und Schritte

Bevor du Code schreibst, beschreibe das Problem genau. Das nennt man die Spezifikation.

Die Schritte aufschreiben

Ein Algorithmus ist eine endliche Liste klarer Schritte, die jede gültige Eingabe in die richtige Ausgabe verwandelt. Du kannst ihn so aufschreiben:

Teste ihn von Hand mit kleinen Eingaben, auch mit kniffligen (alle gleich, negative Zahlen, nur eine Zahl).

Top-down- und Bottom-up-Entwurf

Top-down (schrittweise Verfeinerung): Du startest mit der ganzen Aufgabe, teilst sie in ein paar große Schritte und teilst jeden Schritt weiter, bis jeder Teil leicht zu programmieren ist. Beispiel: "Zeugnis erstellen" → Noten einlesen → Durchschnitte berechnen → Noten vergeben → ausdrucken.

Bottom-up: Du baust und testest zuerst kleine, wiederverwendbare Bausteine (eine Funktion für das Maximum, eine zum Sortieren) und fügst sie dann zum ganzen Programm zusammen.

Echte Projekte mischen beides: von oben planen, von unten bauen und testen.

Teile und Herrsche und das Halbierungsverfahren

Teile und Herrsche hat drei Züge: Das Problem in kleinere Teile derselben Art teilen, jeden Teil lösen (oft per Rekursion) und die Antworten zusammensetzen.

Greedy-Algorithmen

Ein Greedy-Algorithmus (gieriger Algorithmus) trifft die Wahl, die gerade am besten aussieht, und ändert sie nie mehr.

Aber Greedy ist nicht immer richtig: Mit den Münzen 1, 3, 4 ergibt 6 nach Greedy 4 + 1 + 1 (3 Münzen), während 3 + 3 nur 2 braucht. Um einer Greedy-Methode zu trauen, musst du sie beweisen oder mit einer sicheren Methode vergleichen.

Dynamische Programmierung und Backtracking

Dynamische Programmierung (DP)

Wenn sich dieselben kleineren Probleme wiederholen, löse jedes nur einmal und speichere die Antwort in einer Tabelle. Wenigste Münzen für den Betrag a: best[a] = 1 + min(best[a - c]) über alle Münzen c ≤ a, beginnend mit best[0] = 0. Für die Münzen 1, 3, 4: best = 0, 1, 2, 1, 1, 2, 2. Die Tabelle von klein nach groß zu füllen ist bottom-up; Rekursion mit Gedächtnis ist top-down (Memoisierung). Mehr dazu in der eigenen Lektion über dynamische Programmierung.

Backtracking

Baue eine Lösung Wahl für Wahl auf. Verletzt eine Wahl eine Regel oder führt in eine Sackgasse, nimm sie zurück und probiere die nächste Möglichkeit. Das nutzt man bei Labyrinthen, Sudoku, dem N-Damen-Problem und beim Auflisten aller Teilmengen. Es ist ein vorsichtiges Brute Force: Es überspringt ganze Äste, die nicht funktionieren können.

Brute Force

Jede mögliche Antwort ausprobieren. Immer richtig, aber oft viel zu langsam (2ⁿ Teilmengen, n! Reihenfolgen).

Eine Technik wählen: Korrektheit, Effizienz und Datenstrukturen

TechnikEinsatz, wennBeispielTypische Zeit
Brute Forcedie Eingabe winzig istalle 3-stelligen Passwörter probierenoft 2ⁿ oder n!
Teile und Herrschedie Teile unabhängig sindbinäre Suche, MergesortO(log n), O(n log n)
Greedyeine beste lokale Wahl nachweislich sicher istAktivitätenauswahl, WechselgeldO(n log n)
Dynamische Programmierungsich Teilprobleme wiederholenMünzwechsel, kürzeste WegeGröße der Tabelle
Backtrackingman mit Regeln suchtLabyrinth, Sudokuexponentiell, aber beschnitten

Begründe die Wahl

Korrektheit: Zeige, dass der Algorithmus immer anhält und die richtige Ausgabe liefert (eine Schleifeninvariante, ein Beweis oder Tests mit Grenzfällen). Effizienz: Zähle die Schritte, wenn n wächst (Groß-O), und vergleiche mit anderen Methoden.

Datenstrukturen helfen

Arrays für Tabellen (DP), Stapel für Backtracking (merken, wohin man zurückgeht), Warteschlangen für die Suche Ebene für Ebene. Ein Binärbaum speichert Elemente so, dass jeder Knoten höchstens zwei Kinder hat; in einem binären Suchbaum gehen kleinere Schlüssel nach links und größere nach rechts, sodass die Suche auf jeder Ebene die Arbeit halbiert, genau wie die binäre Suche.

Probier es aus: Münzen und ein Ratespiel

  1. Spiele das Ratespiel 1 bis 100 mit einem Freund. Frage immer nach der Mitte. Gewinnst du immer in 7 Fragen? (2⁷ = 128.)
  2. Schreibe mit den Münzen 1, 3, 4 die DP-Tabelle für die Beträge 0 bis 10 auf Papier. Wo scheitert Greedy?
  3. Öffne den letzten 3D-Schritt. Probiere die Münzen 1, 7, 10 und den Betrag 14. Greedy ergibt 10 + 1 + 1 + 1 + 1; DP ergibt 7 + 7.
  4. Schreibe eine Schrittliste für "finde die kleinste Zahl in einer Liste" und teste sie mit 5, 5, 5 und mit nur einer Zahl.

Wichtige Formeln und Definitionen

Gelöste Beispiele

1. Schreibe eine Spezifikation und eine Schrittliste, um die größte von n Zahlen zu finden.

Eingabe: n ≥ 1 Zahlen. Ausgabe: die größte. Schritte: 1. beste ← erste Zahl. 2. Für jede andere Zahl x: wenn x > beste, beste ← x. 3. Gib beste aus. Für 4, 9, 2, 7, 12, 5, 10, 3 ist die Ausgabe 12 nach 7 Vergleichen.

2. Wie viele Fragen braucht das Halbieren, um eine Zahl von 1 bis 1000 zu finden?

Jede Frage halbiert den Bereich: 1000 → 500 → 250 → 125 → 63 → 32 → 16 → 8 → 4 → 2 → 1. Das sind 10 Fragen (2¹⁰ = 1024 ≥ 1000).

3. Zahle 87 nach Greedy mit den Münzen 50, 20, 10, 5, 2, 1.

50 (37 übrig), 20 (17), 10 (7), 5 (2), 2 (0): 50 + 20 + 10 + 5 + 2 = 5 Münzen.

4. Fülle die DP-Tabelle für die Münzen 1, 3, 4 bis zum Betrag 7.

best[0]=0, [1]=1, [2]=2, [3]=1, [4]=1, [5]=min(best4, best2, best1)+1=2, [6]=min(best5, best3, best2)+1=2, [7]=min(best6, best4, best3)+1=2 (3 + 4).

5. Aktivitäten (Start-Ende): A 9-11, B 10-12, C 11-13, D 12-14, E 13-15. Wähle die meisten Aktivitäten, die sich nicht überschneiden.

Greedy nach frühestem Ende: A (endet 11), dann C (startet 11, endet 13), dann E (startet 13). 3 Aktivitäten: A, C, E.

6. Plane top-down: ein Programm, das einer Klasse den Durchschnitt der Noten und den besten Schüler nennt.

Ebene 1: Daten einlesen → berechnen → ausgeben. Ebene 2: Namen und Noten in Listen einlesen; Summe und Durchschnitt berechnen; die beste Note und ihren Namen finden; beides ausgeben. Jedes Stück wird dann bottom-up programmiert und getestet.

Häufige Fehler

Übungsquiz

1. Eine Problemspezifikation muss angeben:
2. Binäre Suche in 16 sortierten Elementen braucht höchstens etwa:
3. Welche Technik nimmt immer die momentan beste Wahl?
4. Dynamische Programmierung funktioniert gut, wenn:
5. Bei der Suche im Labyrinth ist das Zurückgehen zur letzten Kreuzung nach einer Sackgasse:

Üben: Beantworte diese selbst

Tippe oder wähle deine Antwort und drücke dann Prüfen. Nutze einen Tipp, wenn du nicht weiterkommst; die ganze Lösung erscheint nach deiner Antwort.

Häufig gestellte Fragen

Was sind die wichtigsten Entwurfstechniken für Algorithmen?

Brute Force, Teile und Herrsche, Greedy, dynamische Programmierung und Backtracking, ausgewählt nachdem Eingabe und Ausgabe festgelegt sind.

Was ist der Unterschied zwischen Greedy und dynamischer Programmierung?

Greedy trifft in jedem Schritt eine einzige, gut aussehende Wahl und schaut nie zurück. DP betrachtet für kleine Teilprobleme alle Möglichkeiten und speichert die besten Antworten, findet also das echte Optimum, wenn sich Teilprobleme überlappen.

Was ist der Unterschied zwischen Top-down- und Bottom-up-Entwurf?

Top-down teilt die ganze Aufgabe in kleinere Schritte; Bottom-up baut und testet zuerst kleine Teile und fügt sie zusammen. Die meisten Programme nutzen beides.

Wo das unterrichtet wird

PolandSzkoła podstawowa, klasa VIIUnderstanding, analysing and solving problems
PolandSzkoła podstawowa, klasa VIIIUnderstanding, analysing and solving problems
PolandLiceum ogólnokształcące, klasa IUnderstanding, analysing and solving problems
China高三Electives (选修)

Vorher lernen

Als Nächstes lernen

Passende Lektionen

Alle Computer Science-Lektionen