Programmierung und Modellierung



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

Datenstrukturen und Algorithmen

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

13. Binäre Suchbäume

t r Lineare Codierung von Binärbbäumen (Wörter über dem Alphabet {, }) Beispiel code( ) = code(, t l, t r ) = code(t l ) code(t r )

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

Programmiertechnik II

Datenstrukturen & Algorithmen

Idee: Wenn wir beim Kopfknoten zwei Referenzen verfolgen können, sind die Teillisten kürzer. kopf Eine Datenstruktur mit Schlüsselwerten 1 bis 10

Grundlagen der Programmierung 2. Bäume

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

Programmiersprachen und Übersetzer

KONSTRUKTION VON ROT-SCHWARZ-BÄUMEN

Algorithmen und Datenstrukturen Suchbaum

Algorithmen und Datenstrukturen Balancierte Suchbäume

Kapiteltests zum Leitprogramm Binäre Suchbäume

Binäre Bäume Darstellung und Traversierung

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

DATENSTRUKTUREN UND ZAHLENSYSTEME

Binäre Suchbäume (binary search trees, kurz: bst)

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie

4. AUSSAGENLOGIK: SYNTAX. Der Unterschied zwischen Objektsprache und Metasprache lässt sich folgendermaßen charakterisieren:

Balancierte Bäume. Martin Wirsing. in Zusammenarbeit mit Moritz Hammer und Axel Rauschmayer. SS 06

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

Theoretische Grundlagen der Informatik

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

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

WS 2009/10. Diskrete Strukturen

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

Erwin Grüner

Algorithmen und Datenstrukturen

Datenstruktur, die viele Operationen dynamischer Mengen unterstützt

Grundbegriffe der Informatik

Kapitel 5: Dynamisches Programmieren Gliederung

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Nachtrag zu binären Suchbäumen

1. Formale Sprachen 1.2 Grammatiken formaler Sprachen

Kurs 1613 Einführung in die imperative Programmierung

Einführung in die Programmierung

Überblick. Lineares Suchen

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:

Funktionale Programmierung

1 topologisches Sortieren

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

Algorithmen und Datenstrukturen

Anmerkungen zur Übergangsprüfung

Vorkurs Informatik WiSe 15/16

368 4 Algorithmen und Datenstrukturen

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

Algorithmik II. a) Fügen Sie in einen anfangs leeren binären Baum die Schlüsselfolge 20, 28, 35, 31, 9, 4, 13, 17, 37, 25 ein.

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

Zweite Möglichkeit: Ausgabe direkt auf dem Bildschirm durchführen:

Übungen Programmieren 1 Felix Rohrer. Übungen

3.1 Konstruktion von minimalen Spannbäumen Es gibt zwei Prinzipien für die Konstruktion von minimalen Spannbäumen (Tarjan): blaue Regel rote Regel

2.11 Kontextfreie Grammatiken und Parsebäume

Tutorium Algorithmen & Datenstrukturen

Semantik von Formeln und Sequenzen

Das Briefträgerproblem

15 Optimales Kodieren

Whitebox-Tests: Allgemeines

Grundlagen der Theoretischen Informatik, SoSe 2008

Codes und Informationsgehalt

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Repetitionsaufgaben Wurzelgleichungen

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

Peer-to-Peer- Netzwerke

Kap. 4.4: B-Bäume Kap. 4.5: Dictionaries in der Praxis

Excel Funktionen durch eigene Funktionen erweitern.

Primzahlen und RSA-Verschlüsselung

Grammatiken. Einführung

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

Programmierkurs Java

7 Rechnen mit Polynomen

Grundlagen der Programmierung (Vorlesung 14)

Lineare Gleichungssysteme

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

Kap. 4.2: Binäre Suchbäume

3. LINEARE GLEICHUNGSSYSTEME

WS 2008/09. Diskrete Strukturen

Übungskomplex Felder (1) Eindimensionale Felder Mehrdimensionale Felder

Informatik II Bäume. Beispiele. G. Zachmann Clausthal University, Germany Stammbaum. Stammbaum. Stammbaum

Mathematische Grundlagen der Informatik 2

Funktionale Programmierung mit Haskell

Zahlen und das Hüten von Geheimnissen (G. Wiese, 23. April 2009)

Kapitel 6: Graphalgorithmen Gliederung

Diana Lange. Generative Gestaltung Operatoren

