Suchen. lineare Suche, binäre Suche, divide and conquer, rekursive und iterative Algorithmen, geordnete Daten, Comparable

Ähnliche Dokumente
Institut für Informatik

3. Suchen. Das Suchproblem. Suche in Array. Lineare Suche. 1 n. i = n Gegeben Menge von Datensätzen.

Kapitel 10. Komplexität von Algorithmen und Sortieralgorithmen

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Abschnitt 19: Sortierverfahren

Programmieren I. Kapitel 7. Sortieren und Suchen

Das Suchproblem. Gegeben Menge von Datensätzen. Beispiele Telefonverzeichnis, Wörterbuch, Symboltabelle

Das Suchproblem 4. Suchen Das Auswahlproblem Suche in Array

Einführung in die Informatik 2

1. Aufgabe (6 Punkte): Java-Programmierung (Arrays)

Das Suchproblem 4. Suchen Das Auswahlproblem Suche in Array

Das Suchproblem. Gegeben Menge von Datensätzen. Beispiele Telefonverzeichnis, Wörterbuch, Symboltabelle

Grundlagen der Programmierung

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Erste Java-Programme (Arrays und Schleifen)

Einführung in die Programmierung für NF. Arrays

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Ordnung im Materiallager: Datenstrukturen II. Suchen und Sortieren im Array Verkettete Listen Rekursion

Institut für Informatik

Physikalisch Technische Lehranstalt Wedel 31. Januar 2004 Prof. Dr. Uwe Schmidt

Algorithmen und Datenstrukturen 12

QuickSort ist ein Sortieralgorithmus, der auf der Idee des Teile & Beherrsche beruht, und das gegebene Array an Ort und Stelle (in place) sortiert

Die Schnittstelle Comparable

Reihungen. Prof. Dr. Christian Böhm. In Zusammenarbeit mit Gefei Zhang. WS 07/08

9. Rekursion. 1 falls n 1 n (n 1)!, andernfalls. Experiment: Die Türme von Hanoi. Links Mitte Rechts. Mathematische Rekursion

Listen. M. Jakob. Gymnasium Pegnitz. 20. September Hinführung: Wartenschlangen. Grundprinzip von Listen Rekursion

Reihungen. Martin Wirsing. in Zusammenarbeit mit Michael Barth, Fabian Birzele und Gefei Zhang

Algorithmen und Datenstrukturen 12

Einführung in die Informatik 1

Probeklausur zur Vorlesung

Listen. M. Jakob. 20. September Gymnasium Pegnitz

Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. B6.1 Einführung. B6.2 Symboltabellen. B6.3 Einfache Implementationen

12 Abstrakte Klassen, finale Klassen und Interfaces

Interne Sortierverfahren

Übung Algorithmen und Datenstrukturen

Die abstrakte Klasse Expression:

Informatik II Übung 10. Pascal Schärli

Heute. Nachbetrachtung Wissensüberprüfung. Sortieren Interface Comparable TreeSet Sortieren von Arrays: Arrays.sort() 3.12.

Algorithmen und Datenstrukturen 11

Einführung in die Programmierung für NF MI. Übung 04

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II a[0] a[1] a[2] a[3] a[n 1]

OCP Java SE 8. Collections

Fachhochschule Wedel 31. Januar 2004 Prof. Dr. Uwe Schmidt

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Erste Java-Programme (Scopes und Rekursion)

4.2 Daten und Datenstrukturen

Organisatorisches. Folien (u.a.) gibt's auf der Lva-Homepage zum Download

Organisatorisches. Folien (u.a.) auf der Lva-Homepage Skriptum über MU Online

1 Abstrakte Klassen, finale Klassen und Interfaces

Suchen und Sortieren

G. Zachmann Clausthal University, Germany

Heapsort. 1. Erstelle aus dem gegebenen Array einen Max-Heap (DownHeap) 2. Tausche erstes und letztes Element des Arrays

public class Test extends MiniJava { public static void main (String [] args) { write(args[0]+args[1]); } } // end of class Test

IT I: Heute. Klasse Object. equals, hashcode, tostring. HashSet IT I - VO 6 1

