Vorlesung Informatik 2 - Teil B: Theorie
1.1 Einfache Algorithmen
Algorithmus: Anleitung zur Lösung einer Aufgabe in endlich vielen Schritten.
Beispiele:
- Kochrezept
- Bedienungsanleitung
- Checkliste im Cockpit
- Verfahren zum Erzeugen eines Huffman-Codes
Eigenschaften von Algorithmen:
- Korrektheit: führt er immer zu einem richtigen Ergebnis? Formaler Beweis für größere Programme in der Praxis schwierig bis unmöglich.
- Aufwand: wieviel Speicher und Rechenzeit benötigt die Lösung? Dazu befassen wir uns später mit dem Konzept der Komplexität
Beschreibungen von Algorithmen:
- Text
- Struktogramme (Nassi-Shneidermann)
- Flussdiagramme
- Pseudosprache
- Programmiersprache
Beispiel: Ist ein bestimmtes Element in einer Menge vorhanden?
Gegeben: eine Menge A = {a1, a2, a3, ..., an} von Elementen, z.B. Zahlen sowie das gesuchte Element x
Verfahren:
- Vergleiche das erste Element a1i mit x
- Bei Gleichheit: beende Algorithmus mit 'gefunden'
- Bei Ungleichheit:
- gibt es noch ein weiteres Element?
- wenn ja: wiederhole Schritt 1 mit dem nächsten Element
- wenn nein: beende Algorithmus mit 'nicht gefunden'
Das nennt man auch lineare Suche.
In Java kennen wir bisher die LinkedList um mehrere Elemente zu speichern:
boolean lineareSuche(LinkedList<Integer> a, Integer x){
for(Integer s:a){
if(s.equals(x)) return true;
}
return false;
}
Oder wir verwenden einen Array, dessen Elemente man mit einem Index zwischen 0 und n-1 adressiert (Arrays werden wir demnächst ausführlich behandeln):
boolean lineareSuche(int[] a, int x){
for(int s:a){
if(s==x) return true;
}
return false;
}
Ratschläge zu Entwurf und Impementierung:
- Jeder Algorithmus basiert auf einer Idee. Versuche zunächst, die Idee in wenigen Schritten grob darzustellen, so dass auch Fachfremde (Chef, Kunden) sie verstehen.
- Zerlege den Algorithmus in Teilschritte und prüfe, ob es dafür schon Lösungen gibt - die meisten Probleme hat schon jemand vor Dir gelöst!
- Prüfe vor der Implementierung ob der Teilalgorithmus geeignet und effizient genug ist.
- Prüfe für jeden Teil-Algorithmus den gültigen Wertebereich der Eingabeparameter und übernimm diese Prüfungen in die spätere Implementierung.
- Stelle vor der Implementierung eine Liste der möglichen Schwachpunkte auf: Extreme Parameter, Spezialfälle bei den Daten, was ist wenn ... , gibt es Fälle in denen der Algorithmus nicht terminiert, ...
- Erstelle eine Liste von Test-Datensätzen, sowohl für die Teile als auch für den gesamten Algorithmus. Wenn später ein Problem auftritten, erweitere die Test-Datensätze, so kannst Du nach Änderungen verifizieren, dass das Programm noch funktioniert.
- Dokumentiere Änderungen am Code in geeigneter Weise.
- Sei die bewusst, dass alles, was schief gehen kann, auch irgendwann schiefgehen wird!
Software gehört inzwischen zu der Art Wirtschaftsgut, in die weltweit das meiste Kapital investiert wird.