ALP I. Funktionale Programmierung

Ähnliche Dokumente
Funktionale Programmierung mit Haskell

Funktionale Programmierung ALP I. Funktionen höherer Ordnung. Teil 2 SS Prof. Dr. Margarita Esponda. Prof. Dr.

Was bisher geschah Funktionale Programmierung in Haskell: Algebraische Datentypen Pattern Matching Polymorphie Typklassen Rekursive Datentypen:

Programmieren I. Kapitel 7. Sortieren und Suchen

Algorithmen & Datenstrukturen 1. Klausur

Programmieren in Haskell Einführung

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

Algorithmen und Datenstrukturen

Abschnitt: Algorithmendesign und Laufzeitanalyse

Kapitel 6: Graphalgorithmen Gliederung

Sortierverfahren. Sortierverfahren für eindimensionale Arrays

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

Grundlagen der Programmierung 2. Bäume

Nachtrag zu binären Suchbäumen

Codes und Informationsgehalt

Objektorientierte Programmierung

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Professionelle Seminare im Bereich MS-Office

1 topologisches Sortieren

Sortierverfahren für Felder (Listen)

Programmierkurs Java

1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert

Lernziele: Ausgleichstechniken für binäre Bäume verstehen und einsetzen können.

Funktionale Programmierung ALP I. Funktionen höherer Ordnung SS Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

Einführung in die Programmierung

Prof. Dr. Margarita Esponda

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

Kurs 1613 Einführung in die imperative Programmierung

Sortieralgorithmen. Inhalt: InsertionSort BubbleSort QuickSort. Marco Block

Installation des Add-Ins für Lineare Algebra in Microsoft Excel

[10] Software Transactional Memory in Haskell, Tortenwurf und Aufgabenblatt 7

Modellierung und Programmierung 1

Simplex-Umformung für Dummies

Spam filtern mit dem Webmail-Interface

Diana Lange. Generative Gestaltung Operatoren

Wirtschaftsinformatik I

Grundlagen der Informatik

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

1) Farbsteuergerät in der Nikobus-Software unter Modul zufügen hinzufügen.

Bitte wenden. Name: KURSARBEIT NR. 4 (10 DIFF GA) Seite 1

Pädagogische Hochschule Thurgau. Lehre Weiterbildung Forschung

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

Erfahrungen mit Hartz IV- Empfängern

Was ich als Bürgermeister für Lübbecke tun möchte

Datenexport aus JS - Software

Mit dem Tool Stundenverwaltung von Hanno Kniebel erhalten Sie die Möglichkeit zur effizienten Verwaltung von Montagezeiten Ihrer Mitarbeiter.

Programmieren Lernen mit BYOB. Gerald Futschek 5. November 2012

Typdeklarationen. Es gibt in Haskell bereits primitive Typen:

1. Teilklausur. Modul "OOPM Vorlesung/Übung" Gruppe A

Ein + vor dem Ordnernamen zeigt an, dass der Ordner weitere Unterordner enthält. Diese lassen sich mit einem Klick (linke Maustaste) anzeigen.

Algorithmen und Datenstrukturen I

Angebot. UVV-Prüfungen und Wartungen von mobilen Abfallpressen

Feiertage in Marvin hinterlegen

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

Referenzen Typo3. Blog der Internetagentur Irma Berscheid-Kimeridze Stand: Juni 2015

Universität Zürich Informatikdienste. SpamAssassin. Spam Assassin Go Koordinatorenmeeting 27. April

Programmieren in C. Rekursive Funktionen. Prof. Dr. Nikolaus Wulff

Funktionale Programmierung

Fragen für die Klausuren

Prof. Dr. Margarita Esponda

Agile Vorgehensmodelle in der Softwareentwicklung: Scrum

Teile und Herrsche Teil 2

Christian Zahn. Perspektive der Krankenversicherung. bei der Präsentation des Sonderpostwertzeichens. 100 Jahre Reichsversicherungsordnung

Vorkurs Informatik WiSe 15/16

Schnellanleitung: Verbuchung von Studien- und Prüfungsleistungen

1. Weniger Steuern zahlen

