Informatik II, SS 2014

Ähnliche Dokumente
Informatik II, SS 2014

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Suchen in Listen und Hashtabellen

4.4.1 Statisches perfektes Hashing. des Bildbereichs {0, 1,..., n 1} der Hashfunktionen und S U, S = m n, eine Menge von Schlüsseln.


Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

Vorlesung Datenstrukturen

Es sei a 2 und b 2a 1. Definition Ein (a, b)-baum ist ein Baum mit folgenden Eigenschaften:

Algorithmen und Datenstrukturen

Untersuchen Sie, inwiefern sich die folgenden Funktionen für die Verwendung als Hashfunktion eignen. Begründen Sie Ihre Antwort.

Algorithmen & Datenstrukturen 1. Klausur

Sortierte Folgen 250

Grundbegriffe der Informatik

Datenstruktur, die viele Operationen dynamischer Mengen unterstützt

Datenstrukturen und Algorithmen

13. Binäre Suchbäume

14. Rot-Schwarz-Bäume

Programmiertechnik II

Advanced Programming in C

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

3. Übung Algorithmen I

Binäre Suchbäume. Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps

34. Algorithmus der Woche Hashing

6-1 A. Schwill Grundlagen der Programmierung II SS 2005

Name: Seite 2. Beantworten Sie die Fragen in den Aufgaben 1 und 2 mit einer kurzen, prägnanten Antwort.

1. Einführung. Was ist ein Algorithmus (eine Datenstruktur)? Welche Probleme kann man damit lösen? Warum betrachten wir (effiziente) Algorithmen?

Algorithmen und Datenstrukturen Suchbaum

Einführung in die Informatik 2

Inhaltsverzeichnis. Einführende Bemerkungen 11. Das Fach Informatik 11 Zielsetzung der Vorlesung Grundbegriffe

Informatik II Musterlösung

In vergleichsbasierten Suchbäumen wird nicht in Schlüssel hineingeschaut.

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v)

JAVA KURS COLLECTION

Werkzeuge zur Programmentwicklung

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Über Arrays und verkettete Listen Listen in Delphi

Übungen zu Programmierung I - Blatt 8

Algorithmen und Datenstrukturen (für ET/IT)

Suchen und Sortieren Sortieren. Heaps

Algorithmen und Datenstrukturen

Kapitel 2: Analyse der Laufzeit von Algorithmen Gliederung

Geordnete Binärbäume

Algorithmen und Datenstrukturen

Erinnerung VL

Algorithmen und Datenstrukturen

Abschnitt: Algorithmendesign und Laufzeitanalyse

Informatik II. PVK Part1 Severin Wischmann n.ethz.ch/~wiseveri

Beispiellösungen zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 6

Tutoraufgabe 1 (2 3 4 Bäume):

Algorithmen & Datenstrukturen Lösungen zu Blatt 9 HS 16

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Bäume, Suchbäume und Hash-Tabellen

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

Übersicht. Schleifen. Schleifeninvarianten. Referenztypen, Wrapperklassen und API. 9. November 2009 CoMa I WS 08/09 1/15

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 14

Wirtschaftsinformatik I

Teil 2 - Softwaretechnik. Modul: Programmierung B-PRG Grundlagen der Programmierung 1 Teil 2. Übersicht. Softwaretechnik

AVL-Bäume Analyse. Theorem Ein AVL-Baum der Höhe h besitzt zwischen F h und 2 h 1 viele Knoten. Definition Wir definieren die nte Fibonaccizahl:

Übersicht Datenstrukturen und Algorithmen. Literatur. Algorithmus: Wikipedia Definition. Vorlesung 1: Einführung. Prof. Dr.

Java Einführung Collections

Algorithmen II Vorlesung am

Bäume. Text. Prof. Dr. Margarita Esponda SS 2012 O4 O5 O6 O ALP2-Vorlesung, M. Esponda

Algorithmentheorie Randomisierung. Robert Elsässer

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g:

Datenstrukturen und Algorithmen

Alle bislang betrachteten Sortieralgorithmen hatten (worst-case) Laufzeit Ω(nlog(n)).

Klausur Datenstrukturen und Algorithmen SoSe 2012

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

Variablen - %Hashes Was ist ein Hash? 'Assoziative Arrays'

