Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.

Slides:



Advertisements
Ähnliche Präsentationen
Algorithmentheorie 08 – Dynamische Programmierung (1)
Advertisements

Programmierung 1 - Repetitorium
Rekursionen Erstellt von J. Rudolf im November 2001 /
Rekursion Was ist Rekursion? Was sind rekursive Methoden?
Imperative Programmierung
der Universität Oldenburg
REKURSION + ITERATION.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 4 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (17 – Bäume: Grundlagen und natürliche Suchbäume) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Algorithmen und Datenstrukturen
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Diskrete Mathematik I Vorlesung 6 Binärer Suchbaum II.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
Rekursion Richard Göbel.
Visualisierung funktionaler Programme
Einführung in die Programmierung
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut für Wirtschaftsinformatik- Software Engineering JKU Linz.
Algorithmen und Datenstrukturen Übungsmodul 10
Algorithmen und Datenstrukturen SS 2005
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen 1 SS 2007 Dr. W. Narzt u. Dr. A. Stritzinger Institut.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 5 Dr. W. Narzt u. Dr. A. Stritzinger.
2.4 Rekursion Klassifikation und Beispiele
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Die Grundidee Funktionsaufruf Funktionsname (Kopf) Code der Funktion
Algorithmen und Datenstrukturen Übungsmodul 8
Algorithmen und Datenstrukturen Übungsmodul 11
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Thomas Hilpold: Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger.
Algorithmen und Datenstrukturen SS 2005
Algorithmen und Datenstrukturen Übungsmodul 1
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 2 Dr. W. Narzt u. Dr. A. Stritzinger.
Algorithmen und Datenstrukturen Übungsmodul 3
SWE1 / Übung 10 ( ) Rekursion Binärbäume.
SFZ FN Sj. 13/14 Python 3 Rekursion Inf K1/2 Sj 13/14
Algorithmen und Datenstrukturen 1 SS 2002
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
Algorithmen und Datenstrukturen 1 SS 2002
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Algorithmen und Datenstrukturen 1 SS 2002
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Rekursion-
Binärer Baum, Binärer Suchbaum I
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen 1 SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Institut für Kartographie und Geoinformation Diskrete Mathematik I Vorlesung Binärer Suchbaum I-
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
Dr. Wolfram Amme, Semantik funktionaler Programme, Informatik II, FSU Jena, SS Semantik funktionaler Programme.
Dr. Wolfram Amme, Funktionale Programmierung, Informatik II, FSU Jena, SS Funktionale Programmierung.
2.4 Rekursion Klassifikation und Beispiele
Rekursion – Speicherverwaltung
Einführung in die Programmierung
Einführung in die Programmierung
Einführung in die Programmierung
REKURSION + ITERATION.
 Präsentation transkript:

Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut für Wirtschaftsinformatik- Software Engineering JKU Linz

Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 2 Inhalt l Lösung Übung 6 l Rekursion l Bäume, Binärbaume, Binäre Suchbäume l Vorbesprechung Übung 8

Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 3 Rekursion - Konzept Rekursion im allgemeinen bedeutet, daß sich etwas als Teil enthält oder mithilfe von sich selbst definiert ist. Veranschaulichung: Mathematische Definition der Fakultätsfunktion: fak(n) = n* fak(n-1); fak(0) = 1. Rekursive Algorithmen: Wenn eine Funktion, Prozedur oder Methode einen Aufruf von sich selbst enthält (= direkte Rekursion). Wenn eine Methode eine andere aufruft und diese wiederum die erste direkt oder indirekt ruft (= indirekte Rekursion)

Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 4 Rekursionsbedingungen Ein rekursiver Aufruf darf nicht die gleichen Parameterwerte erhalten, wie die aktuelle Ausführung, da dies zu einer endlos Rekursion führen würde. Statt dessen muß bei jedem rekursiven Aufruf, die durch die Parameter definierte Aufgabe etwas "kleiner" sein. Jeder rekursive Algorithmus muß eine Fallunterscheidung enthalten mit mindestens einem nicht rekursiven Zweig, der bei der Terminierung ausgeführt wird (kann u.U. leer sein). Bei jedem rekursiven Aufruf muß ein neuer Datensatz für alle lokalen Variablen und Parameter angelegt werden, der während der Algorithmusausführung, den darunterliegenden Datensatz verbirgt. Stack-verwaltete (Aktivierungs-) Datensätze sind in fast allen modernen Programmiersprachen üblich. Für praktische Anwendungen muß die Tiefe der Rekursion relativ klein sein.

Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 5 Beispiel: Fakultät berechnen int factorial( int n) { if (n>1) { return factorial(n-1) * n; } else { return 1; } trace: factorial(5), factorial(4), factorial(3), factorial(2), factorial(1) return 1 return 1*2 return 2*3 return 6*4 return 24*5 ergebnis: 120

Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 6 Rekursion vs. Iteration Die Falkultätsfunktion kann natürlich einfacher und effizienter iterativ berechnet werden int factorial( int n) { int result = 1; for (int i=2; i<=n; i++) { result = result * i; } return result; } Grundsätzlich gilt: Jeder rekursive Algorithmus kann auch iterativ (d.h. mittels Wiederholungs- aktionen) gelöst werden und umgekeht kann jede iterative Lösung in eine rekursive überführt werden. Rekursive Algorithmen eigenen sich besonders dann, wenn das zugrundeliegende Problem rekursiv definiert ist, oder wenn die Datenstrukturen rekursiv sind.

Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 7 Beispiel: Fibonacci-Funktion Leonardo Fibonacci (ital. Mathematiker, 12 Jhdt. Pisa) fand eine Reihe, welche angeblich die Populationsentwicklung von Kaninchen präzise beschreibt. Dabei hängt die Zahl der Kaninchen einer Generation n von der Summe der Zahl der Eltern-Generation (n-1) und der Zahl der Großeltern-Generation (n-2) ab. Fibonacci-Reihe: rekursive Fassung: Anzahl der Aufrufe wächst exponentiell, daher ziemlich unbrauchbar! besser: iterative Fassung: int fib( int n) { if (n==0) return 0; if (n==1) return 1; return fib(n-1) + fib(n-2); } int fib( int n) { int i = 1; int x = 1, y = 0, z = 0; while (i<n) { z = x; x = x+y; y = z; i++; } return x; }

Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 8 Bäume - Definitionen Definition: nach Wirth [86, S. 200f] Eine Baumstruktur vom Grundtyp T ist entweder die leere Struktur oder ein Knoten vom Typ T mit einer endlichen Zahl verknüpfter, voneinander verschiedener Baumstrukturen vom Grundtyp T, sogennante Teilbäume (subtrees). Definition n. Sedgewick p. 230 ff Ein Baum ist ein Knoten (Wurzel), der mit einer Folge von disjunkten Bäumen verbunden ist. Eine derartige Folge nennt man Wald (forest). Ein Baum besteht aus Knoten (nodes), die durch Kanten (edges) verbunden sind. In den Knoten sind Nutzdaten (Elemente) gespeichert.

Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 9 Bäume - Begriffe Der Knoten an der Spitze heißt Wurzel des Baumes. Ein Pfad ist eine Liste von zusammenhängenden Kanten. Ausgehend von der Wurzel kann jeder Knoten über genau einen Pfad aus Kanten erreicht werden. Jeder Knoten, außer der Wurzel hat genau einen Vorgänger. Dieser wird auch als Elternknoten, Vater, Mutter (parent) bezeichnet. Die Nachfolgerknoten, die mit einem Vorgänger durch eine Kante verbunden sind bezeichnet man auch als Kindknoten, Sohn oder Tochter (children). Knoten ohne Nachfolger, werden als Bätter (leaves), Knoten mit Nachfolgern als innere Knoten bezeichnet. Die Ebene (Stufe, level) eines Knotens ist um 1 größer als die Ebene des Vorgängers (Wurzel hat Ebene = 0). Die Höhe eines Baumes ist das Maximum der Ebenen aller Knoten. Der Grad eines Baumes gibt die maximal mögliche Anzahl der direkten Nachfolgerknoten eines Knotens an. (Binärbaum: Grad = 2)

Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 10 Binärbaum und Binärer Suchbaum Binärbaum Ein Binärbaum ist ein Baum, dessen Grad 2 beträgt. l Ein Binärbaum mit N inneren Knoten hat N+1 Blätter. l Ein Binärbaum mit N inneren Knoten hat 2*N Kanten: N-1 zu inneren Knoten N+1 zu Blättern. Binärer Suchbaum (Definition n. Sedgewick p. 531) Ein binärer Suchbaum (binary search tree, BST) ist ein Binärbaum, der mit jedem inneren Knoten ein Schlüsselattribut assoziert und die Eigenschaft hat, dass für jeden Knoten K gilt: die Schlüsselwerte aller Knoten des linken Unterbaums sind kleiner (oder gleich) und die Schlüsselwerte des rechten Unterbaums sind größer (oder gleich) dem Schlüsselwert des Knotens K.

Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 11 Binärer Suchbaum in Jana type Tree = { reftype Item = { String key; int value} reftype Node = { Item item // Nutzdaten Node left, right} Node root // Wurzel init() {root = null}...//Algorithmen }//Tree //Verwendung: Tree t; t.init(); t.insert( item); Item i = t.search( key);

Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 12 void insert( Item x) { root=insertRec(root,x) } Item search( String key) { return searchRec(root,key) } Node insertRec( Node h, Item x) { if (h==null)return new Node(x) if (x.key < h.item.key) h.left = insertRec(h.left,x) else h.right = insertRec(h.right,x) return h; } Item searchRec( Node h, String key) { if (h==null) return null if (key==h.item.key) return h.item if (key < h.item.key) return searchRec(h.left,key) else return searchRec(h.right,key) } Binärer Suchbaum: Einfügen und Suchen (rekursiv)

Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 13 Binärer Suchbaum: Einfügen (iterativ) void insertIter(Item x) { if (root == null) { root = new Node(x) } else { Node parent, current = root while (true) { parent = current if (x.key < current.item.key) {// go left current = current.left if (current == null) { parent.left = new Node(x) return; } } else { // go right current = current.right if (current == null) { parent.right = new Node(x) return; } } // while } // else }

Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 14 Binärer Suchbaum: Suchen (iterativ) Item searchIter( String key) { Node current = root while (current != null) { if (current.item.key == key) return current.item if (key < current.item.key) { // go left current = current.left } else { // go right current = current.right } } // while return null //not found }

Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 15 Binärbaum: In-/Pre-/Postorder Traversierung (rekursiv) void inorder() { traverseInorderRec(root) } void traverseInorderRec( Node h) { if (h==null) return traverseInorderRec(h.left) h.item.visit() traverseInorderRec(h.right) } void traversePreorderRec( Node h) { if (h==null) return h.item.visit() traversePreOrderRec(h.left) traversePreOrderRec(h.right) } void traversePostorderRec( Node h) { if (h==null) return traversePostOrderRec(h.left) traversePostOrderRec(h.right) h.item.visit() }

Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 16 Binärbaum: Levelorder Traversierung (iterativ) void traverse() { traverseLevels(root) } void traverseLevels( Node h) { NodeQueue q = new NodeQueue q.enqueue(h) while (!q.isEmpty()) { h = q.dequeue() h.item.visit() if (h.left!=null) q.enqueue(h.left) if (h.right!=null) q.enqueue(h.right) }