Technische Analyse der Zukunft

Übungen Programmieren 1 Felix Rohrer. Übungen

Client-Server-Beziehungen

BEISPIELKLAUSUR Softwareentwicklung:

1 Vom Problem zum Programm

Scala kann auch faul sein

ZfP-Sonderpreis der DGZfP beim Regionalwettbewerb Jugend forscht BREMERHAVEN. Der Zauberwürfel-Roboter. Paul Giese. Schule: Wilhelm-Raabe-Schule

.procmailrc HOWTO. zur Mailfilterung und Verteilung. Stand:

Datenstrukturen & Algorithmen

Whitebox-Tests: Allgemeines

Frühstück. Frühstück an Werktagen? Es frühstücken an einem normalen Werktag üblicherweise. jeden Tag ab und zu gar nicht *) % % %

Dokumentenverwaltung im Internet

Theoretische Grundlagen der Informatik

ANWENDUNG DES WIENER STADTWERKE-LOGOS

Datentypen: Enum, Array, Struct, Union

Angebot. UVV-Prüfungen und Wartungen von mobilen Abfallpressen

Einführung in die Programmierung Laborübung bei Korcan Y. Kirkici. 12.Übung bis

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

1. Motivation / Grundlagen 2. Sortierverfahren 3. Elementare Datenstrukturen / Anwendungen 4. Bäume / Graphen 5. Hashing 6. Algorithmische Geometrie

Benutzerhandbuch - Elterliche Kontrolle

Übung - Datenmigration in Windows XP

Die Invaliden-Versicherung ändert sich

Name:... Vorname:... Matrikel-Nr.:... Unterschrift:...

Binäre Bäume Darstellung und Traversierung

Programmierparadigmen. Programmierparadigmen. Imperatives vs. objektorientiertes Programmieren. Programmierparadigmen. Agenda für heute, 4.

Local Control Network

Überblick. Lineares Suchen

Kostenmaße. F3 03/04 p.188/395

Simulation LIF5000. Abbildung 1

Dokumentation für das Spiel Pong

Übersicht. Datenstrukturen und Algorithmen Vorlesung 5: Rekursionsgleichungen (K4) Übersicht. Binäre Suche. Joost-Pieter Katoen. 20.

Transkript:

ALP I Funktionale Programmierung Sortieren und Suchen (Teil 1) WS 2012/2013

Suchen 8 False unsortiert 21 4 16 7 19 11 12 7 1 5 27 3 8 False sortiert 2 4 6 7 9 11 12 18 21 24 27 36

