Grundlagen der Programmierung Algorithmen und Datenstrukturen Die Inhalte der Vorlesung wurden primär auf Basis der angegebenen Literatur erstellt. Darüber hinaus sind viele Teile direkt aus der Vorlesung von Prof. Dr.-Ing. Faustmann (ebenfalls FHW Berlin) übernommen worden. Für die Bereitstellung dieses Vorlesungsmaterials möchte ich mich an dieser Stelle noch einmal recht herzlich bedanken. 12.01.2012 Prof. Dr. Andreas Schmietendorf 1
Suchalgorithmen 12.01.2012 Prof. Dr. Andreas Schmietendorf 2
Suchalgorithmen Allgemeines Problem der Suche: Innerhalb einer Datensammlung wird nach einem oder mehreren Datensätzen mit einer bestimmten Eigenschaft gesucht. Beispiele für mögliche Datensammlungen: - Arrays - Listen - Dateien Man unterscheidet zwischen: - internem Suchen: alle Objekte der Suchmenge befinden sich im internen Speicher und - externem Suchen: die Objekte befinden sich teilweise auf externen Speichermedien 12.01.2012 Prof. Dr. Andreas Schmietendorf 3
Suchalgorithmen Lineare Suche (am Beispiel des Telefonbuches): Suche einer bestimmten Telefonnummer innerhalb des Telefonbuches ohne Kenntnis des Namens. - Alle Einträge beginnend bei dem ersten bis zum letzten sind zu durchsuchen. Erfolglose Suche es müssen alle N Einträge untersucht werden Erfolgreiche Suche kann beim 1., 2. oder letzten Eintrag beendet sein - Leistung eines solchen Algorithmus kann nur hinsichtlich seines worst case Verhaltens vorausgesagt werden. Potentielle Verbesserungen: - Nummern in eine bestimmte Reihenfolge (Sortierung) bringen - Verwendung eines Skip-Indexes 12.01.2012 Prof. Dr. Andreas Schmietendorf 4
Suchalgorithmen 12.01.2012 Prof. Dr. Andreas Schmietendorf 5
Suchalgorithmen Binäre Suche (am Beispiel des Telefonbuches): Grundidee: schrittweise Halbierung der Liste und Suche in den jeweiligen Listenhälften. - Telefonbuch in der Mitte aufschlagen und vergleichen des gesuchten Namens mit den Namen der aufgeschlagenen Seite Gesuchter Name ist zufällig gleich dem gesuchten Namen Suche fertig Gesuchter Name ist entsprechend der alphabetischen Ordnung größer weitere Suche nur noch in der 1. Hälfte des Telefonbuches Gesuchter Name ist entsprechend der alphabetischen Ordnung kleiner weitere Suche nur noch in der 2. Hälfte des Telefonbuches Anzahl benötigter Schritte - 1000 Seiten Umfang nach höchstens 10 Schritten sind wir am Ziel - 2000 Seiten Umfang - nach höchstens 11 Schritten sind wir am Ziel 12.01.2012 Prof. Dr. Andreas Schmietendorf 6
Suchalgorithmen Übung: Implementieren Sie eine Funktion (rekursiv oder iterativ): getsearchbin (int list[], int searchvalue) die für ein gegebenes Feld list[] von Integerwerten den Index des gesuchten Wertes searchvalue zurückliefert. Dabei soll die Funktion das binäre Suchverfahren nutzen. Ist searchvalue in dem Feld nicht enthalten, so liefert die Funktion den Ergebniswert -1. Testen Sie die Funktion mit dem folgenden Feld: final int LENGTH = 10000; int[] test = new int[length]; for (int i=0; i<length; i++){ } test[i] = 2 * i; Erlauben Sie dem Nutzer, verschiedene Suchwerte einzugeben. 12.01.2012 Prof. Dr. Andreas Schmietendorf 7
Suchalgorithmen 12.01.2012 Prof. Dr. Andreas Schmietendorf 8
Hash-Funktionen 12.01.2012 Prof. Dr. Andreas Schmietendorf 9
Suche mittels Hashing Hashing als Erweiterung der schlüsselindizierten Suche: Bei der Nutzung einer Hash-Funktion werden Objekte nicht mehr an einer beliebigen Stelle in einem Feld gespeichert, sondern in Abhängigkeit von bestimmten Objekteigenschaften. Der Index für die Speicherung des Objekts im Feld ergibt sich dann aus dem Objekt selbst. Zweiteiliges Suchen beim Hashing: - Transformieren des Suchschlüssels mithilfe einer Hashfunktion Idealfall Abbildung unterschiedlicher Schlüssel auf unterschiedliche Adressen Ggf. können zwei oder auch mehrere unterschiedliche Schlüssel zur gleichen Adresse führen - Kollisionsbeseitigung mittels verschiedener Strategien 12.01.2012 Prof. Dr. Andreas Schmietendorf 10
Suche mittels Hashing Beispiele für Hash-Funktionen sind: Länge eines Wortes modulo Tabellengröße Summe der char-werte (interpretiert als Integers) eines Wortes modulo Tabellengröße Anfangsbuchstabe eines Wortes Der Modulo-Operator (verbleibender Rest einer ganzzahligen Teilung) wird durch das %-Zeichen realisiert. Bem.: in Java steht die Klasse Hashtable zur Verfügung 12.01.2012 Prof. Dr. Andreas Schmietendorf 11
Suche mittels Hashing Übung: Verwendung von Hashcodes: Verwenden Sie die von Ihnen implementierten verketteten Listen zur Analyse der je Knoten ausgegebenen Hashcodes. - Die Methode int hashcode() ererbt jede Klasse automatisch von der gemeinsamen Basisklasse Object! - Die Methode hashcode() verwendet zur Berechnung des Hashcodes die Speicheradresse des Objekts, überlegen Sie alternative Ansätze. Überlegen Sie sich einen methodischen Ansatz zur Vermeidung mehrdeutiger Hashcodes. Untersuchen Sie die Möglichkeiten der in Java zur Verfügung stehenden Klasse Hashtable und verwenden Sie diese mit Hilfe eines einfachen Beispiels zur Datenspeicherung und Datensuche. 12.01.2012 Prof. Dr. Andreas Schmietendorf 12
Hashing in Java - Beispiel 12.01.2012 Prof. Dr. Andreas Schmietendorf 13
Hashing in Java - Beispiel 12.01.2012 Prof. Dr. Andreas Schmietendorf 14
Sortieralgorithmen 12.01.2012 Prof. Dr. Andreas Schmietendorf 15
Überblick Sortieralgorithmen Sortieralgorithmen werden für die effiziente Speicherung von Informationen und deren Auswertung bzw. Suche benötigt. Grundsätzlich werden unterschieden: - Interne Sortierung Bearbeitung von Listen im Hauptspeicher - Externe Sortierung Bearbeitung von Listen auf ext. Massenspeicher Klassische Sortierverfahren: - Bubble Sort vgl. zu aufsteigenden Blasen - Insert Sort -Sortierung durch Einfügen - Select Sort -Sortierung durch Auswählen Schnelle Sortieralgorithmen (Quick Sort, Merge Sort, Shear Sort, ) 12.01.2012 Prof. Dr. Andreas Schmietendorf 16
Bubble Sort Die Grundidee geht davon aus, dass aufsteigende Blasen ( Bubbles ) sich automatisch sortieren, indem die großen beim Aufsteigen die kleinen überholen. Die eigentliche Sortierung eines Arrays von Datensätzen erfolgt durch wiederholtes Vertauschen von Nachbarfeldern, die in falscher Reihenfolge stehen. Dieser Vorgang wird wiederholt, bis das Array vollständig sortiert ist, wobei das Array von links nach rechts durchwandert wird. 12.01.2012 Prof. Dr. Andreas Schmietendorf 17
Bubble Sort 12.01.2012 Prof. Dr. Andreas Schmietendorf 18
Prinzip Bubble Sort Beispiel für BubbleSort -Visualisierung: 12.01.2012 Prof. Dr. Andreas Schmietendorf 19
Insert Sort Das Grundprinzip des Insert Sort (Sortierung durch Einfügen) besteht darin, ein beliebiges Element der noch nicht sortierten Daten aufzunehmen an der richtigen Stelle (gemäß der Sortierungsanforderung aufsteigend bzw. fallend) einzuordnen. Dem entsprechend ist bei diesem Verfahren zwischen dem sortierten und unsortierten Teil zu unterschieden. 12.01.2012 Prof. Dr. Andreas Schmietendorf 20
Insert Sort 12.01.2012 Prof. Dr. Andreas Schmietendorf 21
Prinzip - Insert Sort 12.01.2012 Prof. Dr. Andreas Schmietendorf 22
Selection Sort Beim Selection Sort wird zwischen einem sortierten und unsortierten Teil (S und U) des Arrays unterschieden. Der zu Beginn unsortierte Teil U wird nach dem kleinsten Element durchsucht. Wird dieses gefunden, erfolgt ein Austausch mit dem jeweils ersten Element des unsortierten Arrays. Bei jedem Durchlauf erfolgt eine Verkleinerung von U bzw. einer Vergrößerung von S um jeweils ein Element. 12.01.2012 Prof. Dr. Andreas Schmietendorf 23
Selection Sort 12.01.2012 Prof. Dr. Andreas Schmietendorf 24
Prinzip Selection Sort Beispiel für BubbleSort -Visualisierung: 4 5 3 1 2 Minimum ist 1 daher Tauschen des 1. und 4. Elements 1 5 3 4 2 Minimum ist 2 daher Tauschen des 2. und 5. Elements 1 2 3 4 5 Minimum ist 3 daher kein Vertauschen richtige Stelle 1 2 3 4 5 Minimum ist 4 daher kein Vertauschen richtige Stelle 1 2 3 4 5 Komplett sortiertes Array Bem.: sortierter Teil unsortierter Teil Tauschoperationen 12.01.2012 Prof. Dr. Andreas Schmietendorf 25
Sortieralgorithmen Übung: Sortieralgorithmen Analysierten Sie die übergebenen Sortieralgorithmen hinsichtlich ihrer Funktionalität bzw. Wirkungsweise. Welche Aufwände entsprechend der O-Notation resultierenden aus den jeweiligen Sortieralgorithmen? Testen Sie die Sortieralgorithmen mit mit konkreten Werten innerhalb einer eigenen Java-Applikation. Optional: Betrachten Sie die Ausführungsgeschwindigkeit der verschiedenen Sortieralgorithmen mit Hilfe des referenzierten Java-Applets (siehe Folie 27) im Internet. 12.01.2012 Prof. Dr. Andreas Schmietendorf 26
Aufwände für Sortieralgorithmen 12.01.2012 Prof. Dr. Andreas Schmietendorf 27
Sortieralgorithmen Aufwände für Sortieralgorithmen: 12.01.2012 Prof. Dr. Andreas Schmietendorf 28
Sortieralgorithmen Quelle: 12.01.2012 Prof. Dr. Andreas Schmietendorf 29
Sortieralgorithmen Shear Sort -Selbsstudium: Bei Shear Sort handelt sich um ein paralleles Sortierverfahren, wobei die zu sortierenden Elemente mit Hilfe einer 2-dimensionalen Matrix angeordnet werden. Das Laufzeitverhalten dieses Algorithmus beträgt O(log n), wobei exakt log n + 1 Schritte benötigt werden. Analysieren Sie die prinzipielle Funktionalität anhand einer beispielhaft zu sortierenden Matrix. Verwenden Sie das übergebene Studienmaterial bzw. weitere selbstständig zu recherchierende Informationen im Internet. 12.01.2012 Prof. Dr. Andreas Schmietendorf 30