Reagiert mit einem definierten Verhalten auf Anforderungen / seine Umgebung Besitzt eine Identität, die es von anderen Objekten unterscheidet Kann mit anderen Objekten verbunden sein Objektorientierte Programmierung
Objekten deren Struktur (Attribute), Verhalten (Operationen) und Beziehungen. Stellt den Bauplan dar, nach dem die Objekte gestaltet sind und nach dessen Vorgaben sie sich verhalten Machen‘s möglich, mehrere Daten (und ihre Zugriffsfunktionen) zusammenzufassen, um einen eigenen Datentyp zu modellieren: Objektorientierte Programmierung
die mit der Klasse arbeiten, erhalten nur Informationen über die für sie relevanten Teile der Klasse Der Zugriff auf die Membervariablen der Klasse wird verborgen und möglich gemacht über entsprechende Methoden der Klasse (Memberfunktionen) Objektorientierte Programmierung
Klasse von Problemen Komplexität eines Algorithmus: Bedarf an Ressourcen (i.e. Rechenzeit und Speicherplatz) Güte eines Algorithmus: Qualität der Ergebnisse Laufzeit / Rechenbedarf des Algorithmus Algorithmen, Datenstrukturen
des Rechners) Legt fest, welche Operationen mit einer Variable möglich sind Bestimmt die interne Darstellung (Repräsentation) der Variablen im Rechner Z.B. bool, int, float, double, unsigned int, etc. Algorithmen, Datenstrukturen
Elemente eingefügt und wieder entfernt werden können LIFO-Prinzip: Last In, First Out – bei der Datenstruktur „Stack“ kann immer nur auf das Element zugegriffen werden, das als letztes eingefügt, d.h. auf den Stapel gelegt wurde
x auf den Stack s top(s) liefert das zuletzt auf den Stack s gelegte Element (ohne das entsprechende Element zu entfernen) pop(s) entfernt das zuletzt auf den Stack s gelegte Element und gibt es zurück isEmpty(s) gibt an, ob der Stack s leer ist Datenstruktur Stack
push(„boards of canada – music has the right to children“, audiocdstapel) Datenstruktur Stack: Die Praxis Stack „audiocdstapel“ vor push(…) Stack „audiocdstapel“ nach push(…)
Music has the right to children“, audiocdstapel) push(„Clark – Iradelphic“, audiocdstapel) … Push(„Alt-J – An Awesome Wave“, audiocdstapel) Datenstruktur Stack: Die Praxis
an einem Ende und alle Löschungen am entgegengesetzten Ende stattfinden Operationen: enQueue Objekt hinzufügen deQueue Objekt zurückgeben, anschließend entfernen Queue
Ende eingefügt bzw. entnommen werden Nachteil Stack / Queue: Sollen beliebige Elemente an beliebiger Stelle eingefügt oder gelöscht werden, wird‘s bei sequentieller Eintragung recht aufwändig Lösung Liste: Folge von Elementen, in der an beliebiger Stelle neue Elemente eingefügt oder vorhandene Elemente entfernt werden können Contra Stack / Queue
Kette Jeder Eintrag in der Liste verfügt nicht nur über seinen Inhalt, sondern darüber hinaus über einen Zeiger auf das nächste Listenelement: Einfach verkettete Liste
(„Anker“ für den Beginn der Liste) „next“ zeigt auf das nächste Listenelement Letztes Glied der Kette: next-Zeiger = NULL Um wieder auf das erste Element zugreifen zu können: anfang-Zeiger auf das erste Element der Liste Hilfszeiger auf innere Elemente: cursor Einfach verkettete Liste
Zeiger auf das nachfolgende Element Einen Zeiger auf das vorhergehende Element Vorteile Möglichkeit, vom Ende der Liste zum Beginn zu iterieren Schnelles Löschen und Einfügen von Elementen Nachteil Speicherplatzbedarf durch zweiten Zeiger erhöht Doppelt verkettete Liste bat cat sat vat NULL start
aufweisen: Wurzel: Jeder Baum besitzt genau einen Knoten, der als Wurzel bezeichnet wird Kante: Jeder Knoten ist außer der Wurzel durch genau eine Kante mit seinem Vaterknoten (auch: „Elternknoten“ oder „Vorgänger“) verbunden Wird dann auch als Kind (Sohn, Nachfolger) dieses Knotens genannt Blatt: Ein Knoten ohne Kinder Innere Knoten: Alle anderen Knoten Kleine Baumschule
über einen Elternknoten. Ausnahme: ??? Vorfahre (ancestor) – Elternknoten von Knoten Beispiel: Der Knoten „2“ ist Vorfahre des Knotens „3“. Kind (child) – Untergeordnete Knoten Beispiel: „3“ ist Kindknoten von „2“. Geschwister (siblings): Knoten mit gleichen Elternknoten sind Geschwisterknoten. Beispiel: Der Knoten „3“ ist Geschwisterknoten des Knotens „4“. Bäume und die Praxis: XPath: Navigation 1 2 5 6 3 4
n Elementen: minimal: 1(best case), maximal: n (worst case) Durchschnittlich müssen die Hälfte der Einträge durchgesehen werden, um das gewünschte Element zu finden (average case) Anzahl der Suchschritte steigt proportional mit der Anzahl der Einträge Lineare Suche Quelle und Bildnachweis: http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo1.php
dem Vorgehen eines Kartenspielers: Neue Karten werden einzeln einsortiert, bevor die nächste Karte aufgenommen wird Bubblesort: Vergleichsbasierter Sortieralgorithmus Heapsort Quicksort (von C.A.R. Hoare) Sortieralgorithmen
von Nachbarfeldern, die in falscher Reihenfolge stehen Wird so lange wiederholt, bis das Array vollständig sortiert ist. Dabei wird das Array in mehreren Durchgängen von links nach rechts durchwandert. Bei jedem Durchgang werden alle Nachbarfelder verglichen und ggf. vertauscht. Nach dem 1. Durchgang hat man folgende Situation: Das größte Element ist ganz rechts. Alle anderen Elemente sind zwar zum Teil an besseren Positionen (also näher an der endgültigen Position), im Allgemeinen aber noch unsortiert. Wandern des größten Elementes nach rechts Aufsteigen von Luftblasen: Größte Luftblase steigt nach oben Bubblesort
Liste von Einträgen Start der Suche bei mittlerem Eintrag; Vergleich des Suchschlüssels mit dem Eintrag Ist der gesuchte Eintrag gefunden, so ist die Suche beendet Ansonsten: Suche in der linken oder der rechten Hälfte der Einträge - je nachdem, ob der gelesene Schlüssel größer oder kleiner war als der Suchschlüssel Verfahren so lange, bis der Eintrag gefunden ist oder bis keine Halbierung des Suchraums mehr möglich ist (d.h. man ist an der Stelle angekommen, an der der Eintrag eigentlich stehen müsste). Binäre Suche Quelle und Bildnachweis: http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo1.php
Eintrag zu finden? Beim ersten Suchvorgang halbieren wir die Menge der Einträge Beim zweiten Suchvorgang halbieren wir die (halbierte) Menge der Einträge erneut Komplexität: Wir benötigen log2(n) Suchvorgänge, um in einem Array mit n Einträgen das gewünschte Element zu finden Binäre Suche