Ein sortiertes Feld kann in O(log n) durchsucht werden, z.b. mit Binärsuche. Der Algorithmus 1 gibt den Pseudocode der binären Suche an.

Informatik II Übung 8

Aufgabe11. Methode test1. import java.util.hashmap; import java.util.arraylist; public class Aufgabe11 {

Rechtsbelehrung. Java und OOP Das Buch Christian Silberbauer 144

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Suchen. Lineare Suche. Such-Algorithmen. Sommersemester Dr.

Suchen und Sortieren

ÜBUNGS-BLOCK 7 LÖSUNGEN

Kapitel 12: Induktive

Einführung in die Programmierung

Abschnitt 17: Beispiel: Die Klasse String (Teil 2), das Interface Comparable<T>

Android will doch nur spielen. Java Vertiefung und Übung

JAVA - Suchen - Sortieren

Teil VII. Hashverfahren

Algorithms & Data Structures 2

Algorithmen und Datenstrukturen. Übersicht. Interfaces und Generics. InsertionSort für Punkte. InsertionSort für Punkte

Kapitel 4: Bäume i. 1. Einleitung. 2. Ein Datenmodell für Listen. 3. Doppelt-verkettete Listen. 4. Bäume. 5. Das Collections-Framework in Java

Counting - Sort [ [ ] [ [ ] 1. SS 2008 Datenstrukturen und Algorithmen Sortieren in linearer Zeit

Institut für Programmierung und Reaktive Systeme 24. April Programmieren II. 10. Übungsblatt

Übungsserie Nr. 6. Ausgabe: 1. April 2015 Abgabe: 15. April Hinweise

Übung: Algorithmen und Datenstrukturen SS 2007

Informatik II. Übungsstunde 6. Distributed Systems Group, ETH Zürich

Informatik II, SS 2014

Gliederung. 5. Compiler. 6. Sortieren und Suchen. 7. Graphen

Programmierstarthilfe SS 2008 Fakultät für Ingenieurwissenschaften und Informatik 10. Blatt Für den und

Schnelle Multiplikation

Übersicht. Datenstrukturen und Algorithmen. Divide-and-Conquer. Übersicht. Vorlesung 9: Quicksort (K7)

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Abschnitt 10: Datenstrukturen

Kopieren und Vergleichen

IT I: Heute. Klasse Object. equals, hashcode, tostring. HashSet IT I - VO 6 1

Datenstrukturen und Algorithmen. Vorlesung 5

Abschlussklausur Lösung. Bitte in Druckschrift leserlich ausfüllen!

Programmieren 2 Java Überblick

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Java Zusammenfassung. Basisdatentypen ganzzahlig: Byte, Short, Integer, Long Fließkomma: Float, Double Zeichen: Character Wahrheitswerte: Boolean

8 Anwendung: Suchen. Folge a ganzer Zahlen; Element x. Wo kommt x in a vor?

1. Teilklausur. Name:... Vorname:... Matrikel-Nummer:...

Objekttypen. Referenzen, Objekte, Gleichheit, Wrapper, Arrays, mehr-dimensionale Arrays, Bildbearbeitung, krumme Arrays

Tutoraufgabe 1 (Programmanalyse):

Abgabe: (vor der Vorlesung) Aufgabe 3.1 (P) Master-Theorem

Einführung in die Informatik 1

s(x, i) = i h 2 (x), i N 0

Transkript:

Suchen lineare Suche, binäre Suche, divide and conquer, rekursive und iterative Algorithmen, geordnete Daten, Comparable

Welche Nummer hat Herr Meier? Enthält Einträge (Elemente) der Form : Name, Vorname Adresse Tel.Nummer - geordnet nach Name, Telefonbuch Marburg - bei Gleichheit nach Vorname Name und Vorname sind Schlüssel Wenn wir Namen und Vornamen wissen, finden wir den Eintrag von Herrn Meier sehr schnell. Wir schlagen das Telefonbuch etwa in der MItte auf Dann entscheiden wir uns, ob wir in der linken oder in der rechten Hälfte weitersuchen Binäre Suche

Welche Nummer hat Herr Huber? Das Münchner Telefonbuch ist 10-mal so dick wie das Marburger. Brauchen wir 10-mal so lang, einen Teilnehmer aufzusuchen? Nein, wir brauchen nur unwesentlich länger genau genommen brauchen wir im Schnitt nur 3-4 mehr Namen zu lesen und mit dem gesuchten zu vergleichen. Binäre Suche ist sehr effizient

Wer hat die Nummer 1 32 13? Die Information ist auch im Telefonbuch, ist aber nur schwer aufzufinden. Einzige Möglichkeit : Telefonbuch Marburg Lineare Suche Im Telefonbuch von München dauert die Suche 10 mal so lange Der Aufwand für lineare Suche ist proportional der Anzahl N der Einträge Der Aufwand für binäre Suche ist proportional log 2 N, dem binären Logarithmus von N

Divide et Impera Teile und Herrsche divide and conquer Zerlege das Problem in kleinere Probleme löse die kleinen Probleme aus den Lösungen erzeuge Lösung des ursprünglichen Problems Wenn dieses Prinzip anwendbar ist, erhält man effiziente Algorithmen Beim Suchen des Teilnehmers mit Nummer 13213 können wir es nicht anwenden Beim Suchen nach Namen im Telefonbuch ist es anwendbar.

Infrastruktur Für lineare Suche muss man die Einträge nur irgendwie aufzählen können lineare Suche für (fast) alle Behälter möglich Für binäre Suche müssen die Daten geordnet sein direkter Zugriff auf einen mittleren Eintrag möglich sein Divide: Behälter muss sich in zwei analoge Behälter (logisch) zerlegen lassen z.b.: das Telefonbuch München von A K, das Telefonbuch München von L Z. Die Entscheidung, in welchem der beiden Teil-Behälter sich der gesuchte Eintrag befindet geht schnell - unabhängig von der Größe des Behälters Binäre Suche benötigt Infrastruktur : geordnete Daten wahlfreier direkter Zugriff

Ergebnisse von Suchalgorithmen Wenn ein gesuchtes Element gefunden wird kann das Ergebnis sein: true ja, das Element ist vorhanden das Element selber der Index (der Ort) wo das gesuchte Element gespeichert ist Wenn mehrere Elemente mit den Suchkriterien gefunden werden die Anzahl das erste Element alle Elemente Wenn kein Element den Suchkriterien genügt eine Ausnahme ein Ersatzelement (dummy, sentinel), das anzeigt, dass kein richtiges Element vorhanden ist -1 als Indexwert Object null double inf (infinity) double NaN (not a number) Kein Eintrag mit Nummer 13213 eine Fehlermeldung

Lineare Suche im Array Behältertyp: int [ ] Suchkriterium durch boolesche Methode Am Ende der Schleife zwei Möglichkeiten Gefunden an Position i Rückgabe i Nicht gefunden, Rückgabe -1

Suche mit Exception Am Ende der Schleife die Möglichkeiten: Gefunden an Position i Rückgabe i Nicht gefunden, Exception

Testen in BlueJ Rechte Maustaste auf Klassensymbol liefert statische Methode linsearch im Kontextmenü Eingabe eines Behälters als Parameter: {1,13,19,25, 44} SuchAlgorithmen.beispielArray {1, 10, 100, 1000} { } Für die nächsten Aufrufe hat sich Bluej diese Eingabe gemerkt Sie werden im Menü serviert

Verwandte der Suchalgorithmen Analog zum Suchen verlaufen boolean exists() Gibt es ein Element, das das Suchkriterium erfüllt, oder nicht? int count() Anzahl der Elemente, die das Kriterium erfüllen int[ ] filter() Erstelle Liste aller Elemente, die das Kriterium erfüllen All diese Algorithmen verlaufen analog zum Suchalgorithmus count benötigt, um Array-Größe festzulegen

Suche in Intervallen Rekursive Suchalgorithmen... zerlegen den Array in Teile (Abschnitte/Intervalle) suchen (rekursiv) in den einzelnen Abschnitten Die Teilprobleme verlangen Suche in einem Intervall des Arrays zwischen zwei Indexwerten lo und hi Wir schreiben a [lo.. hi] für den Bereich (engl.: slice) des Arrays von lo bis hi. Daher verallgemeinern wir den Suchalgorithmus, so dass er in einem beliebigen Intervall eines Arrays suchen kann jetzt sind die Teile (divide) von der gleichen Art wie der ursprüngliche Behälter daher funktioniert divide et impera a [lo.. hi] Vorsicht: das ist keine Java-Notation 0 lo hi a.length-1 a[0.. length-1]

Binäre Suche binsearch : wähle einen mittleren Index i falls gesuchtes Element s = a[i]? fertig < a[i] suche im vorderen Teil > a[i] suche im hinteren Teil Implementierung Verallgemeinerung: Suche im Intervall a[lo..hi] Hilfsfunktion auxbinsearchrec Intervall leer? Bestimme (ungefähre) Mitte des Intervalls Element s gefunden? links von der Mitte? sonst: rechts der Mitte < a[mitte] > a[mitte] a[mitte] lo mitte-1 mitte mitte+1 hi

binsearch iterativ -oder: Wie fängt man einen Tiger Suche in a[lo..hi] Schiebe lo und hi zusammen, bis das Element gefangen ist Element in der Mitte gefunden? Gebe Index zurück Sonst: Links von der Mitte Schiebe hi nach unten Rechts von der Mitte Schiebe lo nach oben < a[mid] a[mid] > a[mid] lo mid-1 mid mid+1 hi

Der Schlüssel zu Frau Meier Meist sucht man komplexere Objekte als Zahlen Ein Telefonbucheintrag besteht aus Name, Vorname, Adresse, Telefonnummer Geordnet ist das Telefonbuch aber nur nach Name, und Vorname (falls Namen gleich) Diese Kombination ist der Such-Schlüssel Meier Meier Brigitte Brigitte 0 85 8546 4625 251 25 25 Am Am Kirchenfeld 15, 15, 94113 94113 Tiefenbach Ein Schlüssel soll einen Datensatz möglichst eindeutig bestimmen eine Ordnung tragen Die Daten werden nach Schlüsseln geordnet und aufgesucht.

Vergleich Binäre Suche erfordert eine Sortierung der Daten ein direkter Zugriff auf ein mittleres Element Sortierung erfordert, zwei Datenelemente muss man vergleichen können ersatzweise Schlüsselvergleich Vereinbarung Daten implementieren Funktion kleinergleich Sortieralgorithmus verwendet zum Vergleich die Funktion kleinergleich In Java Schreibe interface Ordnung verlangt boolesche Methode kleinergleich Klasse der Datenelemente implements Ordnung ein Sortierprogramm funktioniert mit jeder Klasse, die Ordnung implementiert

Comparable Interface Comparable im Java-API spezifiziert Methode int compareto(object o) Viele Java-Klassen implementieren dieses Interface, u.a. String, Integer, Float, Character, Date, Dabei gilt immer: x.compareto(y) = < 0,, falls falls x < y 0,, falls falls x.equals(y) > 0,, falls falls x > y Java Methoden, die mit Comparable arbeiten, erwarten dieses Verhalten. Manchmal beschränkt man sich auf die Werte -1, 0, +1, Ansonsten gibt Comparable auch noch eine Art Differenz bei Integer: x.compareto(y) = x- y Bei Strings: siehe API und Beispiel Leider kann man das geforderte Wohlverhalten einer Implementierung in Java nicht erzwingen.

Beispiel einer Implementierung Eintrag als Klasse mit einer Ordnung Schlüssel: name + + vorname compareto erwartet ein Object Wir casten es zuerst zu einem Eintrag Hier benutzen wir die compareto- Methode der Klasse String

Vorteile Eintrag implementiert Comparable Auf Eintrag[ ] sind Suchund Sortiermethoden aus java.util.arrays anwendbar

Binäre Suche - selbstgestrickt Allgemeine binäre Suche funktioniert für alle Objekttypen, die das Interface Comparable implementieren wie z.b. mit Einträgen in einem Telefonbuch Adressen a.compareto(b): < 0 steht für a b == 0 für a == b > 0 für a b. Rückgabewert: Index, an dem das Element gefunden wurde, oder -1, falls nicht vorhanden