Suchen in unsortierten Listen search :: Integer -> [Integer] -> Bool search b [] = False search b (a:xs) (a/=b) = search b xs otherwise = True >>> search3 2 (take 1000000 [1,3..]) False (1.51 secs, 68699880 bytes) search :: Integer -> [Integer] -> Bool search b [] = False Probleme: >>> search 2 (take 1000000 [1,3..]) False (2.24 secs, 117110684 bytes) search b (a:xs) = (a==b) search b xs search 'a' "bla blue..." geht nicht! search :: a -> [a] -> Bool Probleme: search b [] = False search b (a:xs) = (a==b) search b xs No instance for (Eq a)... Probable fix: add (Eq a) to the type signature(s) for `search'...

Suchen in sortierten Listen Für alle Typen a, für denen eine Gleichheit-Operation definiert ist. search :: Eq a => a -> [a] -> Bool search b [] = False search b (a:x) = (a==b) search b x search :: Ord a => a -> [a] -> Bool search b [] = False search b (a:x) a<b = search b x a==b = True otherwise = False Für alle Typen a, für denen Vergleichsoperationen definiert sind. >>> search 2 (take 1000000 [1,3..]) False (0.01 secs, 531908 bytes)

Suchen in sortierten Listen Binärsuche sortiert 8 8 < 7? 8 < 18? 2 4 6 7 9 11 12 18 21 24 27 36 40 53 77 n n 0 1...... n 4 2 False nur 4 Schritte Gut für imperative Programmiersprachen!

Maximale Schrittanzahl mit Arrays n = 128 = 2 7 7 = log 2 ( 128 ) 64 32 16 = 2 6 = 2 5 = 2 4 Im schlimmsten Fall log 2 (n) Schritte 8 = 2 3 4 = 2 2 2 = 2 1 1 = 2 0 Anzahl der Elemente 3... 1,023... 1,073,741,824 Lineare Suche Binäre Suche 3 2...... 1,023 10...... 1,073,741,824 30

Binärsuche binsearch :: (Ord a) => a -> [a] -> Bool binsearch b [] = False binsearch b [x] = b==x binsearch b xs b<mitte = binsearch b links b>mitte = binsearch b rechts b==mitte = True where half = (length xs) `div` 2 links = take half xs rechts = drop half xs mitte = head rechts

Sortierte Bereich

Sortierte Bereich

Sortierte Bereich

Sortierte Bereich

Größer als alle Elemente auf der linken Seite Es ist kein weiterer Vergleich notwendig

Kleiner als alle Elemente der linken Seite Schlimmster Fall

Alle Elemente müssen verschoben werden

isort :: (Ord a) => [ a ] -> [ a ] isort [] = [] isort (a:x) = ins a (isort x) where ins :: (Ord a) => a -> [a] -> [a] ins a [] = [a] ins a (b:y) a<= b = a:(b:y) otherwise = b: (ins a y)

Quick-Sort-Algorithmus Der Quicksort-Algorithmus (1962 von Hoare entwickelt) ist einer der beliebtesten Sortieralgorithmen, weil er sehr effizient und einfach zu implementieren ist. Grundidee: 1) Ein Element (Pivot) aus dem Array wird gewählt 2) Alle Zahlen des Arrays werden mit dem Pivot-Element verglichen und während des Vergleichsdurchlaufs in zwei Bereiche umorganisiert (Partitionierung). Der erste Bereich beinhaltet die Zahlen, die kleiner als das Pivot-Element sind und der zweite alle, die größer oder gleich sind. Am Ende des Durchlaufs wird das Pivot-Element in der Mitte beider Bereiche positioniert. 3) Nach jeder Partitionierung wird der Quicksort-Algorithmus rekursiv mit beiden Teilbereichen ausgeführt (solange die Teilbereiche mehr als ein Element beinhalten).

Quick-Sort-Algorithmus 5 7 3 4 9 1 6 5 9 2 0 4 8 3 6 < 3 4 1 2 0 4 3 5 7 9 6 5 9 8 6 < < 1 2 0 3 4 4 3 5 6 6 5 7 9 9 8 < < < < 0 1 2 3 3 4 4 5 5 6 6 7 8 9 9

Quick-Sort-Algorithmus 5 7 3 4 9 1 6 5 9 2 0 4 8 3 6 < 3 4 1 2 0 4 3 5 7 9 6 5 9 8 6 < < 1 2 0 3 4 4 3 5 6 6 5 7 9 9 8 < < < < 0 1 2 3 3 4 4 5 5 6 6 7 8 9 9 Der Quicksort-Algorithmus funktioniert am besten, wenn die Teilbereiche fast gleich gross sind.

0 1 2 3 4 5 6 7 8 Quick-Sort-Algorithmus 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 Im schlimmsten Fall! 0 1 0 1 2 2 3 4 5 6 7 8 3 5 6 7 8 4 sind alle Elemente bereits sortiert. 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8

Quick-Sort-Algorithmus quicksort :: [Integer] -> [Integer] quicksort [] = [] quicksort (x:xs) = quicksort [ y y <- xs, y <= x ] ++ [x] ++ quicksort [ y y <- xs, y > x ] Das Problem in Haskell ist der Speicherverbrauch und die Komplexität der Verkettungsfunktion (++).

Quick-Sort-Algorithmus Quicksort-Algorithmus mit Hilfe der filter-funktion qsort :: (Ord a) => (a -> a -> Bool) -> [a] -> [a] qsort p [] = [] qsort p [x] = [x] qsort p (x:xs) = qsort p (filter (p x) xs) ++ [x] ++ qsort p (filter (np x) xs) where np x y = not (p x y)