Algorithmen & Datenstrukturen 1. Klausur

Die Gleichung A x = a hat für A 0 die eindeutig bestimmte Lösung. Für A=0 und a 0 existiert keine Lösung.

Übungen für Woche 10

Professionelle Seminare im Bereich MS-Office

Alignment-Verfahren zum Vergleich biologischer Sequenzen

Bevor lineare Gleichungen gelöst werden, ein paar wichtige Begriffe, die im Zusammenhang von linearen Gleichungen oft auftauchen.

Binärdarstellung von Fliesskommazahlen

- k Maximalwerte aus Menge mit n >> k Elementen (Rangfolgebestimmung von Suchmaschinen!) Die typische Operationen:

V 2 B, C, D Drinks. Möglicher Lösungsweg a) Gleichungssystem: 300x y = x + 500y = 597,5 2x3 Matrix: Energydrink 0,7 Mineralwasser 0,775,

Grundlagen der höheren Mathematik Einige Hinweise zum Lösen von Gleichungen

Zeichen bei Zahlen entschlüsseln

Programmieren I. Kapitel 7. Sortieren und Suchen

Transkript:

Programmierung und Modellierung Terme, Suchbäume und Pattern Matching Martin Wirsing in Zusammenarbeit mit Moritz Hammer SS 2009

2 Inhalt Kap. 7 Benutzerdefinierte Datentypen 7. Binärer Suchbaum 8. Anwendung: Repräsentation und Auswertung von Termen 9. Pattern Matching

