<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://staging.moocwiki.org/index.php?action=history&amp;feed=atom&amp;title=Algorithmusanalyse</id>
	<title>Algorithmusanalyse - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://staging.moocwiki.org/index.php?action=history&amp;feed=atom&amp;title=Algorithmusanalyse"/>
	<link rel="alternate" type="text/html" href="https://staging.moocwiki.org/index.php?title=Algorithmusanalyse&amp;action=history"/>
	<updated>2026-06-18T10:57:36Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in MOOCsWiki Staging</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://staging.moocwiki.org/index.php?title=Algorithmusanalyse&amp;diff=29149&amp;oldid=prev</id>
		<title>Glanz: aiMOOC über GPT aiMOOC Action erstellt</title>
		<link rel="alternate" type="text/html" href="https://staging.moocwiki.org/index.php?title=Algorithmusanalyse&amp;diff=29149&amp;oldid=prev"/>
		<updated>2026-06-17T16:16:48Z</updated>

		<summary type="html">&lt;p&gt;aiMOOC über GPT aiMOOC Action erstellt&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{T}}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Algorithmusanalyse =&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[Algorithmusanalyse]]&amp;#039;&amp;#039;&amp;#039; untersucht, wie viel [[Rechenzeit]], [[Speicherplatz]] und andere [[Ressource|Ressourcen]] ein [[Algorithmus]] benötigt, um ein Problem zu lösen. Dabei geht es nicht nur darum, ob ein Programm auf einem bestimmten Computer schnell läuft, sondern darum, wie sich sein Aufwand verändert, wenn die [[Eingabegröße]] wächst. Die zentrale Frage lautet: Wie skaliert ein Verfahren?&lt;br /&gt;