Algorithmen und Datenstrukturen

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

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Theoretische Informatik 1 WS 2007/2008. Prof. Dr. Rainer Lütticke

Klausur Algorithmen und Datenstrukturen

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Programmierkurs Java

Vorlesung : Binäre Entscheidungsdiagramme (BDDs) Dr. Carsten Sinz

MySQL-Befehle. In diesem Tutorial möchte ich eine kurze Übersicht der wichtigsten Befehle von MySQL geben.

Hochschule Niederrhein Einführung in die Programmierung Prof. Dr. Nitsche. Bachelor Informatik WS 2015/16 Blatt 3 Beispiellösung.

Datenstrukturen & Algorithmen

Die mittlere Zeit zum Auffinden eines Elements in einer Hash-Tabelle beträgt, unter realistischen Annahmen, O(1).

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Programmiertechnik II

! DBMS organisiert die Daten so, dass minimal viele Plattenzugriffe nötig sind.

Ein Algorithmus heißt rekursiv, wenn er sich selbst aufruft. Meist werden nur einzelne Module eines Gesamtalgorithmus rekursiv verwendet.

Access 2010 Programmierung Schleifen

Klausur Informatik B April Teil I: Informatik 3

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 2

Der Datentyp String. Stringvariable und -vergleiche

Transkript:

Informatik II SS 2014 (Algorithmen & Datenstrukturen) Vorlesung 7 (21.5.2014) Binäre Suche, Hashtabellen I Algorithmen und Komplexität

Abstrakte Datentypen : Dictionary Dictionary: (auch: Maps, assoziative Arrays, Symbol Table) Verwaltet eine Kollektion von Elementen, wo bei jedes Element durch einen eindeutigen Schlüssel (key) repräsentiert wird Operationen: create : erzeugt einen leeren Dictionary D.insert(key, value) : fügt neues (key,value) Paar hinzu falls schon ein Eintrag für key besteht, wird er ersetzt D.find(key) : gibt Eintrag zu Schlüssel key zurück falls ein Eintrag vorhanden (gibt sonst einen Default Wert zurück) D.delete(key) : löscht Eintrag zu Schlüssel key 2

Dictionary Wir kümmern uns in einer ersten Phase nur um die Basisoperationen insert, find, delete (und create) Dictionary Beispiele: Wörterbuch (key: Wort, value: Definition / Übersetzung) Telefonbuch (key: Name, value: Telefonnummer) DNS Server (key: URL, value: IP Adresse) Python Interpreter (key: Variablenname, value: Wert der Variable) Java/C++ Compiler (key: Variablenname, value: Typinformation) In all diesen Fällen ist insbesondere eine schnelle find Op. wichig! 3

Verkettete Listen: Struktur Einfach verkettete Liste (SinglyLinkedList): 31 14 10 6 next next next next null first Doppelt verkettete Liste (DoublyLinkedList): 31 14 10 6 null next prev next prev next prev next prev null first last 4

Dictionary mit verketteten Listen Operationen: create: lege neue leere Liste an D.insert(key, value): füge neues Element vorne ein Annahme: Es gibt noch keinen Eintrag mit dem Schlüssel key D.find(key): gehe von vorne durch die Liste D.delete(key): suche zuerst das Listenelement (wie in find) lösche Element dann aus der Liste Bei einfach verketten Listen muss man stoppen, sobald current.next.key == key ist! 5

Dictionary mit verketteten Listen Laufzeiten: create: insert: find: delete: Ist das gut? 6

Dictionary mit Array Operationen: create: lege neues Array der Länge NMAX an D.insert(key, value): füge neues Element hinten an (falls es noch Platz hat) Annahme: Es gibt noch keinen Eintrag mit dem Schlüssel key D.find(key): gehe von vorne (oder hinten) durch die Elemente D.delete(key): suche zuerst nach dem key lösche Element dann aus dem Array: Man muss alles dahinter um eins nach vorne schieben! 7

Dictionary mit Array Laufzeiten: create: insert: find: delete: Bessere Ideen? 8

Benutze sortiertes Array? Teure Operation bei Liste/Array, insbesondere find Falls (sobald) sich die Einträge nicht zu sehr ändern, ist find die wichtigste Operation! Kann man in einem (nach Schlüsseln) sortierten Array schneller nach einem bestimmten Schlüssel suchen? Ideen: Beispiel: Suche Tel. Nr. einer Person im Telefonbuch 9