Binärbäume in SML datatype a bintree = Binärbäume (Wiederholung) Empty Build of a * a bintree * a bintree; Beispiel: val t0 = Build(6,Build(3,Build(2,Empty,Empty), 6 Build(8, Build(5,Empty,Empty), Empty)), Build(8, Empty, Build(4,Empty,Empty)) 3 3 8 2 8 4 5

4 7.7 Binärer Suchbaum Ein Binärbaum b heißt geordnet (oder auch Suchbaum), wenn folgendes für alle nichtleeren Teilbäume t von b gilt: Der Schlüssel von t ist größer (oder gleich) als alle Schlüssel des linken Teilbaums von t und kleiner (oder gleich) als alle Schlüssel des rechten Teilbaums von t Genauer: Ein binärer Baum t heißt binärer Suchbaum (binary search tree, BST), wenn t = ε oder t = (a, l, r) und Für jeden Knoten x von l gilt x < a. Für jeden Knoten x von r gilt a < x l und r sind selbst wiederum binäre Suchbäume. 3 > 7 5 > > 9 < 10 < 12

5 Beispiele: Suchbäume Beispiel: Zwei verschiedene binäre Suchbäume über den Monatsnamen: Nach welchen Kriterien (Vergleichsoperationen) sind diese Bäume geordnet?

6 Effizientes Suchen in binären Suchbäumen Prinzipieller Ablauf der Berechnung von enthaltenbst 6 t0 1. Vergleiche 6 mit dem Wert der Wurzel; 2. Da 6<7, wende enthaltenbst rekursiv auf linken Teilbaum an; 1. Vergleiche 6 mit dem Wert dessen Wurzel; 2. Da 6>5, wende enthaltenbst rekursiv auf rechten Teilbaum an; 1. Vergleiche 6 mit dem Wert dessen Wurzel 2. Da 6==6, gebe Ergebnis true zurück. 3 6<7 5 7 6>5 6 8 12 6==6 Ergebnis true;

7 Effizientes Suchen in binären Suchbäumen Folgende Funktion stellt fest, ob ein Knoten in einem binären Suchbaum enthalten ist: fun enthaltenbst x Empty = false enthaltenbst x (Build(y,l,r)) = x=y orelse if x<y then enthaltenbst x l else enthaltenbst x r; Es werden nur die Knoten auf dem Pfad von der Wurzel zum gesuchten Element, bzw. bis zu einem Blatt angesehen. Dagegen werden bei enthalten alle Knoten angesehen. Dafür ist enthaltenbst aber nur korrekt für binäre Suchbäume. Die Komplexität ist O(h), wenn h die Höhe des Baums bezeichnet. Im besten Fall ist h gleich log n (n = Anzahl der Knoten) Im schlechtesten Fall ist h gleich n (entarteter Baum).

8 Beim Einfügen in einen geordneten Binärbaum wird rekursiv die richtige Stelle gesucht, so dass wieder eine geordneter Binärbaum entsteht. Beispiel: insert 8 t0 ergibt: Einfügen in binäre Suchbäume 7 t0 = insert 8 t0 = 7 5 10 5 10 3 6 12 3 6 8 12

9 Einfügen in binäre Suchbäume fun insert x Empty = Build(x,Empty,Empty) insert x (Build(a,l,r)) = if x<a then Build(a,insert x l,r) else if a<x then Build(a,l,insert x r) else Build(a,l,r);

10 Einfügen in binäre Suchbäume Bemerkung Da die Operation < nur in wenigen Datentypen vorkommt, ist insert nicht polymorph. Das SML-System bevorzugt den int- Datentyp und liefert val insert = fn : int -> int bintree -> int bintree Dagegen liefert das zusätzliches Constraint (x:char) fun insert (x:char) Empty = Build(x,Empty,Empty) insert x (Build(a,l,r)) = if x<a then Build(a,insert x l,r) else if a<x then Build(a,l,insert x r) else Build(a,l,r); den Typ val insert = fn : char -> char bintree -> char bintree

11 Löschen in binären Suchbäumen Beim Entfernen eines Schlüssels muss die Suchbaumstruktur aufrecht erhalten werden. Zur Entfernung der Wurzel sucht man das kleinste Element im rechten Teilbaum. Beispiel:

Löschen in binären Suchbäumen fun delete x Empty = Empty delete x (Build(a,l,r)) = if x<a then Build(a,delete x l,r) else if x>a then Build(a,l,delete x r) else if l=empty then r else if r=empty then l else let val (m,r1) = remove_min r in Build(m,l,r1) end; wobei remove_min das kleinste Element entfernt: fun remove_min (Build(a,Empty,r)) = (a,r) remove_min (Build(a,l,r)) = let val (m,l1) = remove_min l in (m,build(a,l1,r)) end; 12

Knotenanzahl und Höhe Sei n die Knotenanzahl eines Baumes t und h seine Höhe. Im besten Fall gilt n = 2 h -1, also h = O(log n). Im schlechtesten Fall gilt n = h, also h = O(n). Suchen, Einfügen, Löschen haben Komplexität O(h), also O(log n) bzw. O(n) je nach Art von t. 13

Zwei extreme Beispiele val b1 = insert 6 (insert 5 (insert 4 (insert 3 (insert 2 (insert 1 (insert 0 Empty)))))); val b2= insert 6 (insert 4 (insert 1 (insert 0 (insert 5 (insert 1 (insert 3 Empty)))))); t1 hat maximale Höhe (7) und t2 hat minimale Höhe (3) 14 Bemerkung Eine Menge von Bäumen B heißt balanciert, wenn max {Höhe(t) knotanz(t) <= n; t B} = O(log(n)) Für balancierte BST mit n Knoten erfordern Einfügen, Löschen, Suchen die Zeit O(log(n)).(siehe Vorlesung effiziente Algorithmen); dazu sind lokale Umordnungen (sogenannte Rotationen) des Baums erforderlich.

Siehe Tafel 7.8 Darstellung von Termen 15

16 Terme als Bäume val t = Build("-", Build("+", Build("10",Empty,Empty), Build("*",Build("x",Empty,Empty), Build("85",Empty,Empty))), Build("+", Build("124",Empty,Empty), Build("y1",Empty,Empty))) - linnach t; val it = ["10", "x", "85", "*", "+", "124", "y1", "+", "-"] : string list Terme lassen sich als Bäume repräsentieren. Die Nachordnung entspricht der Postfixnotation, die Vorordnung der Präfixnotation und die symmetrische Ordnung der Infixnotation. Nachteile dieser Repräsentation: Sehr viel Empty, Auch syntaktisch falsche Terme haben Repräsentationen: Z.B. Build("x",Build(...),Build(...)

Abstrakter Syntaxbaum Eine bessere Darstellung erhält man durch Verwendung von abstrakter Syntax : Man beschreibt die Syntax einer Sprache durch eine Menge rekursiver Datentypen, so dass jedes (essentielle) syntaktische Konstrukt durch einen Wertkonstruktor spezifiziert wird. Beispiel datatype binop = Plus Minus Mal Geteilt; datatype expr = Var of string Num of int Op of binop * expr * expr; val t = Op(Minus, Op(Plus, Num 10, Op(Mal, Var "x", Num 85)), Op(Plus, Num 124, Var "y1")); D.h. führt man ein: einstellige Wertkonstruktoren für die Variablen und Konstanten und einen n-stelligen Wertkonstruktor für die n-stelligen Operationen. Bemerkung: Die abstrakte Syntax entspricht einer kontextfreien Grammatik (bzwder Backus-Naur-Form BNF) 17

18 Auswertung von Termen Repräsentiere Umgebung als Liste von Paaren der Form Variable-Zahl, z.b.: Umgebung {<"x", 9>, <"y1", 0>, <"z", 3>} repräsentiert als [("x", 9), ("y1", 0), ("z", 3)] Einfügen mit :: Auslesen mit - fun lookup x ((y,z):: l) = if x=y then z else lookup x l; val it = fn : a -> ( a * b) list -> b Eine so verwendete Liste von Paaren heißt Assoziationsliste.

19 Rekursive Auswertung von Termen fun eval (Num x) env = x eval (Var x) env = lookup x env eval (Op(Plus,t1,t2)) env = (eval t1 env) + (eval t2 env) eval (Op(Minus,t1,t2))env = (eval t1 env) - (eval t2 env) eval (Op(Mal,t1,t2)) env = (eval t1 env) * (eval t2 env) eval (Op(Geteilt,t1,t2)) env = (eval t1 env) div (eval t2 env);

20 Konvertierung von Ausdrücken in Strings Mit Hilfe der symmetrischen Ordnung (und Einführung von Klammern) lässt sich ein abstrakter Syntaxbaum in einen arithmetischen Ausdruck umwandeln: show(num x) = Int.toString x show (Var x) = x show (Op(Plus,t1,t2)) = "(" ^(show t1) ^ "+" ^(show t2) ^ ")" show (Op(Minus,t1,t2)) = "(" ^(show t1) ^ "-" ^(show t2) ^ ")" show (Op(Mal,t1,t2)) = "(" ^(show t1) ^ "*" ^(show t2) ^ ")" show (Op(Geteilt,t1,t2)) = "(" ^(show t1) ^ "div" ^(show t2) ^ ")";

21 7.9 Pattern Matching Muster kommen in SML in vielen Formen vor In Wertdeklarationen, z.b. val (c1, c2) = (1.37, 0.66); In Funktionsdeklarationen, z.b. fun laenge nil = 0 laenge (x :: l) = 1+ length l; fun is_ordered nil = true is_ordered (x::nil) = true is_ordered(x :: y :: l) = (x<y) andalso is_ordered (y :: l) fun size Empty = 0 size Build(x, l, r) = 1 + size l +size r; Pattern (Muster) Ein Muster ist ein Ausdruck M, der aus Wertkonstruktoren und freien Variablen gebildet wird und folgende Linearitätsbedingung erfüllt: Jede freie Variable darf in einem Muster höchstens einmal auftreten.

22 Linearitätsbedingung für Muster Beispiel Die folgende polymorphe Funktion - fun gleich(x, y) = (x = y); val gleich = fn : ''a * ''a -> bool kann also nicht wie folgt deklariert werden: - val gleich = fn (x, x) => true _ => false; Error: duplicate variable in pattern(s): x Diese Einschränkung erlaubt es, den Pattern-Matching Algorithmus einfach und effizient zu halten. Ohne diese Einschränkung müssten bei Mehrfachvorkommen von Variablen in Mustern die entsprechenden Werte zu Gleichheitstypen gehören.

23 Informelle Spezifikation des Pattern-Matching Algorithmus Der Pattern-Matching Algorithmus ist ein Angleich eines Musters M an einen Wert W Gelingt der "Angleich, so werden etwaige Namen, die im Muster vorkommen, gebunden. Anderfalls der Algorithmus fest, dass der Angleich von Muster M und Wert W unmöglich ist, d.h. gescheitert ist. Beim Angleich werden die Strukturen von Muster und Wert gleichzeitig durchlaufen (bzw. zerlegt), indem die Teilausdrücke komponentenweise und rekursiv angeglichen werden. Basisfälle dieses rekursiven Algorithmus sind Variablen und Konstanten, die im Muster vorkommen. Der Pattern-Matching Algorithmus soll auch feststellen, dass der Angleich von Muster M und Wert W unmöglich ist, d.h. gescheitert ist.

24 Informelle Spezifikation des Pattern-Matching Algorithmus Pattern Matching erfolgt zwischen einem Muster M und einem Wert W; in einem Programm sind aber jeweils ein Muster M und ein Ausdruck A gegeben, z.b. in der Form val M = A; oder fun f M = ; f(a) Bei der Auswertung wird zunächst A in der aktuellen Umgebung ausgewertet zu einem Wert W. Danach wird der Pattern-Matching Algorithmus auf das Muster M und den Wert W angewandt.

25 Pattern Matching Algorithmus Zur Illustration definieren wir in SML einen Pattern Matching Algorithmus für Ausdrücke über int list Abstrakte Syntax der Pattern datatype pat = Var of string Num of int Nil Cons of pat * pat; Beispiele val pat0 = Cons(Var("x"), Var("l")); val pat1 = Cons(Var("x"), Cons(Num 3, Nil)); Werte werden nur mit Num, Nil und Cons konstruiert. Beispiele val w1 = Cons (Num 17, Cons(Num 3, Nil)); val w2 = Cons (Num 17, Cons(Num 3, Cons(Num 13, Nil)));

Der Datentyp option Der polymorphe Datentyp option wird oft zur Darstellung partiell definierter Funktionen verwandt. Er liefert eine Unterscheidung zwischen einem Wert und keinem Wert : 26 datatype 'a option = NONE SOME of 'a; Bemerkung: Man kann den Wert NONE verstehen als äquivalent zu den Null-Werten in Datenbanken.

Pattern Matching Algorithmus Der Pattern Matching Algorithmus ist rekursiv definiert: - fun match Nil Nil = SOME [] match (Cons (parg1, parg2)) (Cons (arg1, arg2)) = (case (match parg1 arg1, match parg2 arg2) of (SOME e1, SOME e2) => SOME (e1 @ e2) _ => NONE ) match (Num i) (Num j) = if (i = j) then SOME [] else NONE match (Var(x)) arg = SOME [(x, arg)] match = NONE; val match = fn : pat -> pat -> (string * pat) list option 27 - match pat1 w2; val it = NONE : (string * pat) list option - match pat0 w1; val it = SOME [("x",num 17),("l",Cons (#,#))] : (string * pat) list option

28 Zusammenfassung (I) Suchbäume Ein Binärbaum b heißt geordnet (oder auch Suchbaum), wenn Folgendes für alle nichtleeren Teilbäume t von b gilt: Der Schlüssel von t ist größer (oder gleich) als alle Schlüssel des linken Teilbaums von t und kleiner (oder gleich) als alle Schlüssel des rechten Teilbaums von t Einfügen, Löschen und Suchen erfordert lineare Zeit in der Höhe dessuchbaums; d.h. ist im schlechtesten Fall linear in der Anzahl der Knoten. In balancierten Bäumen haben Einfügen, Löschen und Suchen jeweils logarithmische Zeitkomplexität (in der Anzahl der Knoten). Terme lassen sich als Bäume repräsentieren. Die Nachordnung entspricht der Postfixnotation, die Vorordnung der Präfixnotation und die symmetrische Ordnung der Infixnotation. Man beschreibt die abstrakte Syntax von Ausdrücken durch rekursive Datentypen, wobei stehen: einstellige Wertkonstruktoren für die Variablen und Konstanten und n-stellige Wertkonstruktoren für die n-stelligen Operationen. Zur Auswertung der Terme benötigt man eine Umgebung (Assoziationsliste), die die Werte der (freien) Variablen verwaltet.

29 Zusammenfassung (II) Pattern (Muster) Ein Muster ist ein Ausdruck, der aus Wertkonstruktoren und freien Variablen gebildet wird und folgende Linearitätsbedingung erfüllt: Jede freie Variable darf in einem Muster höchstens einmal auftreten. Der Pattern-Matching Algorithmus realisiert ein Angleich eines Musters an einen Wert. Gelingt der "Angleich, so werden etwaige Namen, die im Muster vorkommen, gebunden. Anderfalls stellt der Algorithmus fest, dass der Angleich von Muster und Wert unmöglich ist, d.h. gescheitert ist. Zur Unterscheidung dieser Ergebnisse wird der polymorphe Datentyp option verwandt, der häufig zur Darstellung partieller Funktionen dient.