&lt;br /&gt;
In diesem aiMOOC lernst Du, wie man [[Laufzeit]] und [[Speicherkomplexität]] beschreibt, was die [[O-Notation]] bedeutet, warum der [[Worst Case]], [[Best Case]] und [[Average Case]] unterschieden werden und wie typische [[Datenstruktur|Datenstrukturen]] und [[Sortieralgorithmus|Sortieralgorithmen]] analysiert werden. Du lernst außerdem, einfache [[Pseudocode|Pseudocode]]-Beispiele selbst zu untersuchen und Aussagen über ihre [[Komplexitätsklasse]] zu begründen.&lt;br /&gt;
&lt;br /&gt;
Die Algorithmusanalyse ist wichtig für die [[Informatik]], weil viele praktische Probleme nicht allein durch schnellere Hardware gelöst werden können. Ein ungünstiger Algorithmus kann bei großen Datenmengen unbrauchbar werden, während ein gut gewählter Algorithmus dasselbe Problem effizient löst. Besonders in Bereichen wie [[Suchmaschine|Suchmaschinen]], [[Kryptographie]], [[Datenbank|Datenbanken]], [[Künstliche Intelligenz]], [[Bioinformatik]] und [[Netzwerk|Netzwerken]] entscheidet die Wahl des Algorithmus oft über die praktische Machbarkeit.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Lernziele ==&lt;br /&gt;
&lt;br /&gt;
Nach diesem aiMOOC kannst Du erklären, was [[Algorithmusanalyse]] bedeutet, einfache Laufzeitfunktionen bestimmen, die [[O-Notation]], [[Omega-Notation]] und [[Theta-Notation]] unterscheiden, typische Wachstumsklassen einordnen und einfache Programme auf Schleifen, Rekursion und Speicherbedarf untersuchen. Außerdem kannst Du begründen, warum [[lineare Suche]], [[binäre Suche]], [[Mergesort]], [[Quicksort]] oder [[Hash-Tabelle|Hash-Tabellen]] in verschiedenen Situationen unterschiedlich geeignet sind.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Medien- und OER-Lernraum ==&lt;br /&gt;
&lt;br /&gt;
Für die Vertiefung kannst Du sichere, schulgeeignete OER-Quellen und Suchräume nutzen. Binde konkrete Medien nur ein, wenn Du die Lizenz und den Dateinamen eindeutig geprüft hast.&lt;br /&gt;
&lt;br /&gt;
# [[Wikimedia Commons]]: Suche nach frei nutzbaren Diagrammen zu Wachstumsklassen und Komplexität unter [https://commons.wikimedia.org/w/index.php?search=computational+complexity&amp;amp;title=Special:MediaSearch&amp;amp;type=image Wikimedia Commons: computational complexity].&lt;br /&gt;
# [[Wikipedia]] und [[OER]]: Lies ergänzend die Artikel [https://de.wikipedia.org/wiki/Algorithmusanalyse Wikipedia: Algorithmusanalyse], [https://de.wikipedia.org/wiki/Landau-Symbole Wikipedia: Landau-Symbole] und [https://de.wikipedia.org/wiki/Komplexit%C3%A4tstheorie Wikipedia: Komplexitätstheorie].&lt;br /&gt;
# [[Lernvideo]]: Suche nach deutschsprachigen Erklärvideos über [https://www.youtube.com/results?search_query=Algorithmusanalyse+Big+O+Notation+deutsch YouTube: Algorithmusanalyse Big O Notation deutsch].&lt;br /&gt;
# [[Interaktive Visualisierung]]: Nutze Visualisierungen zu Sortieralgorithmen, z. B. über [https://visualgo.net/en/sorting VisuAlgo: Sorting], um Laufzeitverhalten praktisch zu beobachten.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Grundlagen der Algorithmusanalyse =&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Was ist ein Algorithmus? ==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;[[Algorithmus]]&amp;#039;&amp;#039;&amp;#039; ist eine eindeutige, endliche Handlungsvorschrift zur Lösung eines Problems. Er erhält eine [[Eingabe]], verarbeitet diese in einzelnen Schritten und liefert eine [[Ausgabe]]. Ein Algorithmus muss nicht zwingend in einer konkreten [[Programmiersprache]] geschrieben sein. Häufig wird er zunächst als [[Pseudocode]], [[Struktogramm]] oder [[Flussdiagramm]] dargestellt.&lt;br /&gt;
&lt;br /&gt;
Für die Algorithmusanalyse ist wichtig, welche Operationen der Algorithmus ausführt. Dazu zählen etwa Vergleiche, Zuweisungen, Rechenoperationen, Speicherzugriffe oder Funktionsaufrufe. Nicht jede einzelne Maschinenoperation wird immer exakt gezählt; meistens interessiert das asymptotische Verhalten, also der Aufwand für sehr große Eingaben.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Eingabegröße ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;[[Eingabegröße]]&amp;#039;&amp;#039;&amp;#039; wird meist mit &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; bezeichnet. Sie beschreibt, wie groß die zu verarbeitenden Daten sind. Bei einer Liste kann n die Anzahl der Elemente sein, bei einem Text die Anzahl der Zeichen, bei einem [[Graph|Graphen]] die Anzahl der [[Knoten]] und [[Kante|Kanten]].&lt;br /&gt;
&lt;br /&gt;
Die Wahl der Eingabegröße muss zum Problem passen. Bei einem Sortierverfahren ist die Anzahl der Elemente entscheidend. Bei einem Algorithmus für Graphen kann sowohl die Zahl der Knoten als auch die Zahl der Kanten wichtig sein. Deshalb werden Laufzeiten manchmal als Funktionen von mehreren Größen angegeben, etwa O(V + E) für einen Graphen mit V Knoten und E Kanten.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Ressourcen: Zeit und Speicher ==&lt;br /&gt;
&lt;br /&gt;
Die zwei wichtigsten Ressourcen sind &amp;#039;&amp;#039;&amp;#039;[[Laufzeit]]&amp;#039;&amp;#039;&amp;#039; und &amp;#039;&amp;#039;&amp;#039;[[Speicherplatz]]&amp;#039;&amp;#039;&amp;#039;. Die Laufzeitanalyse fragt, wie viele Schritte ein Algorithmus ungefähr benötigt. Die Speicheranalyse fragt, wie viel zusätzlicher Speicher gebraucht wird. Ein Algorithmus kann sehr schnell sein, aber viel Speicher benötigen. Umgekehrt kann ein speichersparender Algorithmus langsamer sein.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel ist das Sortieren: Manche Verfahren sortieren direkt im vorhandenen Array und benötigen nur wenig Zusatzspeicher. Andere Verfahren, wie [[Mergesort]], verwenden zusätzlichen Speicher, können aber eine garantierte Laufzeit von O(n log n) erreichen. Gute Algorithmusanalyse betrachtet daher immer die Anforderungen der jeweiligen Anwendung.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Maschinelles Messen und theoretisches Analysieren ==&lt;br /&gt;
&lt;br /&gt;
Man kann Algorithmen praktisch messen, indem man Programme ausführt und Zeiten stoppt. Solche [[Benchmark|Benchmarks]] sind nützlich, hängen aber von Computer, Programmiersprache, Compiler, Betriebssystem, Eingabedaten und Implementierung ab. Die theoretische Algorithmusanalyse abstrahiert von diesen Einflüssen. Sie beschreibt das Wachstum des Aufwandes in Abhängigkeit von n.&lt;br /&gt;
&lt;br /&gt;
Beide Perspektiven ergänzen sich. Theoretische Analyse erklärt, warum ein Algorithmus bei großen Datenmengen grundsätzlich besser oder schlechter skaliert. Messungen zeigen, wie sich eine konkrete Implementierung in einer konkreten Umgebung verhält.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Asymptotische Notation =&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Warum asymptotisch analysieren? ==&lt;br /&gt;
&lt;br /&gt;
Bei kleinen Eingaben können konstante Faktoren und technische Details wichtiger sein als die mathematische Wachstumsklasse. Bei großen Eingaben entscheidet jedoch oft das Wachstum. Ein Algorithmus mit Laufzeit 100n kann für große n besser sein als ein Algorithmus mit Laufzeit n², obwohl 100n zunächst größer wirkt.&lt;br /&gt;
&lt;br /&gt;
Die asymptotische Analyse konzentriert sich deshalb auf den führenden Wachstumsterm und ignoriert konstante Faktoren. Aus 3n² + 5n + 20 wird asymptotisch O(n²), weil n² bei sehr großen n dominiert.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== O-Notation ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;[[O-Notation]]&amp;#039;&amp;#039;&amp;#039; beschreibt eine asymptotische obere Schranke. Wenn ein Algorithmus O(n²) ist, wächst sein Aufwand höchstens proportional zu n², wenn n groß genug ist. Die O-Notation wird häufig genutzt, um den Worst-Case-Aufwand anzugeben.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Eine doppelte Schleife, bei der beide Schleifen jeweils n-mal laufen, hat häufig O(n²), weil insgesamt ungefähr n · n Operationen ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Omega-Notation ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;[[Omega-Notation]]&amp;#039;&amp;#039;&amp;#039; beschreibt eine asymptotische untere Schranke. Wenn ein Algorithmus Ω(n) ist, benötigt er für große Eingaben mindestens proportional zu n viele Schritte. Das kann wichtig sein, wenn man zeigen möchte, dass ein Problem nicht schneller gelöst werden kann, weil jede Eingabe mindestens einmal betrachtet werden muss.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Um in einer unsortierten Liste sicher das größte Element zu finden, muss jedes Element betrachtet werden. Deshalb liegt eine untere Schranke bei Ω(n).&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Theta-Notation ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;[[Theta-Notation]]&amp;#039;&amp;#039;&amp;#039; beschreibt eine asymptotisch enge Schranke. Wenn ein Algorithmus Θ(n log n) ist, wächst sein Aufwand sowohl nach oben als auch nach unten proportional zu n log n. Die Theta-Notation ist besonders aussagekräftig, weil sie das Wachstum genauer charakterisiert als nur eine obere oder untere Schranke.&lt;br /&gt;
&lt;br /&gt;
Beispiel: [[Mergesort]] hat im typischen Vergleichsmodell eine Laufzeit von Θ(n log n), weil die Liste wiederholt geteilt und auf jeder Ebene vollständig zusammengeführt wird.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Typische Wachstumsklassen ==&lt;br /&gt;
&lt;br /&gt;
Wachstumsklassen helfen beim Vergleich von Algorithmen. Von sehr effizient bis sehr teuer findet man häufig konstante, logarithmische, lineare, linearithmische, quadratische, kubische, exponentielle und faktorielle Laufzeiten.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Wachstum&lt;br /&gt;
! Schreibweise&lt;br /&gt;
! Typisches Beispiel&lt;br /&gt;
! Einordnung&lt;br /&gt;
|-&lt;br /&gt;
| konstant&lt;br /&gt;
| O(1)&lt;br /&gt;
| Zugriff auf ein Array-Element über einen Index&lt;br /&gt;
| Sehr effizient, unabhängig von n&lt;br /&gt;
|-&lt;br /&gt;
| logarithmisch&lt;br /&gt;
| O(log n)&lt;br /&gt;
| [[Binäre Suche]] in sortierter Liste&lt;br /&gt;
| Sehr gutes Wachstum bei großen Daten&lt;br /&gt;
|-&lt;br /&gt;
| linear&lt;br /&gt;
| O(n)&lt;br /&gt;
| [[Lineare Suche]]&lt;br /&gt;
| Aufwand wächst proportional zur Eingabe&lt;br /&gt;
|-&lt;br /&gt;
| linearithmisch&lt;br /&gt;
| O(n log n)&lt;br /&gt;
| [[Mergesort]] oder durchschnittlicher [[Quicksort]]&lt;br /&gt;
| Sehr wichtig für effizientes Sortieren&lt;br /&gt;
|-&lt;br /&gt;
| quadratisch&lt;br /&gt;
| O(n²)&lt;br /&gt;
| einfache doppelte Schleifen, [[Bubblesort]]&lt;br /&gt;
| Für große n oft problematisch&lt;br /&gt;
|-&lt;br /&gt;
| kubisch&lt;br /&gt;
| O(n³)&lt;br /&gt;
| manche Matrix- oder Graphverfahren&lt;br /&gt;
| Nur bei begrenzter Eingabegröße praktikabel&lt;br /&gt;
|-&lt;br /&gt;
| exponentiell&lt;br /&gt;
| O(2^n)&lt;br /&gt;
| vollständige Suche über Teilmengen&lt;br /&gt;
| Wächst sehr schnell&lt;br /&gt;
|-&lt;br /&gt;
| faktoriell&lt;br /&gt;
| O(n!)&lt;br /&gt;
| vollständige Prüfung aller Permutationen&lt;br /&gt;
| Nur für sehr kleine n praktikabel&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Fälle der Laufzeitanalyse =&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Best Case ==&lt;br /&gt;
&lt;br /&gt;
Der &amp;#039;&amp;#039;&amp;#039;[[Best Case]]&amp;#039;&amp;#039;&amp;#039; beschreibt den günstigsten Fall. Bei einer linearen Suche tritt er ein, wenn das gesuchte Element gleich an erster Stelle steht. Dann wird nur ein Vergleich benötigt. Der Best Case kann nützlich sein, darf aber nicht überschätzt werden, weil er oft selten auftritt.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Worst Case ==&lt;br /&gt;
&lt;br /&gt;
Der &amp;#039;&amp;#039;&amp;#039;[[Worst Case]]&amp;#039;&amp;#039;&amp;#039; beschreibt den ungünstigsten Fall. Bei einer linearen Suche ist das gesuchte Element entweder ganz am Ende oder gar nicht vorhanden. Dann müssen alle Elemente betrachtet werden. Der Worst Case ist besonders wichtig, wenn ein System verlässlich funktionieren muss, etwa in sicherheitskritischer Software oder Echtzeitsystemen.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Average Case ==&lt;br /&gt;
&lt;br /&gt;
Der &amp;#039;&amp;#039;&amp;#039;[[Average Case]]&amp;#039;&amp;#039;&amp;#039; beschreibt den durchschnittlichen Aufwand über viele mögliche Eingaben. Dafür braucht man Annahmen über die Verteilung der Eingaben. Diese Annahmen sind entscheidend: Wenn sie nicht zur Wirklichkeit passen, kann die Average-Case-Aussage irreführend sein.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel ist [[Quicksort]]. Im Durchschnitt ist Quicksort sehr effizient und erreicht O(n log n). Im ungünstigen Fall kann Quicksort jedoch O(n²) benötigen, wenn die Pivotwahl sehr schlecht ist.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Amortisierte Analyse ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;[[amortisierte Analyse]]&amp;#039;&amp;#039;&amp;#039; betrachtet nicht nur eine einzelne Operation, sondern eine Folge von Operationen. Manche einzelne Operation kann teuer sein, aber über viele Operationen verteilt ergibt sich ein günstiger Durchschnitt.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel ist ein dynamisches Array. Wenn das Array voll ist, muss es vergrößert und kopiert werden. Diese einzelne Vergrößerung ist teuer. Da sie aber nicht bei jedem Einfügen geschieht, ist das Einfügen amortisiert oft O(1).&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Analyse einfacher Programmstrukturen =&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Einzelne Anweisungen ==&lt;br /&gt;
&lt;br /&gt;
Eine einfache Zuweisung, ein Vergleich oder eine arithmetische Operation wird in einfachen Modellen häufig als O(1) betrachtet. Das bedeutet nicht, dass jede Operation physikalisch gleich schnell ist. Es bedeutet, dass sie unabhängig von der Eingabegröße als konstanter Schritt gezählt wird.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Einfache Schleifen ==&lt;br /&gt;
&lt;br /&gt;
Eine Schleife, die n-mal ausgeführt wird und pro Durchlauf konstant viel Arbeit erledigt, hat O(n). Beispiel:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Pseudocode&lt;br /&gt;
! Analyse&lt;br /&gt;
|-&lt;br /&gt;
| für i von 1 bis n: gib i aus&lt;br /&gt;
| Die Schleife läuft n-mal, also O(n).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wenn eine Schleife nur bis log n läuft, etwa weil sich die Problemgröße in jedem Schritt halbiert, entsteht oft O(log n).&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Geschachtelte Schleifen ==&lt;br /&gt;
&lt;br /&gt;
Geschachtelte Schleifen führen oft zu Produkten. Läuft eine äußere Schleife n-mal und eine innere Schleife ebenfalls n-mal, ergibt sich O(n²). Aber nicht jede geschachtelte Schleife ist automatisch quadratisch. Wenn die innere Schleife nur logarithmisch läuft, kann O(n log n) entstehen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Struktur&lt;br /&gt;
! Typische Laufzeit&lt;br /&gt;
! Begründung&lt;br /&gt;
|-&lt;br /&gt;
| eine Schleife bis n&lt;br /&gt;
| O(n)&lt;br /&gt;
| n Durchläufe&lt;br /&gt;
|-&lt;br /&gt;
| zwei vollständige geschachtelte Schleifen bis n&lt;br /&gt;
| O(n²)&lt;br /&gt;
| n · n Durchläufe&lt;br /&gt;
|-&lt;br /&gt;
| Schleife mit Halbierung&lt;br /&gt;
| O(log n)&lt;br /&gt;
| Problemgröße schrumpft exponentiell&lt;br /&gt;
|-&lt;br /&gt;
| Schleife bis n mit innerer Halbierung&lt;br /&gt;
| O(n log n)&lt;br /&gt;
| n-mal logarithmische Arbeit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Bedingungen und Verzweigungen ==&lt;br /&gt;
&lt;br /&gt;
Bei einer [[Bedingte Anweisung|Verzweigung]] betrachtet man die teuerste relevante Alternative. Wenn ein Algorithmus entweder einen O(n)-Zweig oder einen O(n²)-Zweig ausführen kann, ist der Worst Case O(n²). Für den Average Case müsste man wissen, wie häufig welcher Zweig auftritt.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Rekursion ==&lt;br /&gt;
&lt;br /&gt;
Bei [[Rekursion]] ruft sich ein Algorithmus selbst auf. Die Laufzeit wird oft mit einer [[Rekursionsgleichung]] beschrieben. Für [[Mergesort]] kann man etwa schreiben: T(n) = 2T(n/2) + O(n). Das bedeutet: Es gibt zwei Teilprobleme halber Größe und zusätzlich lineare Arbeit zum Zusammenführen. Daraus folgt Θ(n log n).&lt;br /&gt;
&lt;br /&gt;
Bei rekursiven Algorithmen ist wichtig, wie viele Teilprobleme entstehen, wie groß sie sind und wie teuer die Arbeit außerhalb der rekursiven Aufrufe ist.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Beispiele wichtiger Algorithmen =&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Lineare Suche ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;[[lineare Suche]]&amp;#039;&amp;#039;&amp;#039; betrachtet Elemente nacheinander, bis das gesuchte Element gefunden wird oder die Liste endet. Sie funktioniert auch bei unsortierten Daten. Der Best Case ist O(1), wenn das Element vorne steht. Der Worst Case ist O(n), wenn es hinten steht oder fehlt.&lt;br /&gt;
&lt;br /&gt;
Lineare Suche ist einfach, robust und für kleine Datenmengen ausreichend. Für sehr große sortierte Daten ist sie jedoch meist schlechter als binäre Suche.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Binäre Suche ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;[[binäre Suche]]&amp;#039;&amp;#039;&amp;#039; funktioniert nur auf sortierten Daten. In jedem Schritt wird das mittlere Element betrachtet. Danach kann eine Hälfte ausgeschlossen werden. Dadurch halbiert sich der Suchbereich wiederholt.&lt;br /&gt;
&lt;br /&gt;
Die Laufzeit ist O(log n). Bei einer Million Elementen sind nur ungefähr zwanzig Halbierungsschritte nötig. Dafür muss die Datenmenge sortiert sein, und der Zugriff auf das mittlere Element muss effizient möglich sein.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Bubblesort, Insertionsort und Selectionsort ==&lt;br /&gt;
&lt;br /&gt;
Einfache Sortierverfahren wie &amp;#039;&amp;#039;&amp;#039;[[Bubblesort]]&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;[[Insertionsort]]&amp;#039;&amp;#039;&amp;#039; und &amp;#039;&amp;#039;&amp;#039;[[Selectionsort]]&amp;#039;&amp;#039;&amp;#039; sind didaktisch wertvoll, weil sie leicht zu verstehen sind. Sie haben im Allgemeinen quadratische Laufzeit. Für große Datenmengen sind sie deshalb meist ungeeignet.&lt;br /&gt;
&lt;br /&gt;
Insertionsort kann bei fast sortierten Daten gut abschneiden. Bubblesort wird in der Praxis selten eingesetzt, eignet sich aber, um Vergleiche und Vertauschungen anschaulich zu verstehen.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Mergesort ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[Mergesort]]&amp;#039;&amp;#039;&amp;#039; teilt die Liste wiederholt in zwei Hälften, sortiert die Teile rekursiv und führt sie anschließend zusammen. Die Laufzeit ist Θ(n log n). Mergesort ist stabil, wenn gleiche Elemente ihre ursprüngliche Reihenfolge behalten.&lt;br /&gt;
&lt;br /&gt;
Ein Nachteil ist der zusätzliche Speicherbedarf, weil beim Zusammenführen häufig Hilfsarrays benötigt werden. Dadurch zeigt Mergesort gut, dass Laufzeit und Speicherbedarf gemeinsam betrachtet werden müssen.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Quicksort ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[Quicksort]]&amp;#039;&amp;#039;&amp;#039; wählt ein Pivot-Element und teilt die Daten in kleinere und größere Elemente. Anschließend werden die Teilbereiche rekursiv sortiert. Im Durchschnitt ist Quicksort O(n log n), im Worst Case jedoch O(n²). Gute Pivotstrategien reduzieren das Risiko schlechter Aufteilungen.&lt;br /&gt;
&lt;br /&gt;
Quicksort ist in der Praxis sehr verbreitet, weil es bei guter Implementierung schnell ist und häufig wenig Zusatzspeicher benötigt.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Hash-Tabellen ==&lt;br /&gt;
&lt;br /&gt;
Eine &amp;#039;&amp;#039;&amp;#039;[[Hash-Tabelle]]&amp;#039;&amp;#039;&amp;#039; ordnet Schlüssel mithilfe einer [[Hashfunktion]] Speicherpositionen zu. Suchen, Einfügen und Löschen sind im Durchschnitt oft O(1). Im Worst Case kann es jedoch zu vielen [[Kollision|Kollisionen]] kommen, sodass Operationen schlechter werden.&lt;br /&gt;
&lt;br /&gt;
Hash-Tabellen zeigen, dass Durchschnittsfall und Worst Case deutlich voneinander abweichen können. Sie zeigen außerdem, dass Datenstruktur und Algorithmus eng zusammengehören.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Grenzen der Effizienz =&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Polynomial und exponentiell ==&lt;br /&gt;
&lt;br /&gt;
Algorithmen mit polynomieller Laufzeit wie O(n), O(n²) oder O(n³) gelten häufig als deutlich besser handhabbar als exponentielle Verfahren wie O(2^n). Diese Einteilung ist jedoch nur eine grobe Orientierung. Ein Algorithmus mit O(n³) kann für sehr große n trotzdem unpraktisch sein, während ein exponentieller Algorithmus für kleine n ausreichend sein kann.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Entscheidungsprobleme und Komplexitätstheorie ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;[[Komplexitätstheorie]]&amp;#039;&amp;#039;&amp;#039; untersucht, wie schwer Probleme grundsätzlich sind. Dabei geht es nicht nur um einzelne Algorithmen, sondern um Klassen von Problemen. Bekannte Begriffe sind [[P (Komplexitätsklasse)|P]], [[NP (Komplexitätsklasse)|NP]] und [[NP-Vollständigkeit]]. Die berühmte Frage [[P-NP-Problem|P versus NP]] ist eines der wichtigsten offenen Probleme der theoretischen Informatik.&lt;br /&gt;
&lt;br /&gt;
Für die schulische Algorithmusanalyse genügt meist die Grundidee: Manche Probleme lassen sich mit bekannten Verfahren effizient lösen, bei anderen wächst der Aufwand so stark, dass große Eingaben praktisch kaum vollständig berechenbar sind.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Trade-offs ==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;[[Trade-off]]&amp;#039;&amp;#039;&amp;#039; ist ein Zielkonflikt. Ein Algorithmus kann schneller sein, dafür aber mehr Speicher benötigen. Ein anderer kann einfacher zu verstehen sein, aber schlechter skalieren. In realen Projekten spielen außerdem Wartbarkeit, Implementierungsaufwand, Fehlerrisiko, Energieverbrauch und Datenschutz eine Rolle.&lt;br /&gt;
&lt;br /&gt;
Gute Algorithmusanalyse führt daher nicht automatisch zu einer einzigen richtigen Lösung. Sie hilft Dir, eine begründete Entscheidung für einen bestimmten Kontext zu treffen.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Vorgehensweise bei der Analyse =&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Schritt-für-Schritt-Methode ==&lt;br /&gt;
&lt;br /&gt;
Eine hilfreiche Methode besteht darin, zuerst die Eingabegröße zu bestimmen, dann die dominierenden Operationen zu erkennen und schließlich das Wachstum zu vereinfachen. Dabei gilt: Der größte Wachstumsterm bestimmt die asymptotische Klasse.&lt;br /&gt;
&lt;br /&gt;
# [[Eingabegröße]]: Bestimme, wofür n steht.&lt;br /&gt;
# [[Grundoperation]]: Entscheide, welche Operation gezählt wird, etwa Vergleiche oder Schleifendurchläufe.&lt;br /&gt;
# [[Kontrollstruktur]]: Analysiere Schleifen, Verzweigungen und Rekursion.&lt;br /&gt;
# [[Dominanter Term]]: Vereinfache die Laufzeitfunktion auf den stärksten Wachstumsterm.&lt;br /&gt;
# [[Begründung]]: Formuliere nachvollziehbar, warum die gewählte Komplexitätsklasse gilt.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Beispielanalyse ==&lt;br /&gt;
&lt;br /&gt;
Gegeben sei folgender Pseudocode:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Für jedes Element x in einer Liste mit n Elementen: Prüfe, ob x größer als das bisherige Maximum ist.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus betrachtet jedes Element genau einmal. Pro Element wird konstant viel Arbeit ausgeführt. Die Laufzeit ist deshalb O(n). Da jedes Element betrachtet werden muss, um sicher das Maximum zu finden, liegt auch Ω(n) vor. Insgesamt ergibt sich Θ(n).&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Häufige Fehler ==&lt;br /&gt;
&lt;br /&gt;
Viele Lernende schließen vorschnell von einer Schleife auf O(n) oder von zwei Schleifen auf O(n²). Entscheidend ist aber, wie oft die Schleife wirklich läuft. Auch Konstanten dürfen in der O-Notation vernachlässigt werden, aber nicht die Struktur des Problems. Ein weiterer Fehler ist, Best Case, Worst Case und Average Case zu vermischen.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist außerdem: Die O-Notation beschreibt Wachstum, nicht konkrete Sekunden. Zwei Algorithmen mit derselben O-Klasse können in der Praxis unterschiedlich schnell sein. Trotzdem bleibt die asymptotische Analyse ein zentrales Werkzeug, weil sie grundlegende Skalierung sichtbar macht.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Interaktive Aufgaben =&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Quiz: Teste Dein Wissen ==&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Was untersucht die Algorithmusanalyse hauptsächlich?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Den Ressourcenbedarf eines Algorithmus in Abhängigkeit von der Eingabegröße)&lt;br /&gt;
(!Die Farbe der Benutzeroberfläche eines Programms)&lt;br /&gt;
(!Die Lizenzbedingungen einer Software)&lt;br /&gt;
(!Die Reihenfolge der Tasten auf einer Tastatur)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Was bedeutet O(n) typischerweise?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Der Aufwand wächst ungefähr proportional zur Eingabegröße)&lt;br /&gt;
(!Der Aufwand ist unabhängig von der Eingabegröße)&lt;br /&gt;
(!Der Aufwand verdoppelt sich immer nach exakt einer Sekunde)&lt;br /&gt;
(!Der Algorithmus kann nur Zahlen verarbeiten)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Welche Laufzeit hat die binäre Suche in einer sortierten Liste typischerweise?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(O log n)&lt;br /&gt;
(!O n)&lt;br /&gt;
(!O n Quadrat)&lt;br /&gt;
(!O zwei hoch n)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Was beschreibt der Worst Case?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Den ungünstigsten möglichen Fall für eine Eingabe)&lt;br /&gt;
(!Den durchschnittlichen Fall über alle möglichen Computer)&lt;br /&gt;
(!Den schnellsten möglichen Ablauf)&lt;br /&gt;
(!Die schönste Implementierung eines Algorithmus)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Welche Aussage zur Theta-Notation ist richtig?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Sie beschreibt eine asymptotisch enge Schranke)&lt;br /&gt;
(!Sie beschreibt nur eine grafische Darstellung)&lt;br /&gt;
(!Sie bedeutet immer konstante Laufzeit)&lt;br /&gt;
(!Sie gilt nur für Sortieralgorithmen)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Welche Datenstruktur ermöglicht Suchen im Durchschnitt oft in O eins?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Hash-Tabelle)&lt;br /&gt;
(!Unsortierte Papierliste)&lt;br /&gt;
(!Lineare Kette ohne Index)&lt;br /&gt;
(!Zufällig gemischter Text)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Warum kann eine doppelte vollständige Schleife häufig O n Quadrat haben?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Weil n Durchläufe mit n weiteren Durchläufen kombiniert werden)&lt;br /&gt;
(!Weil jeder Algorithmus mit zwei Zeilen quadratisch ist)&lt;br /&gt;
(!Weil Computer nur Quadratzahlen speichern)&lt;br /&gt;
(!Weil die Eingabe immer sortiert sein muss)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Welche Laufzeitklasse wächst bei großen Eingaben meist schneller als quadratisch?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Exponentiell)&lt;br /&gt;
(!Linear)&lt;br /&gt;
(!Konstant)&lt;br /&gt;
(!Logarithmisch)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Was ist eine amortisierte Analyse?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Die Betrachtung der durchschnittlichen Kosten über eine Folge von Operationen)&lt;br /&gt;
(!Die Analyse der Bildschirmgröße)&lt;br /&gt;
(!Die Übersetzung eines Programms in eine andere Sprache)&lt;br /&gt;
(!Die Speicherung aller Daten in alphabetischer Reihenfolge)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{MC}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Welche Aussage zu Benchmarks ist richtig?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Sie messen konkrete Implementierungen unter bestimmten Bedingungen)&lt;br /&gt;
(!Sie ersetzen jede theoretische Analyse vollständig)&lt;br /&gt;
(!Sie sind unabhängig von Hardware und Programmiersprache)&lt;br /&gt;
(!Sie liefern immer dieselben Ergebnisse auf jedem Computer)&lt;br /&gt;
&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Memory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;memo-quiz&amp;quot;&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| O eins || Konstanter Zugriff&lt;br /&gt;
|-&lt;br /&gt;
| O log n || Binäre Suche&lt;br /&gt;
|-&lt;br /&gt;
| O n || Lineare Suche&lt;br /&gt;
|-&lt;br /&gt;
| O n log n || Mergesort&lt;br /&gt;
|-&lt;br /&gt;
| O n Quadrat || Doppelte Schleife&lt;br /&gt;
|-&lt;br /&gt;
| Worst Case || Ungünstigster Fall&lt;br /&gt;
|-&lt;br /&gt;
| Average Case || Durchschnittlicher Fall&lt;br /&gt;
|}&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Drag and Drop ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;lueckentext-quiz&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! Ordne die richtigen Begriffe zu.&lt;br /&gt;
! Thema&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Konstante Laufzeit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Zugriff auf ein Array-Element&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Logarithmische Laufzeit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Halbierung des Suchraums&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Lineare Laufzeit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Einmaliges Durchlaufen einer Liste&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Quadratische Laufzeit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Vollständig geschachtelte Schleifen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Exponentielle Laufzeit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Vollständige Suche über Teilmengen&lt;br /&gt;
|}&lt;br /&gt;
{{E}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Kreuzworträtsel ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;kreuzwort-quiz&amp;quot;&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Laufzeit || Welche Ressource beschreibt die benötigte Zeit eines Algorithmus?&lt;br /&gt;
|-&lt;br /&gt;
| Speicher || Welche Ressource beschreibt den zusätzlichen Platzbedarf?&lt;br /&gt;
|-&lt;br /&gt;
| Quicksort || Welcher Sortieralgorithmus nutzt typischerweise ein Pivot-Element?&lt;br /&gt;
|-&lt;br /&gt;
| Mergesort || Welcher Sortieralgorithmus teilt und führt sortierte Teile zusammen?&lt;br /&gt;
|-&lt;br /&gt;
| Hashing || Welches Prinzip ordnet Schlüssel Speicherpositionen zu?&lt;br /&gt;
|-&lt;br /&gt;
| Rekursion || Wie nennt man es, wenn sich ein Algorithmus selbst aufruft?&lt;br /&gt;
|}&lt;br /&gt;
{{E}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== LearningApps ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iframe&amp;gt; https://learningapps.org/index.php?s=Algorithmusanalyse &amp;lt;/iframe&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
== Lückentext ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;quiz display=simple&amp;gt;&lt;br /&gt;
{&amp;#039;&amp;#039;&amp;#039;Vervollständige den Text.&amp;#039;&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
|type=&amp;quot;{}&amp;quot;}&lt;br /&gt;
Die Algorithmusanalyse untersucht den { Ressourcenbedarf } eines Algorithmus in Abhängigkeit von der Eingabegröße. Die Eingabegröße wird häufig mit { n } bezeichnet. Die O-Notation beschreibt eine asymptotische { obere } Schranke. Die Omega-Notation beschreibt eine asymptotische { untere } Schranke. Eine enge Schranke wird mit der { Theta-Notation } beschrieben. Bei der binären Suche wird der Suchbereich in jedem Schritt ungefähr { halbiert }. Eine lineare Suche benötigt im Worst Case { O(n) } Schritte. Mergesort hat typischerweise die Laufzeit { O(n log n) }. Bei einer Hash-Tabelle sind Suchoperationen im Durchschnitt oft { O(1) }. Die amortisierte Analyse betrachtet die Kosten über eine { Folge } von Operationen.&lt;br /&gt;
&amp;lt;/quiz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Offene Aufgaben =&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
=== Leicht ===&lt;br /&gt;
# [[Begriffe erklären]]: Erstelle ein Mini-Glossar mit zehn Begriffen zur [[Algorithmusanalyse]], darunter [[Laufzeit]], [[Speicherkomplexität]], [[O-Notation]], [[Worst Case]] und [[Eingabegröße]].&lt;br /&gt;
# [[Alltagsalgorithmus]]: Beschreibe einen Alltagsalgorithmus, etwa das Suchen eines Buches im Regal, und erkläre, welche Eingabegröße dabei eine Rolle spielt.&lt;br /&gt;
# [[Wachstum vergleichen]]: Zeichne per Hand ein Koordinatensystem und skizziere grob die Wachstumsklassen O(1), O(log n), O(n), O(n²) und O(2^n).&lt;br /&gt;
# [[Suchverfahren vergleichen]]: Vergleiche lineare Suche und binäre Suche an einer sortierten Liste mit 16 Elementen und notiere die benötigten Schritte.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
=== Standard ===&lt;br /&gt;
# [[Pseudocode analysieren]]: Schreibe einen Pseudocode mit einer einfachen Schleife und bestimme seine Laufzeitklasse.&lt;br /&gt;
# [[Schleifen untersuchen]]: Analysiere drei verschiedene Schleifenstrukturen und erkläre, warum sie O(n), O(log n) oder O(n²) haben.&lt;br /&gt;
# [[Sortierverfahren beobachten]]: Nutze eine Visualisierung zu Sortieralgorithmen und beschreibe, wie sich [[Bubblesort]], [[Mergesort]] und [[Quicksort]] bei wachsenden Listen unterscheiden.&lt;br /&gt;
# [[Benchmark kritisch prüfen]]: Führe einen kleinen Laufzeitvergleich zweier Suchverfahren durch und erkläre, warum Messwerte allein keine vollständige Algorithmusanalyse ersetzen.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
=== Schwer ===&lt;br /&gt;
# [[Rekursion analysieren]]: Erstelle eine Rekursionsgleichung für einen rekursiven Algorithmus und löse sie mit einer begründeten Abschätzung.&lt;br /&gt;
# [[Trade-off bewerten]]: Vergleiche zwei Lösungen für dasselbe Problem, bei denen eine schneller ist und die andere weniger Speicher benötigt. Begründe, wann welche Lösung sinnvoller ist.&lt;br /&gt;
# [[Komplexität im Alltag]]: Recherchiere ein reales Problem aus [[Datenbank|Datenbanken]], [[Künstliche Intelligenz]] oder [[Kryptographie]] und erkläre, warum effiziente Algorithmen dort entscheidend sind.&lt;br /&gt;
# [[Algorithmus verbessern]]: Entwickle für ein einfaches Problem zunächst eine naive Lösung und anschließend eine effizientere Lösung. Vergleiche beide mit O-Notation und einem Beispiel.&lt;br /&gt;
&lt;br /&gt;
{{:Offene Aufgabe - MOOC erstellen}}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lernkontrolle =&lt;br /&gt;
&lt;br /&gt;
# [[Transfer auf neue Probleme]]: Du erhältst einen unbekannten Pseudocode mit mehreren Schleifen. Bestimme nicht nur die Laufzeitklasse, sondern erkläre genau, welche Programmstruktur den dominierenden Aufwand verursacht.&lt;br /&gt;
# [[Begründete Entscheidung]]: Eine unsortierte Liste soll häufig durchsucht werden. Begründe, ob Sortieren mit anschließender binärer Suche sinnvoll ist oder ob lineare Suche ausreicht.&lt;br /&gt;
# [[Fallunterscheidung]]: Erkläre an einem selbst gewählten Beispiel, warum Best Case, Average Case und Worst Case zu unterschiedlichen Aussagen führen können.&lt;br /&gt;
# [[Ressourcenkonflikt]]: Beurteile eine Situation, in der ein schneller Algorithmus sehr viel Speicher benötigt. Entwickle Kriterien, nach denen Du eine Entscheidung triffst.&lt;br /&gt;
# [[Skalierung einschätzen]]: Vergleiche zwei Algorithmen mit O(n²) und O(n log n) für kleine und große Eingaben. Erkläre, warum die bessere Wahl von der Eingabegröße abhängen kann.&lt;br /&gt;
# [[Grenzen erkennen]]: Beschreibe, warum exponentielle Verfahren bei großen Eingaben schnell unpraktisch werden und nenne eine Strategie, mit der man trotzdem Näherungslösungen finden könnte.&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Lernnachweis =&lt;br /&gt;
&lt;br /&gt;
Der [[Lernnachweis]] zu diesem aiMOOC prüft, ob Du Zusammenhänge erklären, neue Beispiele analysieren und begründete Entscheidungen treffen kannst. Bearbeite die Aufgaben schriftlich oder in einer Präsentation. Nutze keine externen Medien im Lernnachweis, sondern eigene Begründungen, Skizzen und Pseudocode.&lt;br /&gt;
&lt;br /&gt;
# [[Analyseaufgabe]]: Erkläre an einem selbst gewählten Pseudocode mit mindestens zwei Kontrollstrukturen, welche Laufzeitklasse entsteht und warum.&lt;br /&gt;
# [[Vergleichsaufgabe]]: Vergleiche zwei Algorithmen für dasselbe Problem hinsichtlich Laufzeit, Speicherbedarf und Verständlichkeit.&lt;br /&gt;
# [[Transferaufgabe]]: Entwickle zu einem Alltagsproblem zwei Lösungswege und beschreibe, welcher bei wachsender Eingabegröße besser skaliert.&lt;br /&gt;
# [[Argumentationsaufgabe]]: Begründe, warum eine schlechtere asymptotische Laufzeit bei sehr kleinen Eingaben trotzdem praktisch akzeptabel sein kann.&lt;br /&gt;
# [[Reflexionsaufgabe]]: Beschreibe, welche Grenzen die O-Notation hat und warum Messungen in der Praxis trotzdem hilfreich sein können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= OERs zum Thema =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iframe&amp;gt; https://de.m.wikipedia.org/wiki/Algorithmusanalyse &amp;lt;/iframe&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere freie Lern- und Recherchequellen:&lt;br /&gt;
# [[Wikipedia]]: [https://de.wikipedia.org/wiki/Landau-Symbole Landau-Symbole] zur mathematischen Notation asymptotischer Schranken.&lt;br /&gt;
# [[Wikimedia Commons]]: [https://commons.wikimedia.org/w/index.php?search=algorithm+analysis&amp;amp;title=Special:MediaSearch&amp;amp;type=image Medienrecherche zu algorithm analysis].&lt;br /&gt;
# [[OER-Suche]]: [https://open-educational-resources.de/?s=Algorithmusanalyse OERinfo-Suche zu Algorithmusanalyse].&lt;br /&gt;
# [[Lernvideo-Suche]]: [https://www.youtube.com/results?search_query=Algorithmusanalyse+Laufzeit+O-Notation+deutsch YouTube-Suche zu Laufzeit und O-Notation].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
{| align=center&lt;br /&gt;
{{:D-Tab}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;[[Algorithmusanalyse]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# [[Algorithmus]]&lt;br /&gt;
# [[O-Notation]]&lt;br /&gt;
# [[Landau-Symbole]]&lt;br /&gt;
# [[Laufzeit]]&lt;br /&gt;
# [[Speicherkomplexität]]&lt;br /&gt;
# [[Eingabegröße]]&lt;br /&gt;
# [[Worst Case]]&lt;br /&gt;
# [[Average Case]]&lt;br /&gt;
# [[Best Case]]&lt;br /&gt;
# [[Binäre Suche]]&lt;br /&gt;
# [[Lineare Suche]]&lt;br /&gt;
# [[Sortieralgorithmus]]&lt;br /&gt;
# [[Mergesort]]&lt;br /&gt;
# [[Quicksort]]&lt;br /&gt;
# [[Hash-Tabelle]]&lt;br /&gt;
# [[Komplexitätstheorie]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= Zusammenfassung =&lt;br /&gt;
&lt;br /&gt;
Die [[Algorithmusanalyse]] ist ein grundlegendes Werkzeug der [[Informatik]]. Sie hilft Dir zu beurteilen, wie gut ein [[Algorithmus]] mit wachsender [[Eingabegröße]] skaliert. Mit [[O-Notation]], [[Omega-Notation]] und [[Theta-Notation]] beschreibst Du asymptotische Schranken. Durch die Unterscheidung von [[Best Case]], [[Worst Case]] und [[Average Case]] erkennst Du, dass der Aufwand stark von den Eingabedaten abhängen kann. Die Analyse von Schleifen, Verzweigungen und [[Rekursion]] bildet die Grundlage, um Pseudocode und Programme systematisch zu bewerten. In der Praxis ist die beste Lösung nicht immer nur die schnellste, sondern diejenige, die Laufzeit, Speicherbedarf, Verständlichkeit und Anwendungskontext sinnvoll ausbalanciert.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Algorithmus]]&lt;br /&gt;
[[Kategorie:Programmierung]]&lt;br /&gt;
[[Kategorie:Mathematik]]&lt;br /&gt;
[[Kategorie:Sekundarstufe II]]&lt;br /&gt;
[[Kategorie:Studium]]&lt;br /&gt;
[[Kategorie:Medienbildung]]&lt;br /&gt;
&lt;br /&gt;
{{BR}}&lt;br /&gt;
= aiMOOC-Projekte =&lt;br /&gt;
[[Kategorie:AI_MOOC]] [[Kategorie:GPT aiMOOC]]&lt;br /&gt;
{{MT}}&lt;/div&gt;</summary>
		<author><name>Glanz</name></author>
	</entry>
</feed>