Binäre Suche Benutze Divide and Conquer Idee! Suche nach der Zahl (dem Key) 19: 2 3 4 6 9 12 15 16 17 18 19 20 24 27 29 10

Binäre Suche 2 3 4 6 9 12 15 16 17 18 19 20 24 27 29 Algorithmus (Array der Länge, Suche nach Schlüssel ): 11

Binäre Suche 2 3 4 6 9 12 15 16 17 18 19 20 24 27 29 Algorithmus (Array der Länge, Suche nach Schlüssel ): l = 0; r = n 1; while r > l do m = (l + r) / 2; if A[m] < x then l = m + 1 else if A[m] > x then r = m 1 else l = m; r = m Falls Schlüssel im Array ist, dann gilt am Schluss 12

Ist der Algorithmus korrekt? Wie überprüft man das? Empirisch: Unit Test oder auch systematischere Tests Formal? Korrektheit ist (meistens) noch wichtiger als Performance! Vorbedingung Bedingung, welche am Anfang (der Methode / Schleife / ) gilt Nachbedingung Bedingung, welche am Schluss (der Methode / Schleife / ) gilt Schleifeninvariante Bedingung welche am Anfang / Ende jedes Schleifendurchlaufs gilt 13

Ist der Algorithmus korrekt? l = 0; r = n 1; while r > l do m = (l + r) / 2; if A[m] < x then l = m + 1 else if A[m] > x then r = m 1 else l = m; r = m Vorbedingung Array ist am Anfang sortiert, Array hat Länge Nachbedingung Falls im Array ist, dann gilt Schleifeninvariante Falls im Array ist, dann gilt 14

Ist der Algorithmus korrekt? Vorbedingung Array ist am Anfang sortiert, Array hat Länge l = 0; r = n 1; Schleifeninvariante Falls im Array ist, dann gilt Vorbedingung und Zuweisung zu und Schleifeninvariante Invariante gilt am Anfang des ersten Schleifendurchlaufs Nachbedingung Falls im Array ist, dann gilt Abbruchbedingung while Schleife und damit Falls im Array ist, dann folgt aus der Schleifeninvariante und da sortiert ist, dass und damit 15

Ist der Algorithmus korrekt? l = 0; r = n 1; while r > l do m = (l + r) / 2; if A[m] < x then l = m + 1 else if A[m] > x then r = m 1 else l = m; r = m Schleifeninvariante Falls im Array ist, dann gilt 16

Terminiert der Algorithmus? l = 0; r = n 1; while r > l do m = (l + r) / 2; if A[m] < x then l = m + 1 else if A[m] > x then r = m 1 else l = m; r = m Veränderung der Anz. Elemente ( 1) pro Schleifendurchlauf? 1: 1: 1 1 2 1 2 1 1 2 1 1 2 1 1 2 Sonst wird gefunden und 1wird 1 1 2 17

Laufzeit Terminiert der Algorithmus? In jedem Schleifendurchlauf wird die Anzahl der Elemente mindestens halbiert. Der Algorithmus terminiert! Laufzeit? 2, 1 18

Laufzeit Binäre Suche Der Algorithmus terminiert in Zeit log. 19

Dictionary mit sortiertem Array Operationen: create: lege neues Array der Länge NMAX an D.find(key): Suche nach key mit binärer Suche D.insert(key, value): suche nach key und füge neues Element an der richtigen Stelle ein Einfügen: alles dahinter muss um eins nach hinten geschoben werden! D.delete(key): suche zuerst nach dem key und lösche den Eintrag Löschen: alles dahinter muss um eins nach vorne geschoben werden! 20

Dictionary mit sortiertem Array Laufzeiten: create: insert: find: delete: Können wir alle Operationen schnell machen? und das find noch schneller? 21

Direkte Adressierung Mit einem Array können alles schnell machen,...falls das Array gross genug ist. Annahme: Schlüssel sind ganze Zahlen zwischen 0 und 1 1 null 2 null 3 Value 1 4 null 5 Value null 2 6 null 7 Sebastian null find(3) Value 1 insert(7, Sebastian ) delete(5) 8 Value 3 9 null null 22

