1.1 Was ist ein Algorithmus
Algorithmus – ist eine geordnete Abfolge von klar definierten Schritten oder Anweisungen, die dazu bestimmt sind, eine bestimmte Aufgabe zu erledigen oder ein bestimmtes Problem zu lösen. Jeder Schritt des Algorithmus muss verständlich und eindeutig sein, und die Ausführung des Algorithmus muss innerhalb einer endlichen Zeit zu einem bestimmten Ergebnis führen.
Warum ein Algorithmus gebraucht wird:
- Problemlösung: Algorithmen ermöglichen es, systematisch an die Lösung verschiedener Probleme heranzugehen, von einfachen mathematischen Operationen bis hin zu komplexen Rechenproblemen.
- Prozessautomatisierung: Algorithmen sind notwendig, um Aufgaben in Software zu automatisieren, sodass Computer wiederkehrende Aufgaben ohne menschliches Eingreifen ausführen können.
- Ressourcenoptimierung: Richtig entworfene Algorithmen helfen, Ressourcen effizient zu nutzen, wie z.B. Ausführungszeit und Arbeitsspeicher.
- Wiederholbarkeit und Zuverlässigkeit: Algorithmen gewährleisten die Wiederholbarkeit und Vorhersagbarkeit von Ergebnissen, was wichtig für die Entwicklung zuverlässiger Software ist.
Beispiele:
- Tägliche Aufgaben: Zum Beispiel der Algorithmus der Morgenroutine – aufwachen, Zähne putzen, Frühstück zubereiten usw.
- Mathematische Operationen: Der Algorithmus zur Bestimmung des größten gemeinsamen Teilers (GGT) von zwei Zahlen.
- Computerprogramme: Sortieralgorithmen (z.B. Bubble Sort) und Suchalgorithmen (z.B. Binary Search).
1.2 Was ist eine Datenstruktur
Datenstruktur – ist eine Methode zur Organisation und Speicherung von Daten, sodass diese effizient genutzt und verarbeitet werden können. Verschiedene Datenstrukturen sind für verschiedene Arten von Aufgaben und Operationen vorgesehen.
Warum Datenstrukturen benötigt werden:
- Effizientes Datenmanagement: Datenstrukturen ermöglichen es, Daten so zu organisieren, dass ein schneller und effizienter Zugriff, Änderungen und Löschungen möglich sind.
- Optimierung von Algorithmen: Verschiedene Datenstrukturen eignen sich für verschiedene Algorithmen, und die richtige Wahl der Datenstruktur kann die Effizienz eines Algorithmus erheblich steigern.
- Programmierkomfort: Die Verwendung der richtigen Datenstrukturen macht den Code verständlicher, wartbarer und erweiterbar.
- Lösungen für spezifische Aufgaben: Einige Datenstrukturen sind zur Lösung bestimmter Aufgaben bestimmt, wie Hash-Tabellen für schnelles Suchen oder Bäume für hierarchische Daten.
Beispiele:
- Arrays: Eine Sammlung von Elementen eines Typs, auf die über einen Index zugegriffen werden kann.
- Verkettete Listen: Eine Sammlung von Elementen, von denen jedes einen Verweis auf das nächste Element enthält.
- Stack: Eine Sammlung von Elementen mit dem Prinzip
LIFO (Last In, First Out)
. - Queue: Eine Sammlung von Elementen mit dem Prinzip
FIFO (First In, First Out)
.
1.3 Die Bedeutung von Algorithmen und Datenstrukturen in der Programmierung
Wichtig! Selbst wenn du eine einfache Website oder eine einfache mobile App schreibst, nutzt du komplexe Algorithmen und Datenstrukturen. Die App läuft auf einem Betriebssystem, die Website – innerhalb eines Browsers, und um diese Dinge schnell und zuverlässig arbeiten zu lassen, werden standardisierte Algorithmen und Datenstrukturen verwendet.
Die Bedeutung von Algorithmen:
- Grundlegendes Prinzip der Programmierung: Algorithmen sind die Grundlage eines jeden Programms und bestimmen, wie Daten verarbeitet werden, um das gewünschte Ergebnis zu erzielen.
- Effizienz und Leistung: Optimale Algorithmen ermöglichen eine schnelle Ausführung von Programmen und eine effiziente Nutzung von Ressourcen.
- Lösung komplexer Aufgaben: Algorithmen ermöglichen es, komplexe Rechenaufgaben zu lösen, die manuell nicht zu bewältigen wären.
- Universalität: Viele Algorithmen können in verschiedenen Bereichen eingesetzt werden, wie Sortieren, Suchen, Datenkompression und Kryptographie.
Die Bedeutung von Datenstrukturen:
- Datenorganisation: Datenstrukturen ermöglichen es, Daten effizient zu organisieren und zu verwalten, was wichtig für die Erstellung effizienter Programme ist.
- Unterstützung von Algorithmen: Verschiedene Datenstrukturen sind für verschiedene Algorithmen optimal, und die richtige Wahl der Datenstruktur kann die Leistung eines Programms erheblich verbessern.
- Skalierbarkeit: Gut entworfene Datenstrukturen ermöglichen es, Programme einfach zu erweitern und zu modifizieren.
1.4 Beispiele einfacher Algorithmen
Algorithmus zur Bestimmung des Maximums in einem Array:
Dieser Algorithmus findet den größten Wert in einem gegebenen Zahlenarray.
Schrittweiser Algorithmus:
- Nehme das erste Element des Arrays als maximales Element an.
- Gehe durch alle anderen Elemente des Arrays:
- Wenn das aktuelle Element größer als das aktuelle maximale Element ist, aktualisiere das maximale Element.
- Nach Durchsicht aller Elemente gib das gefundene maximale Element zurück.
Python-Implementierung:
def find_max(arr):
# Gehe davon aus, dass das erste Element das maximale ist
max_val = arr[0]
# Gehe durch alle Elemente des Arrays
for num in arr:
# Wenn das aktuelle Element größer ist als max_val, aktualisiere max_val
if num > max_val:
max_val = num
# Gib das gefundene Maximum zurück
return max_val
# Beispielverwendung:
# numbers = [4, 2, 9, 7, 5, 1]
# result = find_max(numbers)
# Ausgabe: 9
Bubble Sort Algorithmus:
Dieser Algorithmus sortiert ein Array, indem er benachbarte Elemente der Reihe nach vergleicht und vertauscht, wenn sie in der falschen Reihenfolge stehen.
Schrittweiser Algorithmus:
- Beginne mit dem ersten Element des Arrays.
- Vergleiche das aktuelle Element mit dem nächsten.
- Wenn das aktuelle Element größer ist als das nächste, tausche sie aus.
- Gehe zum nächsten Element und wiederhole Schritte 2-3, bis das Ende des Arrays erreicht ist.
- Wiederhole Schritte 1-4, bis bei einem Durchlauf durch das Array keine Elemente getauscht werden.
Python-Implementierung:
def bubble_sort(arr):
n = len(arr)
# Gehe durch alle Elemente des Arrays
for i in range(n):
# Die letzten i Elemente sind bereits sortiert
for j in range(0, n - i - 1):
# Vergleiche benachbarte Elemente
if arr[j] > arr[j + 1]:
# Tausche die Elemente, wenn sie in der falschen Reihenfolge sind
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr
# Beispielverwendung:
# numbers = [64, 34, 25, 12, 22, 11, 90]
# sorted_numbers = bubble_sort(numbers)
# Ausgabe: [11, 12, 22, 25, 34, 64, 90]
GO TO FULL VERSION