Direkte Adressierung : Probleme 1. Direkte Adressierung benötigt zu viel Platz! Falls Schlüssel ein beliebiger int (32 bit) sein kann: Wir benötigen ein Array der Grösse 2 4 10. Bei 64 bit Integers sind s sogar schon mehr als 10 2. Was tun, wenn die Schlüssel keine ganzen Zahlen sind? Wo kommt das (key,value) Paar ( Sebastian, Assistent )hin? Wo soll der Schlüssel 3.14159 gespeichert werden? Pythagoras: Alles ist Zahl Alles kann als Folge von Bits abgespeichert werden: Interpretiere Bit Folge als ganze Zahl Verschärft das Platz Problem noch zusätzlich! 23

Hashing : Idee Problem Riesiger Raum an möglichen Schlüsseln Anzahl der wirklich benutzten Schlüssel ist viel kleiner Wir möchten nur Arrays der Grösse (resp. ) verwenden Wie können wir Schlüssel auf Array Positionen abbilden? mögliche Schlüssel zufällige Abbildung Schlüssel 24

Hashfunktionen Schlüsselraum, (alle möglichen Schlüssel) Arraygrösse ( Anz. Schlüssel, welche wir max. speichern wollen) Hashfunktion :,, Bildet Schlüssel vom Schlüsselraum in Arraypositionen ab sollte möglichst nahe bei einer zufälligen Funktion sein alle Elemente in 0,, 1 etwa gleich vielen Schlüsseln zugewiesen sein ähnliche Schlüssel sollten auf verschiedene Positionen abgebildet sollte möglichst schnell berechnet werden können Wenn möglich in Zeit 1 Wir betrachten es im folgenden als Grundoperation (Kosten = 1) 25

Funktionsweise Hashtabellen 1. insert(, ) 2. insert(, ) 3. insert(, ) Kollision! Hashtabelle 1 null 2 null 4 3 null 4 null 5 null 6 null 7 null 8 null 9 null null 26

Hashtabellen : Kollisionen Kollision: Zwei Schlüssel, kollidieren, falls. Was tun bei einer Kollision? Können wir Hashfunktionen wählen, bei welchen es keine Kollisionen gibt? Eine andere Hashfunktion nehmen? Weitere Ideen? 27

Hashtabellen : Kollisionen Kollisionen Lösungsansätze Annahme: Schlüssel und kollidieren 1. Speichere beide (key,value) Paare an die gleiche Stelle Die Hashtabelle muss an jeder Position Platz für mehrere Elemente bieten Wir wollen die Hashtabelle aber nicht einfach vergrössern (dann könnten wir gleich mit einer grösseren Tabelle starten ) Lösung: Verwende verkettete Listen 2. Speichere zweiten Schlüssel an eine andere Stelle Kann man zum Beispiel mit einer zweiten Hashfunktion erreichen Problem: An der alternativen Stelle könnte wieder eine Kollision auftreten Es gibt mehrere Lösungen Eine Lösung: Verwende viele mögliche neue Stellen (Man sollte sicherstellen, dass man die meistens nicht braucht ) 28

Hashtabellen mit Chaining Jede Stelle in der Hashtabelle zeigt auf eine verkette Liste Hashtabelle 1 null 2 null 3 null 4 5 null 6 null 7 null 8 9 null null Platzverbrauch: Tabellengrösse, Anz. Elemente 29

Laufzeit Hashtabellen Operationen Zuerst, um s einfach zu machen, für den Fall ohne Kollisionen create: insert: find: delete: Solange keine Kollisionen auftreten, sind Hashtabellen extrem schnell (falls die Hashfunktion schnell ausgewertet werden kann) Wir werden sehen, dass dies auch mit Kollisionen gilt 30

Laufzeit mit Chaining Verkettete Listen an allen Positionen der Hashtabelle create: insert: find: delete: 31

Funktionsweise Hashtabellen Schlechtester Fall bei Hashing mitchaining Alle Schlüssel, welche vorkommen, haben den gleichen Hashwert Ergibt eine verkettete Liste der Länge Hashtabelle Wahrscheinlichkeit bei zufälligem : 4 1 null 2 null 3 null 4 5 null 6 null 7 null 8 null 9 null null 32