Algorithmen und Programmierung

Größe: px
Ab Seite anzeigen:

Download "Algorithmen und Programmierung"

Transkript

1

2

3 Algorithmen und Programmierung Daniel Waeber Semester 3

4

5 Inhaltsverzeichnis 1 Analyse von Algorithmen Laufzeit von Algorithmen Experimentelle Analyse Theoretische Analyse von Algorithmen Pseudo-Code Random Accesss Machsine Laufzeit eines Algorithmus Wachstum der Laufzeit O-Notation O-Notation HOWTO MEGA-Beispiel Rekursionsbäume Rekursion in der Registermaschine Datenstrukturen Datenstruktur Stack Indirekte Anwendung von Stapeln Dynamisierung Array-basierter Datenstrukturen Implementierung Datenabstraktion Einschränkung der Sichtbarkeit bei der klassenbasierten Datenabstraktion Abstrakter Datentype (ADT) Explizite Schnittstellenbeschreibung Anonyme Klassen Polymorphe Typsystem Vererbung (inheritance) Erweiterung (extension) Schnittstellenvererbung Mehrfachvererbung Typ-Verträglichkeit Verdecken, Ersetzen und Identifizieren von Methoden und Attributen bei Namenskollisionen Abstakte Klassen Object Generizität Eigenschaften ADTs - Anwendungen - Implementierungen ADT Prioritätswarteschlange we proudly present: Knauers List-Sort Implementierung: Heap Folgerung/Anwendung

6 3.1.4 Erweiterung des ADT Prioritätswarteschlange Binomial Heap Bäume ADT Baum Implementierung von Bäumen Spezialfall - Binäre Bäume Implementierung von Binären Bäumen durch Arrays Lokalisieren von Einträgen im Datenstrukturen Algorithmen auf Bäumen Baumtraversierung Wörterbücher(Dictonary) Abstrakter Datentyp Implementierung Hashing (Streuspeicherung) Hasing mit Verkettung ADT Geordnete Wörterbücher Implementierung Binäre Suchbäume Balancierte Suchbäume (2-4-Bäume, Rot-Schwarz-Bäume)

7 Kapitel 1 Analyse von Algorithmen Definition: Ein Algorithmus ist eine Schritt-für-Schritt Anweisung, mit dem ein Problem in endlich vielen Schritten lösbar ist. Frage nach Korrektheit und Effizienz des Algorithmus. 1.1 Laufzeit von Algorithmen im Allgemeinen transformieren Algorithmen eine Eingabe in eine Ausgabe die Laufzeit eines Algorithmus hängt typischerweise von der Eingabe-Grö se ab die Bestimmung der mittleren Laufzeit eines Algorithmus ist mathematisch oft sehr anspruchsvoll (selbst experimentell schwierig) Analyse der Laufzeit im schlechtesten Fall ( worst case ) Experimentelle Analyse Implementation des Algorithmus. Messung der Laufzeit des Programms auf Eingaben verschiedener Grö se und Struktur Theoretische Analyse von Algorithmen Statt einer konkreten Implementierung verwenden wir eine abstraktere Beschreibung. (Pseudo Code) Charakterisierung der Laufzeit als Funktion der Länge der Eingabe Dabei werden alle Eingaben der Länge n berücksichtigt Pseudo-Code abstrakte Beschreibung eines Algorithmus strukturierter als prosaische Beschreibung weniger detailierter als Java Programm Algorithm arraymax (a, n) Input : Feld A von n ganzen Zahlen Output: Ein grösstes Element in A currentmax A[ 0 ] 5

8 for i=0 to n 1 do if A[ i ] > currentmax then currentmax A[ i ] return currentmax Psedo-Code im Detail: Kontrollflussanweisungen for...do while...do repeat...until if...then...else... Deklarationen Methodenaufrufe f(arg1, arg2,...) Rückgabe return Ausdrücke Zuweisung Gleichheitstest = Random Accesss Machsine Rechenkern arithmetische Ausdrücke +,,,/ Kontrollflussoperatoren bedingte/unbedingte Sprünge konstante Zeit pro Operation linear organisierter Speicher mit wahlfreiem Zugriff jede Zelle speichert beliebige Zahl auf Zellen kann über ihre Adresse in konstanter Zeit zugegriffen werden unendlich gro ser Speicher primitive Operationen des Pseudocodes können in konstant vielen RAM-Anweisungen realisiert werden Laufzeit eines Algorithmus Definition: A Algorithmus (implementiert auf einer RAM) I Eingabe fuer A T A (I) = Anzahl der elementaren RAM Op. die A auf I durchfuehrt, Laufzeit von A auf I T A (n) = max(t A (I)) (I Eingabe der Groesse n) worst case Laufzeit von A

9 Algorithm double (x) Input : x N Output: 2x y 2 x return y LOAD 0,0 MULT 0,2 STORE 0,0 RET Algorithm double (x) y x y y+x return y Algorithm double (x) z x for i 1 to x do z z+1 return z Da jede Zeile in 5 RAM-Operationen übersetzt werden kann, kann die Laufzeit auch in Pseudocode berechnet werden Wachstum der Laufzeit Eine vernünftige Änderung des Maschinenmodells verändert die Laufzeit von Algorithmen nur um einen konstanten Faktor. Asymptotische Laufzeit berücksichtigt keine konstanten Faktoren und keine Terme niederer Ordnung. Wir interessieren uns daher für das asymptotische Wachstum von T A (n) O-Notation Definition: f(n) O(g(n)) def n 0 c 0 : f(n) c g(n) n n 0 Beispiel: 12n 4 = O(n) 12n 4 12 n n 2 = O(n) nein Definition: f = Ω(g) gdw. g = Ω(f) O-Notation HOWTO 1. Falls f(n) = d i=0 a in i (a d 0) f(n) = O(n d ) 2. Wir sagen 2n = O(n) statt 2n = O(n 2 ) 3. Wir sagen O(n) statt O(3n 6)

10 Beispiel: Gegeben eine Folge von n Zahlen X[0],, X[n 1]. Berechne die Folge A[0],,A[n 1], wobei A[i] = 1 i+1 (X[0] + + X[i]) Algorithm PrefixAverage (X, n) Input : X[0],...,X[n 1] Output: [0],...,A[n 1],mitA[i] = (X[0],...,X[i) A leeres Feld mit n Zellen // n for i=0 to n 1 // n sum 0 // n for j=0 to i // n (n + 1)/2 sum sum + X[ j ] // n (n + 1)/2 A[ i ] sum i+1 // n return A // 1 T pa (n) = O(n + n + n + n(n+1) 2 + n(n+1) 2 + n + 1) = O(n 2 ) Algorithm Pr3f1x4v3r4g3 (X, n) Input : X[0],...,X[n 1] Output: [0],...,A[n 1],mitA[i] = (X[0],...,X[i) A Feld mit n Zellen // 1 sum A[ 0 ] // 1 for 1 to n 1 // n 1 sum sum + X[ i ] // n 1 A[ i ] sum / ( i +1) // n 1 return A // 1 T p4 (n) = O( (n 1) + (n 1) + (n 1) + 1) = O(n) MEGA-Beispiel Wie löse ich ein Problem, wenn ich wei s, wie ich ein einfacheres Problem löse? Beispiel: n! = n i; n! = i=0 { n (n 1)! n > 0 1 n = 0 Algorithm fact (n) Input : n Output: n! if (n=0) then // 1 return 1 // 1 else return n fact (n 1) // 1 + T(n 1) Sei T fact die Laufzeit von fact. T fact (0) c T fact (n) c + T fac (n 1) T fact (n) c + T fact (n 1) (1.1) c + (c + T fact (n 2) (1.2) 3c + T fact (n 3) (1.3) kc + T fact (n k) (1.4)

11 (Beweis mit vollständiger Induktion über k) T fact (n) cn + T fact (0) cn + c = O(n) Rekursionsbäume Algorithm Summe(A, n) Input : Feld A von n Elementen Output: Summe über A if n=1 return A[ 0 ] else return A[ n]+summe(a, n 1) Aufruf durch C.K. ;) Summe(A,5) Summe(A,4) Summe(A,3) Summe(A,2) Summe(A,1) Beispiel: { Potenzieren p(x,n) = x n wobei x,n N 1 n = 0 p(x,n) = x p(x,n 1) n 1 Es geht aber besser, da x 2n = (x n ) 2 bzw. x 2n+1 = x(x n ) 2 1 n = 0 p(x,n) = (x k ) 2 = p(x, n 2 ) n = 2k x(x k ) 2 = x p(x, n 1 2 ) n = 2k + 1 Algorithm Power(x, n) Input : x,n N Output: x n if n=0 then return 1 else if n gerade then y Power(x, n 2 ) return y y else y Power(x, n 1 2 ) return y y x

12 lineare Rekursion O(log n) Power(x,n) Power(x,n/2) Power(x,n/4)... Power(x,1) T(x,n) O(1) + T(x, n 2 ) falls n gerade T(x,n) O(1) + T(x, n 2 ) falls n ungrade Algorithm Power(x, n) Input : x,n N Output: x n if n=0 then return 1 else if n gerade then return Power(x, n 2 ) Power(x, n 2 ) else y Power(x, n 1 2 ) return Power(x, n 1 2 ) Power(x, n 1 2 ) x # Op auf Schicht log n: c n # Op auf Schicht log n 1: c n/2 # Op auf Schicht log n k: c n/2 k Insgesamt: log n k=0 c n 2 k = c log n k=0 1 2 k c n Beispiel: Verfahren zum Summieren der Einträge eines Feldes. Algorithm Sum(A, i, n) Eingabe : F eldavonzahlenmitindexiundanzahln Ausgabe : A[i] + A[i + 1] A[i + n] if n=1 return A[ i ] return Sum( i, n/2)+sum( i+n/2,(n+1)/2) Allgemein: # Op c log n i=0 2i = O(n)

13 Beispiel: Fibonacci Zahlen: F 0 = 0;F 1 = 1;F i = F i 1 + F i 2 Algorithm Fib ( i ) Eingabe i Ausgabe F( i ) if ( i =0) then return 0 if ( i =1) then return 1 return f ib ( i 1)+ f ib ( i 2) Schlechte Idee! Sei T(k) die Anzahl der rekursiven Aufrufe von Fib(k) T(0) = 1 T(1) = 1 T(2) = 1 + T(O) + T(1) T(k) = 1 + T(k 1) + T(k 2) F k 1 Da F k 2F k 2 hat man ein exponentielles Wachstum. F[0]=0 F[1]=1 F[ i ]=undef für 1 < i < n Algorithm Fib ( i ) Eingabe i Ausgabe F( i ) if F[ i ]=undef then F[ i ] = Fib ( i 1) + Fib ( i 2) return F[ i ] Beispiel für dynamisches Programmieren geht auch direkt über lineare Rekursion Übung Noch ( besser: ) ( ) Fi Fi 1 F = i 2 = F i 1 F i 1 ( ) ( Fi 1 F i 2 d.h. v i = ( M v ) i 1 = M k v i k 1 mit v 1 = ; v 0 i = M i 1 v 1 M i 1 kann mittels sukz. Quadrieren in O(log(i)) berechnet werden! Rekursion in der Registermaschine Algorithm main x 5 subroutine1 (x) Algorithm subroutine1 ( i ) k i+1 )

14 subroutine2 (k) Algorithm subroutine2 ( j )... merken, welche Unterroutine gerade ausgeführt wird main subroutine1 subroutine2 Die Liste der laufenden Unterroutinen wird auf einem Methodenstapel (nach dem LIFO Prinzip) verwaltet Beim Aufruf einer neuen Methode legen wir auf den Stapel eine Datensatz der angibt, wer der Aufrufer ist, welche Rücksprungadresse ist zu verwenden und was sind die Werte der lokalen Variablen. ermöglicht Rekursion! Speicherabbild: System code Main code Subrotine code 1.2 Datenstrukturen Datenstruktur Stack Verwaltung eine Menge von Objekten nach LIFO Prinzip (im Moment soll der Stack nur ganze Zahlen beinhalten) erforderliche Operationen einfügen (push) füge das Argument der push-operation zu Menge verwalteten der Objekte hinzu extrahieren (pop) entfernt und liefert das letzte Element (isempty?) liefert true, wenn Stack leer ist (top) liefert das oberste Element ohne es zu entfernen Vorschau auf die algebraische Spezifikation Pop(Push(S,x)) = (S;x) Implementierung von Stacks mittels Feldern (Arrays)

15 x x x top Allozieren eines Felds F der Größe M eine Zeigervariable z zeigt auf den ersten freien Eintrag in F ein push(x) speichert x in F[z] und setzt z z + 1 Falls z = M melde Fehler Stapel voll ein pop liefert F[z 1] und setzt z z 1 Falls z < 0 melde Fehler Stapel leer geht gut, solange nicht das Maximum M erreicht wird class IntArrayStack { int F [ ] ; int z ; int M; IntArrayStack ( int m){ M = m; z = 0; F = new int [M] ; int pop () throws EmptyStackException { if ( z == 0) throw... return F[ z ] ;... Analyse: Linearer (in der Anzahl der in der Struktur verwalteten Objekte (M)) Platzbedarf O(1) für push + pop evtl. Ω(M) Zeit bei Initialisierung Problem/Einschränkung: Maximalgröße des Stapels muss bei Initialisierung bekannt sein Implementierungspezifische Ausnahmen! Implementierung von Stacks mittels verketteten Listen einfach verkettete Liste einfügen und entfernen am Anfang der Liste effektiv möglich head next next next next data data data data

16 Einfügen/Löschen am Anfang der Liste in O(1) am besten am 2. Element einfügen und vertauschen, damit Referenzen nicht zerstört werden. Einfügen/Löschen am Ende der Liste in Θ(n) Implementierung des Stapels Element im Stapel werden in der entsprechenden Reihenfolge in der e.v. Liste gespeichert. Dabei wird das oberste Element im Stapel am Anfang der Liste gespeichert. Platzbedarf Θ(n) Laufzeit push/pop/top O(1) Indirekte Anwendung von Stapeln als Hilfsstruktur in anderen Datenstrukturen beim Entwurf von Algorithmen Beispiel: ^ < <-- <-- <-- < > Gegeben ist Feld X[0],,X[n 1] Berechnen für 0 i n 1 S[i] S[i] = maximale Anzahl von aufeinanderfolgenden unmittelbaren Element vor X[i], sodass X[j] X[i] Algorithm Span1(X,n) Eingabe: Feld X mit n Zahlen Ausgabe: Feld S S <- Neuse Feld von n Zahlen mit 0 for i=0 to n-1 do for j=0 to i do if X[i-j] <= X[i] then S[i]+=1 else break return S Analyse Auf benötigt der Algorithmus Θ(n 2 ) Es geht auch besser Abarbeiten von X von links nach rechts Wir speichern in einem Stack die Indizes der sichtbaren Elemente Am Index i

17 hole Elemente aus dem Stapel, bis X[j] > X[i] (pop) Setze S[i] = i j Lege i auf den Stack (push) Algorithm Span2(X,n) S <- Neues Feld von n Zahlen A <- neuer leerer Stapel for i=0 to n-1 do while(!isempty(a) && X[top(A)] <= X[i]) pop(a) if(isempty(a)) then S[i] = i+1 else S[i] = i-top(a) push(a,i) Da nur n-mal gepushed wird, können wir nur n-mal popen. lineare Laufzeit 1.3 Dynamisierung Array-basierter Datenstrukturen Ziel: Stapel mit Arrays implementieren, aber die Größe der Struktur soll beliebig sein. Idee: Wir haben zu jeden Zeitpunkt ein Feld, in dem die Elemente des Stapels abspeichert sind. Wenn der Platz in dem Feld nicht mehr ausreicht, um alle Elemente des Stapels aufzunehmen, dann legen wir ein neues Feld (doppelter Größe) an und kopieren das alte Feld an dessen Anfang. push x x x x x x x push x x x x x x x x x x x x x x x Diese Struktur hat im worst-case ein schlechtes Laufzeitverhalten, da es push-operationen gibt, mit Ω(n) Laufzeit. (n = # Elemente im Stapel) ABER: Jede Folge von n push/pop Operationen benötigt O(n) Zeit Eine pop-operation benötigt im worst-case O(1) Zeit. D.h. alle pop-operationen Zusammen in einer Folge von n push/pop Operationen benötigen O(n) viel Zeit. Wir betrachten Folge von n push-operationen. Kosten # push m Kosten/Op < 2/op < 2/op < 2/op < 2/op

18 Die 2 i -te push-operation benötigt O(2 i ) Alle anderen { push-operationen benötigen O(1) O(2 mit T i ) fallsk = 2 i k O(1) sonst log n +1 log n n Gesamtzeit für n push-operationen: T k = ( T 2 i) + O(n) = O( 2 i ) + O(n) = k=0 O(2 log n +1 1) + O(n) = O(n) Jede Folge von n push-operationen erfordert O(n) Laufzeit Amortisierte Kosten von O(1) Definition: Gegeben sei eine Datenstruktur, und eine Folge von n Operation, bei der insgesamt m Elemente manipuliert werden. Der Zeitbedarf für diese n Operationen sei T(n, m). Dann nennen wir T(n,m) n die amortisierten Kosten pro Operation. Beispiel: Stack mit Operation mpop(k) k N entfernt k Elemente vom Stapel. Kosten für mpop(k) sind O(k) Op Kosten für Op. Sparbuch push push push push mpop(2) push push mpop(3) Amortisierte Kosten der beiden Operationen sind O(1) Beweis: mit Buchhaltermethode Wir nehmen an, eine push-op kostet 1e, eine mpop(k)-operation kostet ke Wir behaupten, dass folgendes Zahlungsschema jede Folge von n-operationen bezahlen kann: push-op. erhält 2e mpop-op. erhält 0e (daraus folgt, das die Gesamtkosten der Folge n2e sind. Der Grund ist der, dass mpop(k) nur dann aufgerufen werden kann, wenn k Elemente vorher mit push auf den Stapel gelegt wurden. Von jeder dieser k push Operationen ist noch 1e übrig. (mit dem anderen wurde die push-operation bezahlt) k=0 k=0

19 Kapitel 2 Implementierung 2.1 Datenabstraktion Definition: Geheimnisprinzip: Kenntnis der Spezifikation eines Moduls/Systems ist notwendige und hinreichende Voraussetzung für dessen korrekte Benutzung. Beispiel: Prozedurale Abstraktion reguläre Benutzung einer Prozedur ist ihr Aufruf zum Aufruf einer Prozedur ist nur die Kenntnis ihrer Signatur nötig es ist dem Aufrufer nicht möglich auf lokale Variablen zuzugreifen er muss die Spezifikation kennen Definition: Datenabstraktion ist die Anwendung des Geheimnisprinzips auf die Darstellung komplexere Datenstrukturen: ein zusammengesetztes Datenobjekt ist nicht direkt manipulierbar über prozedurale Schnittstelle manipulierbar, die geeignete Operationen zur Verfügung stellt. Beispiel: Implementierung von Stacks mit Feldern. class Stack { int max = 100; Object [ ] S = new Object [max ] ; int t=0; void push ( Object o) throws Exception { if ( t==max) throw new Exception ( ) ; S [ t++]=o ; Object pop () { direkte Manipulation von Attributen möglich!! Stack s = new Stack ( ) ; s. t++; 17

20 public class Stack { private int max = 100; private Object [ ] S = new Object [max ] ; private int t =0; public void push ( Object o) throws Exception { if ( t==max) throw new Exception ( ) ; S [ t++]=o ; public Object pop () { Einschränkung der Sichtbarkeit bei der klassenbasierten Datenabstraktion Das Klassenkonzept unterstützt die Zusammenfassung von Daten und den sie manipulierenden Operationen (in einer syntaktischen Form) In Java kann das Verbergen der internen Repräsentation durch Sichtbarkeitmodifikationen public, protected, private erreicht werden. Sie steuern die Sichtbarkeitbereiche von Methoden und Attributen. public: überall sichtbar protected: innerhalb des eigenen Paketes + in den Unterklassen default: innerhalb des eigenen Paketes private: nur innerhalb der umschließenden Klasse 2.2 Abstrakter Datentype (ADT) Definition: Menge von Objekten zusammen mit Menge von Operation auf diesen Objekten Ein Typ, dessen Objekte nur über die Operationen seiner Schnittstelle manipuliert werden können. (und eben nicht durch direkten Zugriff auf die Daten/Attribute) Üblicherweise gehört zum ADT auch Spezifikation der Fehlerreaktion der Operation Beispiel: ADT Stack kann beliebeige Objekte speichern Einfügen/Löschen nach dem LIFO-Prinzip Operationen: push(object): Füge ein Element ein Object pop(): Entferne und liefere das zuletzt eingefügte Element zurück Fehlerspezifikation Stapel-Unterlauf: pop liefert Stapel-Unterlauf, falls es mit leerem Stapel aufgerufen wird.

21 REALE WELT reale Objekte mit realen Operationen Modellierung MODELL abstraktes Objekt Operationen Implementierung DATENSTRUKTUR mit Methoden Vorteile Implementierung unabhängig vom Modell Sicherheit: Objekte können nicht in ungültige Zustände gebracht werden. Flexibilität: Code kann unabhängig vom benutzten Code entwickelt werden Komfort: Benutzer abstrahiert von Repräsentation Explizite Schnittstellenbeschreibung Zur Schnittstelle von Stack: die Operationen müssen dem Quelltext der Klasse heraus gesucht werden die Implementierung der Methoden wird nicht vor dem Benutzer verborgen Klasse ist nur für de Erzeugung von Objekten nötig, nicht für die Benutzung interface StackI { void push ( Object o) throws... ; Object pop () throws... ; Object top () throws... ; boolean is empty () throws... ; Attribute können nur als Konstanten vereinbart werden Methoden haben nur einen leeren Rumpf

22 keine Konstruktoren Sichtbarkeit ist standardmäßig public public c l a s s ArrayStack implements S tack { private int t =0; private Object [ ] S=new Object [... ] public void push ( Object x){... public class ListStack implements Stack { private class Item{ Object value ; Item next ; public void push ( Object y){... Im Programm: MyStack s = new MyStack(); // Festlegung auf konkrete Implementierung Stack s = new MyStack(); // zwar korrekt, aber andere Implementierung verwendbar Stack s = new Stack(); // geht nicht; Pflichten bei Implementierung einer Schnittstelle Alle Schnittstellen-Methoden müssen public sein. Alle Schnittstellen-Methoden müssen implementiert werden. Java unterstützt auch unvollständige(abstract) Klassen Rechte Parameternamen können beliebig verändert werden. Ergebnistyp verkleinern ist erlaubt. Exeptions dürfen direkt behandelt werden. (aber keine Zusätzlichen dürfen geworfen werden) beliebige weitere Attribute und Methoden erlaubt. Schnittstelle kann als Datentyp verwendet werden (Variablen, Parameter, Ergebnisse), aber keine Objekte davon erzeugen. Satz: Eine Klasse kann auch mehrere Schnittstellen implementieren class Dreieck implements Konvex, Polygon Falls zwei Schnittstellen eine identische Methode deklarieren, wird dies durch eine Implementiert überschrieben.

23 Code-Style: Als Typebezeichner in der Regel Schnittstellentypen verwenden, Klassentypen nur bei Erzeugung mit new verwenden. Benutzer weiß nicht einmal wie die Implementierung heißt, kennt nur die Schnittstelle. Beispiel: Integer-Stack void add( Stack S) { s. push( ( Integer ) s. pop () + ( Integer ) s. pop ( ) ) ; Problem Keine Konstruktoren in Schnittstellen Mögliche Lösung. ( abstract factory pattern ) class StackFactory { public static Stack createstack (){ return new MyStack ( ) ; 2.3 Anonyme Klassen interface Funktion { double von(double x ) ; class xq implements Funktion { public double von(double x){ return x x ; Funktion f= new xq ( ) ; f. von ( 3 ); new Funktion (){ public double von(double x){return 2 x. von ( 5 ); 2.4 Polymorphe Typsystem Vielgestaltigkeit Definition: ein und derselbe Prozedurname kann sich auf verschiedene Prozeduren beziehen. In Java: Universelle Poymorphie

24 Universelle Polymorphie Parametrische Polymorphie (Generizitaet) Einschluss-Polymorphie (Vererbung) Vererbung (inheritance) Erweiterung (extension) Klasse (oder Schnittstelle) Y wird als Erweiterung der Klasse X vereinbart und erbt damit die Eigenschaften von X. class X { Text von X class Y extends X { Text von Y // entspricht fast // class Y { Text von X ; Text von Y Sprechweise: Y heißt Unterklasse/Spezialisierung von X X heißt Oberklasse/Verallgemeinerung von Y class Konto{ int nummer; int geld void einzahlen ( int menge) {... boolean abheben( int menge) {... class VerzinstesKonto extends Konto { int zinssatz void berechezins () {... class A { class B extends A{ class C extends B{ class D extends B{

25 A B C D Schnittstellenvererbung interface X {Text von X interface Y extends X {Text von Y // entspricht fast // interface Y {Text von X; Text von Y <<interface>> Y <<interface>> X class A extends B implements I { class C extends A { // C implementiert somit auch I Mehrfachvererbung bei Klassen in Java nicht möglich, bei Schnittstellen schon. interface I extends X,Y,Z {

26 2.4.4 Typ-Verträglichkeit Idee: Ist Y Unterklasse von X, kann ein Y-Objekt wie ein X-Objekt benutzt werden (da es alle Eigenschaften eines X-Objektes hat.) Definition: Wir nennen einen Klassentype Y mit einem Klassentyp X verträglich, wenn Y Unterklasse (direkt oder indirekt) von X ist. Konto a = new VerzinstesKonto ( ) ; a. einzahlen ( ) a. berechnezins ( ) ; // gibt statischen Fehler, da Konto Objekte die Methode nicht Definition: Statischer Typ einer Variable ist der vereinbarte Variablentyp Dynamischer Typ einer Variable ist der Typ des Objektes, auf das verwiesen wird. Der dynamisch Typ ist immer mit dem statischen Typ verträglich. Typanpassung (casting) Konto a = new VerzinstesKonto ( ) ; a. einzahlen (a ) ; Verzinsteskonto s = ( Verzinsteskonto ) a ; // stat. Type von s i s t Verzinstes Konto s. berechnezins ( ) ; // kuerzer (( VerzinstesKonto ) a ). berechnezins ( ) ; Typkorrektheit bei der Typanpassung: (dynamisch Überprüfung, ggf. ClassCastException) ist Korrekt, wenn der dynamische Typ von x B oder ein Untertyp von B ist. A x ; (B)x ; Typkorrektheit bei Vergleichen(Verweisen): ist typkorrekt gdw. der stat. Typ von a ein Untertype von b ist oder wenn einer ein Schnittstellentyp ist. a == b Prüfen des dynamischen Typs x instanceof A typkorrekt genau dann wenn der stat. Typ von x Untertype von A ist (oder umgekehrt) oder wenn einer ein Schnittstellentyp ist. liefert true genau dann wenn der dyn. Typ von x ein Untertyp von A ist. Konto a = new VerzinstesKonto ( ) ; Konto b = new Konto ( ) ; a instanceof VerzinstesKonto // true a instanceof Konto // true b instanceof VerzinstesKonto // false

27 2.4.5 Verdecken, Ersetzen und Identifizieren von Methoden und Attributen bei Namenskollisionen vertikale Kollisionen : bei Attributen, Klassen, Schnittstellen: verdecken (hiding); class A{ int m; class B extends A { float m; bei Methoden verschiedene Signaturen: überladen (overloading) class A { f ( int x){ class B extends A { f ( float x) { B x = new B( ) ; x. f ( 1 ) ; // f aus A x. f ( 1. 2 ) ; // f aus B gleiche Signatur: beide Statisch: verdecken beide nicht statisch: ersetzen sonst Fehler zur Übersetzungszeit Sichtbarkeit verdeckender Namen darf nicht geringer sein, als die der verdeckten, ersetzten Eigenschaften class C { boolean x ; static int n ; char y ; static void op () { n=1; class D extends C { float n ; // verdeckt statisches int n static int x ; // verdeckt boolean x char y ; // verdeckt char y static void op () { n=1; // geht nicht, da n nicht static

28 Verhindern von Ersetzen/Verdecken Unterklassenbildung verhindern final class C {... ; verhindert das Ersetzen von op() in Unterklasse final void op () { ; class A{ void op1 () { op2 ( ) ; void op2 () { class B extends A { void op2 () { new B( ). op1 ( ) ; // andere Funktionalitaet als op () von A // verhaelt sich anders als erwartet Vererbung zwischen Schnittstellen: interface I { String label = I ; interface J extends I { String label = J ; class C implements J { print ( label ) // gibt J aus Verdecken statischer Methoden class A { static void p() { print ( A ) ; class B extends A { static void p() { print ( B ) ; A a = new B( ) ; // statisch nicht stat. a. p ( ) ; // A B new B( ). p() // B B ((A)new B( ) ). p () // A B ((B)a ). p ( ) ; // B B Abstakte Klassen Definition: Eine Klasse heißt abstrakt, wenn mind. eine ihre Methoden nicht implementiert ist. Diese muss, wie die Klasse selbst als abstract deklariert werden. Instanziierung nicht möglich, aber als Typ bzw. Oberklasse verwendbar.

29 abstract class Muster{ float x, float y ; void bewege ( float dx, float dy){... abstract float flaeche ( ) ; class Quadrat extends Muster{ float s ; float flaeche (){ return s s ; class Kreis extends Muster{ float r ; float flaeche (){ return Math. PI r r ; abstract class A{ abstract void m1( ) ; void op () {.. ; void op2 () {.. ; class B extends A{ void m1( ) {... ; abstract class C extends A{ void m1( ) {... ; abstract m2 ( ) {... ; abstract class D extends A{ void m2( ) {... ; class E extends A{ void m2( ) {... ; Object Die Klasse Object aus java.lang ist implizit Oberklasse jeder Klasse. class Object { public String tostring () {... ; // Textuelle Beschreibung public boolean equals ( Object x) {... ; // Gleichheit der Referenzen protected Object clone () {... // l i e f e r t flache Kopie throws CloneNotSupportedException {... ; protected f i n a l i z e () {... ; // von Speicherbereinigung aufgerufen

30 Psudo-Generizität mittel Object Stack s = new Stack ( ) ; String t = teest ; s. push (( Object ) t ) ; String u = ( String ) s. pop ( ) ; 2.5 Generizität Stack integerstack = new ArrayStack ( ) ; // b i t t e nur fuer Integer verwenden integerstack. push ( abc ) ; // i s t erlaubt, da Objekt Typvariablen interface Stack<T> { void push (T x ) ; T pop ( ) ; class MyStack<T> implements Stack<T>{... Stack<Integer > istack = new MyStack<Integer >(); istack. push ( abc ) ; // Typfehler String!= Integer class C{ static <T> T blah ( Stack <T> s, T t ){ C.< Interger >blah (new Stack<Integer > new Integer ( 3 ) ) ; C. blah (new Stack<Integer > new Integer (3)) // Automatisch mit Integer aufgerufen Eigenschaften istack hat Type Stack < Integer >. Number ist Obertyp von Integer, aber Stack < Number > ist nicht Obertyp von Stack < Integer > Number n = new Integer (4); Stack<Number> s = new MyStack<Integer >() // sonst wuerden Probleme auftauchen : s. push (new Double ( 1. 2 ) ) ; Was ist also Obertyp von Stack < Integer >, Stack < String >? Nicht Stack < Object >, sondern Stack <? >? ist ein Joker und bedeutet unbekannter Typ. null hat den Typ?. // Fehler Stack<?> s = new MyStack<String >(); // ok s. push (new Integer ( 3 ) ) ; // Fehler s. push ( abc ) ; // Fehler s. pop ( ) ; // Erlaubt! Wird ein Objekt

31 Stack<? extends Number> s ; Number n = s. pop ( ) ; // Stack von Untertyp Number // ok Stack<? super Number> s ; // Stack mit Obertyp Number p. push ( Integer ( 5 ); // Geht p. pop ( ) ; // Object Zusaetzliche Schnittstellen sind Erlaubt: <? extends Number & Interface1 & Interface2> Technisch: Java Compiler prüft Typsicherheit und entfernt danach alle Typinformationen. Intern wird Object verwendet. new Vector ( ) ; new Vector<Object >(); // raw type // besser, aber das gleiche x instence of T; // immer true T x = new T( ) ; // geht auch nicht. T[ ] x = new T [ ] ; // geht auch nicht. T x = (T) y // Warning static <T extends Object & Compareable<? super T>> T max( Collection <? extends T> c ) ; Spaßveranstaltung: Schluss, schon um 15:09

32

33 Kapitel 3 ADTs - Anwendungen - Implementierungen 3.1 ADT Prioritätswarteschlange Geg: n ganze Zahlen x 1,,x n mit x i + x j i j Ges: Sortierung π : {1,,n {1,,n mit x π(1) < x π(2) < < x π(n) Angenommen, wir haben eine ADT, der eine Menge S von n Zahlen unter folgenden Operationen verwaltet: f indmin() liefert min S deletemin() S S \ min S init(x) S X Dann kann X mit X = n wie folgt sortiert werden: S. i n i t (X) for i = 1... n do print S. findnmin ( ) ; S. deletemin ( ) ; Die Laufzeit ist T(init(X)) + n(t(findmin()) + T(deletemin())) we proudly present: Knauers List-Sort Implimentierung als verkettete Liste Sortieren mit dieser Implementierung: O(n) + n(o(n) + O(n)) = O(n 2 ) Implimentierung als Folge unsortierter Listen + Folge der Minima dieser Listen Implementierung: Heap Einfügen suche den freien Platz speichere das neue Element an diesem Platz 31

34 stelle Ordnung wieder her: wenn wir einen neuen Schlüssel k einfügen, kann die Heap-Ordnung verletzt werden. wir stellen diese dadurch wieder her, dass wir k auf dem Pfad zur Wurzel mit Schlüsseln vertauschen, die größer sind da der Heap die Höhe log(n + 1) hat, werden dafür nur O(log n) Schritte benötigt. Löschen aus einem Heap entferne das Element Wurzel vertausche zunächst den Schlüssel der Wurzel mit dem Schlüssel des letzten Knotens herstellen der Heap-Eigenschaft: vertausche (von der Wurzel ausgehend), das aktuelle Element mit dem m Minimum seiner Kinder, solange k < m die Anzahl der Vertauschungen ist durch die Höhe beschränkt, also O(log n) Flache Implementierung über Arrays Wir können einen Heap mit n Elementen in einem Feld der Länge n abspeichern. Für den Knoten mit Index i wird das linke Kind bei Index 2i das rechte Kind bei Index 2i + 1 gespeichrt das letzte Element ist bei Index n gespeichert, die erste freie Position im Feld ist n + 1 Dynamisierung durch iteriertes Verdoppeln/Halbieren, sodass man eine amortisierte Laufzeit für insert/deletemin 1 2*1 2* *2 2*2+1 3*2 3*2+1 k *k 2*k+1 2k 2k+1

35 3.1.3 Folgerung/Anwendung Wenn wir ADT Prioritätswarteschlange mit binären Heaps implementieren, können wir in O(n log n) Zeit sortieren Heapsort Aufbau des Heaps durch n-faches insert O(n log n) Sortieren, in dem man n-mal deletemin aufruft O(n log n) Erweiterung des ADT Prioritätswarteschlange Ziel: effiziente Implementierung der Operation meld(p,q) liefert PWS in der alle Objekte der PWS P und Q gespeichert sind Binomialheaps Heaps implementiert mit Binomialbäumen Baum i + 1 entsteht durch das hinzufügen des Baums i an die Wurzel Beispiel: Elemente nur in verschiedenen Bäumen jede Zahl kann man aber nur in log n Baume aufteilen Bsp: 13 = Binomial Heap Ein Binomialheap für n Elemente speichert diese in einer Folge von Binomialbäumen Die binomialen Teilbäume sind Heap-geordnet in dieser Folge gibt es keine zwei Bäume von gleichem Grad diese Folge besteht aus O(log n) Bäumen, deren Grade eindeutig durch n bestimmt sind (Binärdarstellung) die Wurzel der Bäume sind in einer verketteten Liste gespeichert, die nach Grad sortiert wird.

36 Verschmelzen von Binomialheaps P,Q P: Q: P = 7 (1110) Q = 10 (0101) P (10001) >< >: durchlaufe die Wurzellisten von P und Q (angefangen bei kleinstem Grad) zu jedem Zeitpunkt gibt es maximal einen Baum C, der als Übertrag aus dem vorherigen Schritt weitergereicht wird sei A der aktuelle Binomialbaum von P; B der aktuelle von Q kein C C 8 8 >< min(b) < min(a) mache A zum Kind der Wurzel von B >< deg(a) = deg(b) erzeuge somit einen B i+1 und füge ihn in die Liste des Ergebnisses >: sonst umgekert deg(a) < deg(b) schreibe A in die Wurzelliste von P Q und ersetzte A durch das nächste Element >: deg(a) > deg(b) symetrisch 8 n deg(a) = deg(b) = deg(c) = i schreibe A in die Wurzelliste von P Q min(c) > min(b) mache C zum kind von Bsonst umgekerht >< deg(c) < min(deg(a), deg(b)) schreibe C in die Wurzellist von P Qes gibt keinen neuen Uebertrag mehr deg(c) = deg(a) < deg(b) verschmelze C und A und erzeuge damit einen neuen B i+1, der als neuer Uebertrag fungiert. Ersetze ferne A durch das naechste Element in der Wurzellist von P >: deg(c) = deg(b) < deg(a) analog Das Verschmelzen von zwei Binomialheaps die je n Elemente speichern, kann in O(log n) Zeit erfolgen. Binäre Addition Einfügen in Binomialheap zum Einfügen eines Elementes x in Binomealheap P erzeugen wir einen Binomialheap Q der Größe 1 mit Element x und verschmelzen diesen mit P. dies geht also in O(log n) Löschen Suchen des Minimums in der Wurzelliste ( O(log n)) Sei A der Binomialbaum, der das min. speichert. Entferne A aus dem Binomialheap Dies liefert einen neuen Bin.Heap P

37 Ist A ein Bin.Baum von Grad i, so sind die Kinder seiner Wurzel Binom. Bäume von Grad 0,1,,i 1 all diese koennen in O(log n) Zeit in einer Wurzellist neue verkettet werden, sodass ein neuer Bin.Heap Q entsteht. rufe meld(p,q) auf ( O(log n)) Insgesamt wird also O(log n) Zeit für deletemin benötigt. 3.2 Bäume w mathematisch zusammenhängender Graph ohne Kreise infomatisch gerichteter Graph T = (V, E) Wurzel w V jeder Knoten v V {W hat einen Vorgänger p(v) (u,v) E v heißt Nachfolger von u Blätter/externe Knoten = Knoten ohne Kinder Tiefe eines Knoten = Länge des Pfades von w nach v Höhe (des Baumes) = max. Tiefe eines Knotens Ordnung auf den Kindern eines Knotens ADT Baum ADT Knoten Speichert ein Objekt Item (vom Typ E) Manipulation/Zugriff durch Methoden: setitem(e x) E getitem() Methoden auf Baum Zugriff auf Wurzel: Knoten getroot()

38 generische Methoden int size() boolean isempty() List < E > getelements() List < Knoten > getn odes() Knoten getparent(knoten p) List < Knoten > getchildren(knoten p) boolean isleaf(knoten p) boolean isroot(knoten p) Implementierung von Bäumen Knoten u speichert (Referenzen auf) das mit u assoziierte Objekt (vom Typ E) Vorgänger von u die Liste der Kinder von u Platzbedarf zum Speichern von n Knoten ist O(n) Spezialfall - Binäre Bäume Jeder Knoten hat max. 2 Kinder In einem proper/sauber/wohlen/...binärbaum hat jeder Knoten genau 2 Kindern Bei geordneten Binärbäumen sprechen wir von linken und rechten Kindern Bei Implementierung können die Referenzen auf Kinder direkt im Knoten gespeichert werden Implementierung von Binären Bäumen durch Arrays Baum der Höhe h wird in Feld mit 2 h+1 1 Elementen gespeichert. Die Wurzel wird im 1-ten gespeichert. Das linke (rechte) Kind des Knotens das beim i-ten Eintrag gespeichert ist, wird beim 2i-ten (2i + 1-ten) Eintrag gespeichert Achtung: Schlimmstenfalls wird Ω(2 n ) Platz benötigt Lokalisieren von Einträgen im Datenstrukturen Prinzipiell können wir die ganz Struktur nach einem Objekt das wir entfernen wollen durchsuchen. ineffizient

39 Beispiel: für Modifikationen entfernen eines Elements erniedrigen der Priorität eines Eintrags in einem PWS Lösung Einträge in der Datenstruktur wissen wo sie gespeichert sind. PQEntry insert (Key k, Item x) P QEntry speichert: Priorität des Objektes Gespeichertes Objekt Position des Eintrags in der Struktur PQEntry p o 1 PQEntry P O Algorithmen auf Bäumen Arithmetische Ausdrücke mit ganzen Zahlen binäre Operationen +,, ganze Zahlen rekursiv definiert x Z ist ein arithmetischer Ausdruck e,f arithmetische Ausdrücke (e + f),(e f),(e f) sind Ausdrücke zu arithmetischen Ausdrücken können wir Ausdrucksbäume definieren ((2+5)-(7*12)) - + *

40 3.2.7 Baumtraversierung inorder besuche erst alle linken Teilbäume d. Wurzel, dann die Wurzel, dann alles im rechten. preorder erst die Wurzel, dann linken, dann rechten postorder erst linken, dann rechten dann Wurzel Zeichnung von Bäumen use graphviz G H E F B A D A B C C J D E J K I K Knoten A B C D E F G H I J K Tiefe inorder Num Dies gibt schon die Koordinaten des Knotens an: x(v) = inorder-nummer von v y(v) = Tiefe von v I H G F Laufzeit Bei allen Traversierungen wird jeder Knoten nur O(1) mal besucht. Dieses Verfahren benötigt daher O(n) Zeit. 3.3 Wörterbücher(Dictonary) Abstrakter Datentyp modelliert eine Ansammlung von Einträgen. Jeder Eintrag besteht aus einem Schlüssel und einem Datum. In dieser Sammlung von Einträgen wollen wir (effizient) nach Einträgen mit gegebenem Schlüssel suchen. (verschiedene Einträge können den gleichen Schlüssel haben.) Beispiel: Telefonbuch, Symboltabelle, DNS-Listen Methoden f ind(keyk) Liefert einen Eintrag aus dem Wörterbuch, dessen Schlüssel k ist, falls dieser existiert. findall(key k) Liefert eine Liste aller Einträge deren Schlüssel k ist.

41 insert(key k,data d) Fügt ein Eintrag mit Schlüssel k und Datum d zu dem Wörterbuch hinzu. delete(entry e) Löscht den Eintrag e aus der Struktur. entries() Liefert Liste mit allen Einträgen Implementierung 1. Verkettete Liste Laufzeiten auf WB. mit n Einträgen Platzbedarf Θ(n) find O(n) insert O(1) delete O(1) Hashing (Streuspeicherung) Eine Hashfunktion h bildet Schlüssel aus einer Menge U(Schlüsseluniversum) in ein Intervall [0,,N 1] N Beispiel: für eine H.fk. N [0,,N 1]: h(x) = x mod N h(x) nennt man dem Hashwert des Schlüssels x Eine Hashtabelle für eine Schlüsseluniversum U besteht aus eine Hfk. h: U [0,,N] einen Array (Hashtabelle der Größe N) Idee: Eintrag mit Schlüssel k U wird bei T(h(k)) gespeichert. Beispiel: Hashfunktion für U = Zeichenketten N = 1000 Eine Hfn wird üblicherweise als Komposition von zwei Funktionen dargestellt 1. h 1 : U N 2. h 2 : N [0,,N 1] Idee: h 2 soll die Schlüssel möglichst gleichmäßig in [0,,N 1] verteilen. Oft verwendete Hashcodes Speicheradressen: interpretiere die Adresse von k als eine ganze Zahl. Casten auf Integer. (für Schlüssel deren Länge beschränkt ist: float, byte,...) Für Schlüssel unbeschränkter Länge, Partitionieren in kleine Teile, casten zu int und Aufsummierung Oft verwendete Kompressionsfunktionen h 2 (x) = x mod N dabei wählt man üblicherweise N als Primzahl h 2 (x) = (ax + b) mod N wobei a,b N mit a 0 mod N

42 3.3.4 Hasing mit Verkettung Idee Eintrag mit Schlüssel k soll in H.Tab T an Pos h(k) gespeichert werden. Kollision Einträge e 1,e 2 mit Schlüssel k 1,k 2 mit h(k 1 ) = h(k 2 ) Lösung Jeder Eintrag T[i] zeigt auf eine verkettete Liste, in der alle Einträge gespeichert sind, mit h(k) = i Universum U und Tabelleneinträge S n := S << U =: u Hashfunktion h : U [0,,N 1] Tabelle T mit N eintragen w 1 2 a b u _ h(x) _ x y N z einfügen/löschen eines Eintrags e mit Schlüssel k find (k) Analyse berechne i = h(k) füge e in L[i] ein / lösche e aus L[i] berechne i = h(k) traversiere L[i] um alle e L[i] zu finden deren Schlüssel k ist. Platzbedarf zum Speichern von n Elementen: O(n + N) Laufzeit (bei n gespeicherten Elementen) find: O(n) im worst case! Zu x U sei C S (x) := {y S h(x) = h(y) Beobachtung: Falls h in O(1) Zeit ausgerechnet werden kann, dann ist die Laufzeit von find, insert, delete O(1 + C s (x)) Bem: Im schlechtesten Fall ist C s (x) = n Nach dem Schubfach-Prinzip gibt es im Fall n k N mindestens ein x S mit C S (x) k Mittlere Laufzeit von Hashing h sei fest, S wird zufällig (gleichverteilt) aus U gewählt. Wahrscheinlichkeit W = {S sup U S = n ) 1 ( u Die Wahrscheinlichkeit von S supu ist p S = 1 W = n Für festes x U betrachten wir C S (x)(zufallsvariable) Wir wollen den Erwartungswert E[C S (x)] = p S C S (x) = 1 W S W C S (x) S W

43 C S (x) = y Sh(x)=h(y) 1 = Damit: E[C S (x)] = 1 W NR: 1 W y Uh(x)=h(y) S W y Uh(x)=h(y) i S (y) mit i S (y) = = 1 W y Uh(x)=h(y) { 1 y S 0 y / S i s (y) i S (y) = E[i S (y)] = Pr(i S (y) = 1) 0 + Pr(i S (y) = 0) 0 = Pr(y S) S W u 1 n 1 Pr(y S) = u n Damit: E[C S (x)] = 1 A 1 A = n u y Uh(x)=h(y) n u h 1 (h(x)) = {y U h(x) = h(y) Definition: Eine Hashfunktion h : U [0,,N 1] ist fair, wenn für alle i [0,,N 1] gilt: {y U h(y) = i u N Beispiel: U = {0,,u 1 h : x x mod N ist fair Falls h fair ist, gilt E[C S (x)] n u (1 + u N ) = n N + n u Belegungsfaktorβ Zusammenfassung Für eine faire Hashfunktion ist die erwartete Laufzeit der Operationen f ind, insert und delete für ein festes x U bezüglich einer unter Gleichverteilung gewählten Menge S supu mit n = S O(1 + n N ) Bemerkungen mit N = Θ(n) erhalten wir O(1) erwartete Laufzeit falls n a priori nicht bekannt ist, kann durch sukzessives Verdoppeln/Halbieren der Tabellengröße eine amortisierte erwartete Laufzeit erreicht werden. alternativer Ansatz universelles Hashing 3.4 ADT Geordnete Wörterbücher U ist total geordnet: < U weitere Methoden first() last() next(e) prev(e)

44 3.4.1 Implementierung Beispiel: U = N S = {17,3,12,1,4,7,9, Suchen mittels Binärersuche in O(log n) Nachfolger : Suchen + nächstes Feld O(log n) Vorgaenger : Suchen + nächstes Feld O(log n) Problem: Einfügen+Löschen erfordert Σ(n) Zeit Binäre Suchbäume Ein binärer Suchbaum für eine Menge S speichert in den inneren Knoten Elemente aus S. Die Blätter (externe Knoten) dienen als Platzhalter. Darüber hinaus gilt die Suchbaumeigenschaft. Bem: Zu einem inneren Knoten u bezeichnet key(u) den bei u gespeicherten Schlüssel. Sei v ein innerer Knoten, u ein innerer Knoten aus dem linken, w ein innerer Knoten aus dem rechten Teilbaum unter v. Dann gilt: key(u) u key(v) u key(w) Beispiel: Suche Suche nach k U durchläuft einen Pfad im Suchbaum, ausgehend von der Wurzel. Welcher Knoten als nächster besucht wird, hängt vom Vergleich zwischen k und dem Schlüssel des aktuellen Knotens u ab. 1. k = key(u) Suche erfolgreich beendet, gib u aus 2. k < Key(u) Such im linken Teilbaum weiter 3. k > Key(u) Such im rechten Teilbaum weiter Einfügen Suche nach dem Schlüssel unter dem wir einfügen wollen Falls die Suche bei einem inneren Knoten terminiert, gibt es bereits einen Eintrag unter diesem Schlüssel. Diesen überschreiben wir. Sonst terminiert die Suche bei einem externen Knoten. In dem Fall expandieren wir diesen in einen inneren Knoten, bei dem wir den neuen Schlüssel speichern (dieser innere Knoten erhält zwei externe Knoten als Kinder) Löschen eines Schlüssels k 1. Suchen Knoten der k speichert Fall 1 u hat mindestens ein externes Kind: Knoten kann entfernt werden und der Teilbaum unter diesem an seine Stelle eingefügt werden.

45 Fall 2 u hat keine externen Kinder Suche den internen Knoten w, der u in einer Inorder-Traversierung folgt kopiere die Daten von w nach u entferne w und sein linkes Kind Bem: key(w) ist der Nachfolger von k w kann gefunden werden, indem wir im rechten Teilbaum unter w nach links gehen das linke Kind von w ist immer ein externer Knoten. Analyse Platzbedarf zum Speichern von n Elementen: O(n) Laufzeit für die Operationen proportional zur Höhe des Baumes Höhe von binären Suchbäumen Im schlechtesten Fall Θ(n) Analyse der Suchzeit im Mittel Wir betrachten folgendes Experiment: Wähle zufällig unter Gleichverteilung ein Element w, als Wurzel des Suchbaums. Wir bauen auf die gleiche Art für alle Element < w rekursiv einen Suchbaum = 13 Die innere Pfadlänge eines Baumes ist die Summe der Tiefen aller inneren Knoten Sie entspricht der Summe der Suchzeite nach den im dem Baum gespeicherten Schlüsseln. Beispiel: i n C n = (n 1) = Θ(n 2 ) C n = k 1 i=0 i 2i = Θ(k 2 k ) = Θ(n log n) Die mittlere erwartete innere Pfadlänge C n in einem Baum mit n Knoten:

46 n 1 C n = (i {{ 1 + n {{ i) + C i 1 + C n i = (n 1) (C i + C n i 1 ) n links rechts i=1 {{ Warscheinlichkeit n n n i=1 (C i 1 + C n i ) = C i 1 + C n i = 2 n i=1 C i 1 i=1 {{ C 0 +C 1 + +C n 1 i=1 {{ C n 1 +C n 1 + +C 0 C n = (n 1) + 2 n nc n = (n 1)n + 2 n C i 1 (3.1) i=1 n C i 1 (3.2) i=1 n+1 (n + 1)C n+1 = n(n + 1) + C i 1 (3.3) i=1 (n + 1)C n+1 nc n = n(n + 1) n(n 1) + 2C n = 2n + 2C n (3.4) (n + 1)C n+1 = nc n + 2n + 2C n = (n + 2)C n + 2n (3.5) C n+1 C n 2n = + (3.6) n {{ + 2 n {{ + 1 (n + 1)(n + 2) B n+1 B n Also B n+1 = B n + 2n (n+1)(n+2) 2(n+1) (n+1)(n+2) = 2 n+2 B n+1 = B n + 2 n+2 = B n n n+2 B 0 + n i=0 2 i+2 2 n 1 0 i+2di 2,8log n C n = O(n log n) Einschub: Randomisiertes Quicksort Aufgabe: Gegeben S N mit S = n, sortiere S Algorithmus Wahle s 0 S zufällig Teile S auf in S < = {s S s < s 0 und S > = {s S s > s 0 Sortiere S <, gib s 0 aus, sortiere S >

47 1 2 3 Beispiel: Laufzeit n Laufzeit n log n Analyse: Erwartungswert der Laufzeit (bzgl. aller möglicher Zufallsentscheidungen) D n : erwartete Laufzeit zum Sortieren eine Menge der Größe n D n c n + n 1 i=1 1 n (D i + D n 1 1 ) Wie vorher D n = O(n log n) Balancierte Suchbäume (2-4-Bäume, Rot-Schwarz-Bäume) Mehrweg-Suchbäume Ein Mehrweg-Suchbaum für eine Schlüsselmenge S hat folgende Struktur jeder innere Knoten hat d 2 Kinder und speichert d 1 Elemente aus S Für einen internen Knoten, der die Kinder v 1,,v d hat und der die Schlüssel k 1,,k d 1 speichert, gilt: die Schlüssel im Teilbaum mit Wurzel v 1 sind alle < k 1 die Schlüssel im Teilbaum mit Wurzel v d sind alle > k d 1 die Schlüssel im Teilbaum mit Wurzel v i sind alle > k i 1 und < k i Die Blätter sind Platzhalter Bem: Suchen analog zum binären Fall. Laufzeit ist O(Höhe Grad) Inorder Traversierung: analog zu binären Suchbäumen. Laufzeit ist O(n) 30

48 (2,4)-Bäume Ein (2,4)-Baum ist ein Mehrweg Suchbaum, bei dem jeder interne Knoten 4 Kinder hat und alle Blätter die gleiche Tiefe haben Lemma: Die Höhe eines 2-4 Baumes der n Schlüssel speichert ist Θ(log n) Einfügen Beispiel: Einfügen 9: Einfügen 30: Reparieren: v 1,,v 5 seien Kinder, k 1,,k 4 Schlüssel von v ersetzen v durch v : 3 Knoten mit Schlüssel k 1,k 2, Kinder v 1,v 2,v 3 v : 2 Knoten mit Schlüssel k 4, Kinder v 4,v 5 k 3 wird in die Mutter von v eingefügt. (evtl wird dabei eine neue Wurzel erzeugt) Evtl. kann nun die Mutter von v überlaufen Analyse Suchen kostet O(log n) Zerteilen eines Knotens geht in O(1) Überlaufen propagiert zur Wurzel hin, dh. es gibt nur O(log n) Überlaufe. Dh. Einfügen kann in O(log n) Zeit erfolgen

49 Löschen Betrachte den Fall, dass der Knoten aus dem wir löschen nur Blätter als Kinder hat. (Ansonsten ersetzen wir den zu löschenden Schlüssel durch seinen Vorgänger und entfernen an dessen alter Position) Löschen von 9, 27, Löschen kann einen Unterlauf erzeugen (v wird zu eine 1-Knoten mit 1 Kind und 0 Schlüsseln)

Algorithmen und Programmierung

Algorithmen und Programmierung Algorithmen und Programmierung Daniel Waeber Semester 3 Inhaltsverzeichnis 1 Analyse von Algorithmen 5 1.1 Laufzeit von Algorithmen............................. 5 1.1.1 Experimentelle Analyse..........................

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Universität Innsbruck Institut für Informatik Zweite Prüfung 16. Oktober 2008 Algorithmen und Datenstrukturen Name: Matrikelnr: Die Prüfung besteht aus 8 Aufgaben. Die verfügbaren Punkte für jede Aufgabe

Mehr

Abstrakter Datentyp (ADT): Besteht aus einer Menge von Objekten, sowie Operationen, die auf diesen Objekten wirken.

Abstrakter Datentyp (ADT): Besteht aus einer Menge von Objekten, sowie Operationen, die auf diesen Objekten wirken. Abstrakte Datentypen und Datenstrukturen/ Einfache Beispiele Abstrakter Datentyp (ADT): Besteht aus einer Menge von Objekten, sowie Operationen, die auf diesen Objekten wirken. Datenstruktur (DS): Realisierung

Mehr

Informatik II Prüfungsvorbereitungskurs

Informatik II Prüfungsvorbereitungskurs Informatik II Prüfungsvorbereitungskurs Tag 4, 9.6.2017 Giuseppe Accaputo g@accaputo.ch 1 Aufbau des PVK Tag 1: Java Teil 1 Tag 2: Java Teil 2 Tag 3: Algorithmen & Komplexität Tag 4: Dynamische Datenstrukturen,

Mehr

In C und Java müssen Variablen und Methodenergebnisse durch Typangaben erläutert werden. Welche der folgenden Aussagen sind korrekt und welche nicht:

In C und Java müssen Variablen und Methodenergebnisse durch Typangaben erläutert werden. Welche der folgenden Aussagen sind korrekt und welche nicht: Typprüfung (Compiler / Laufzeit) In C und Java müssen Variablen und Methodenergebnisse durch Typangaben erläutert werden. Welche der folgenden Aussagen sind korrekt und welche nicht: 1) Der Compiler prüft

Mehr

11. Elementare Datenstrukturen

11. Elementare Datenstrukturen 11. Elementare Datenstrukturen Definition 11.1: Eine dynamische Menge ist gegeben durch eine oder mehrer Mengen von Objekten sowie Operationen auf diesen Mengen und den Objekten der Mengen. Dynamische

Mehr

12 Abstrakte Klassen, finale Klassen und Interfaces

12 Abstrakte Klassen, finale Klassen und Interfaces 12 Abstrakte Klassen, finale Klassen und Interfaces Eine abstrakte Objekt-Methode ist eine Methode, für die keine Implementierung bereit gestellt wird. Eine Klasse, die abstrakte Objekt-Methoden enthält,

Mehr

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

Counting - Sort [ [ ] [ [ ] 1. SS 2008 Datenstrukturen und Algorithmen Sortieren in linearer Zeit Counting-Sort Counting - Sort ( A,B,k ). for i to k. do C[ i]. for j to length[ A]. do C[ A[ j ] C[ A[ j ] +. > C[ i] enthält Anzahl der Elemente in 6. for i to k. do C[ i] C[ i] + C[ i ]. > C[ i] enthält

Mehr

Informatik II Prüfungsvorbereitungskurs

Informatik II Prüfungsvorbereitungskurs Informatik II Prüfungsvorbereitungskurs Tag 4, 23.6.2016 Giuseppe Accaputo g@accaputo.ch 1 Programm für heute Repetition Datenstrukturen Unter anderem Fragen von gestern Point-in-Polygon Algorithmus Shortest

Mehr

Informatik II, SS 2014

Informatik II, SS 2014 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

Mehr

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

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny Grundlagen der Informatik Prof. Dr. Stefan Enderle NTA Isny 2 Datenstrukturen 2.1 Einführung Syntax: Definition einer formalen Grammatik, um Regeln einer formalen Sprache (Programmiersprache) festzulegen.

Mehr

13. Hashing. AVL-Bäume: Frage: Suche, Minimum, Maximum, Nachfolger in O(log n) Einfügen, Löschen in O(log n)

13. Hashing. AVL-Bäume: Frage: Suche, Minimum, Maximum, Nachfolger in O(log n) Einfügen, Löschen in O(log n) AVL-Bäume: Ausgabe aller Elemente in O(n) Suche, Minimum, Maximum, Nachfolger in O(log n) Einfügen, Löschen in O(log n) Frage: Kann man Einfügen, Löschen und Suchen in O(1) Zeit? 1 Hashing einfache Methode

Mehr

f 1 (n) = log(n) + n 2 n 5 f 2 (n) = n 3 + n 2 f 3 (n) = log(n 2 ) f 4 (n) = n n f 5 (n) = (log(n)) 2

f 1 (n) = log(n) + n 2 n 5 f 2 (n) = n 3 + n 2 f 3 (n) = log(n 2 ) f 4 (n) = n n f 5 (n) = (log(n)) 2 Prof. aa Dr. E. Ábrahám Datenstrukturen und Algorithmen SS Lösung - Präsenzübung.05.0 F. Corzilius, S. Schupp, T. Ströder Aufgabe (Asymptotische Komplexität): (6 + 0 + 6 = Punkte) a) Geben Sie eine formale

Mehr

Teil VII. Hashverfahren

Teil VII. Hashverfahren Teil VII Hashverfahren Überblick 1 Hashverfahren: Prinzip 2 Hashfunktionen 3 Kollisionsstrategien 4 Aufwand 5 Hashen in Java Prof. G. Stumme Algorithmen & Datenstrukturen Sommersemester 2009 7 1 Hashverfahren:

Mehr

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

Name: Seite 2. Beantworten Sie die Fragen in den Aufgaben 1 und 2 mit einer kurzen, prägnanten Antwort. Name: Seite 2 Beantworten Sie die Fragen in den Aufgaben 1 und 2 mit einer kurzen, prägnanten Antwort. Aufgabe 1 (8 Punkte) 1. Wie sieht -5 in der 4Bit 2-er Komplementdarstellung aus? 2. Berechnen Sie

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen 1 Algorithmen und Datenstrukturen Wintersemester 2016/17 13. Vorlesung Binäre Suchbäume Prof. Dr. Alexander Wolff Lehrstuhl für Informatik I 2 Dynamische Menge verwaltet Elemente einer sich ändernden Menge

Mehr

Programmieren in Java

Programmieren in Java Einführung in die Objektorientierung Teil 4 Interfaces, innere Klassen und Polymorphie 2 Vererbung im Klassendiagram (Wiederholung) Vererbung repräsentiert eine ist ein Beziehung zwischen Klassen Ware

Mehr

Übungsklausur Algorithmen I

Übungsklausur Algorithmen I Jun.-Prof. Hofheinz, Jun.-Prof. Meyerhenke (ITI, KIT) 08.06.2015 Übungsklausur Algorithmen I Aufgabe 1. (Algorithm Engineering) Nennen Sie zwei Konzepte, die Algorithm Engineering im Gegensatz zu theoretischer

Mehr

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Informatik II Übung 06. Benjamin Hepp 5 April 2017 Informatik II Übung 06 Benjamin Hepp benjamin.hepp@inf.ethz.ch 5 April 2017 Nachbesprechung U5 5 April 2017 Informatik II - Übung 01 2 Nachbesprechung U5 1. Einfach verkettete Listen Keine Probleme 2.

Mehr

Informatik II, SS 2018

Informatik II, SS 2018 Informatik II - SS 2018 (Algorithmen & Datenstrukturen) Vorlesung 6 (7.5.2018) Dictionaries, Binäre Suche, Hashtabellen I / Yannic Maus Algorithmen und Komplexität Abstrakte Datentypen : Dictionary Dictionary:

Mehr

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2)

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2) ALP II Dynamische Datenmengen Datenabstraktion (Teil 2) O1 O2 O3 O4 SS 2012 Prof. Dr. Margarita Esponda 49 Einfach verkettete Listen O1 O2 O3 50 Einführung Einfach verkettete Listen sind die einfachsten

Mehr

Wiederholung. Bäume sind zyklenfrei. Rekursive Definition: Baum = Wurzelknoten + disjunkte Menge von Kindbäumen.

Wiederholung. Bäume sind zyklenfrei. Rekursive Definition: Baum = Wurzelknoten + disjunkte Menge von Kindbäumen. Wiederholung Baum: Gerichteter Graph, der die folgenden drei Bedingungen erfüllt: Es gibt einen Knoten, der nicht Endknoten einer Kante ist. (Dieser Knoten heißt Wurzel des Baums.) Jeder andere Knoten

Mehr

12. Hashing. Hashing einfache Methode um Wörtebücher zu implementieren, d.h. Hashing unterstützt die Operationen Search, Insert, Delete.

12. Hashing. Hashing einfache Methode um Wörtebücher zu implementieren, d.h. Hashing unterstützt die Operationen Search, Insert, Delete. Hashing einfache Methode um Wörtebücher zu implementieren, d.h. Hashing unterstützt die Operationen Search, Insert, Delete. Worst-case Zeit für Search: Θ(n). In der Praxis jedoch sehr gut. Unter gewissen

Mehr

Grundlagen: Algorithmen und Datenstrukturen

Grundlagen: Algorithmen und Datenstrukturen Grundlagen: Algorithmen und Datenstrukturen Prof. Dr. Hanjo Täubig Lehrstuhl für Effiziente Algorithmen (Prof. Dr. Ernst W. Mayr) Institut für Informatik Technische Universität München Sommersemester 2010

Mehr

Definition Ein Heap (priority queue) ist eine abstrakte Datenstruktur mit folgenden Kennzeichen:

Definition Ein Heap (priority queue) ist eine abstrakte Datenstruktur mit folgenden Kennzeichen: HeapSort Allgemeines Sortieralgorithmen gehören zu den am häufigsten angewendeten Algorithmen in der Datenverarbeitung. Man hatte daher bereits früh ein großes Interesse an der Entwicklung möglichst effizienter

Mehr

Kapitel 12: Induktive

Kapitel 12: Induktive Kapitel 12: Induktive Datenstrukturen Felix Freiling Lehrstuhl für Praktische Informatik 1 Universität Mannheim Vorlesung Praktische Informatik I im Herbstsemester 2009 Folien nach einer Vorlage von H.-Peter

Mehr

ALP II Dynamische Datenmengen Datenabstraktion

ALP II Dynamische Datenmengen Datenabstraktion ALP II Dynamische Datenmengen Datenabstraktion O1 O2 O3 O4 SS 2012 Prof Dr Margarita Esponda M Esponda-Argüero 1 Dynamische Datenmengen Dynamische Datenmengen können durch verschiedene Datenstrukturen

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 35 Einstieg in die Informatik mit Java Vererbung Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 35 1 Grundlagen 2 Verdeckte Variablen 3 Verdeckte Methoden 4 Konstruktoren

Mehr

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen Vorlesung Informatik 2 Algorithmen und Datenstrukturen (12 Hashverfahren: Verkettung der Überläufer) Prof. Dr. Susanne Albers Möglichkeiten der Kollisionsbehandlung Kollisionsbehandlung: Die Behandlung

Mehr

Humboldt-Universität zu Berlin Berlin, den Institut für Informatik

Humboldt-Universität zu Berlin Berlin, den Institut für Informatik Humboldt-Universität zu Berlin Berlin, den 15.06.2015 Institut für Informatik Prof. Dr. Ulf Leser Übungen zur Vorlesung M. Bux, B. Grußien, J. Sürmeli, S. Wandelt Algorithmen und Datenstrukturen Übungsblatt

Mehr

12. Dynamische Datenstrukturen

12. Dynamische Datenstrukturen Motivation: Stapel. Dynamische Datenstrukturen Verkettete Listen, Abstrakte Datentypen Stapel, Warteschlange, Implementationsvarianten der verketteten Liste 0 04 Motivation: Stapel ( push, pop, top, empty

Mehr

Vorlesung Datenstrukturen

Vorlesung Datenstrukturen Vorlesung Datenstrukturen Binärbaum Suchbaum Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 356 Datenstruktur Binärbaum Strukturrepräsentation des mathematischen Konzepts Binärbaum

Mehr

Sortieren II / HeapSort Heaps

Sortieren II / HeapSort Heaps Organisatorisches VL-07: Sortieren II: HeapSort (Datenstrukturen und Algorithmen, SS 2017) Vorlesung: Gerhard Woeginger (Zimmer 4024 im E1) Email: dsal-i1@algo.rwth-aachen.de Webseite: http://algo.rwth-aachen.de/lehre/ss17/dsa.php

Mehr

Schnittstellen, Stack und Queue

Schnittstellen, Stack und Queue Schnittstellen, Stack und Queue Schnittstelle Stack Realisierungen des Stacks Anwendungen von Stacks Schnittstelle Queue Realisierungen der Queue Anwendungen von Queues Hinweise zum Üben Anmerkung: In

Mehr

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen Schwerpunkte 7. Verkettete Strukturen: Listen Java-Beispiele: IntList.java List.java Stack1.java Vergleich: Arrays verkettete Listen Listenarten Implementation: - Pascal (C, C++): über Datenstrukturen

Mehr

Informatik II, SS 2014

Informatik II, SS 2014 Informatik II SS 2014 (Algorithmen & Datenstrukturen) Vorlesung 11 (4.6.2014) Binäre Suchbäume II Algorithmen und Komplexität Binäre Suchbäume Binäre Suchbäume müssen nicht immer so schön symmetrisch sein

Mehr

Klausur Algorithmen und Datenstrukturen SS August Arbeitszeit 90 min

Klausur Algorithmen und Datenstrukturen SS August Arbeitszeit 90 min TU Ilmenau, Fakultät für Informatik und Automatisierung FG Komplexitätstheorie und Effiziente Algorithmen Univ.-Prof. Dr. M. Dietzfelbinger, Dipl.-Ing. C. Mattern Klausur Algorithmen und Datenstrukturen

Mehr

ContainerDatenstrukturen. Große Übung 4

ContainerDatenstrukturen. Große Übung 4 ContainerDatenstrukturen Große Übung 4 Aufgabenstellung Verwalte Kollektion S von n Objekten Grundaufgaben: Iterieren/Auflistung Suche nach Objekt x mit Wert/Schlüssel k Füge ein Objekt x hinzu Entferne

Mehr

Das Suchproblem 4. Suchen Das Auswahlproblem Suche in Array

Das Suchproblem 4. Suchen Das Auswahlproblem Suche in Array Das Suchproblem Gegeben. Suchen Lineare Suche, Binäre Suche, Interpolationssuche, Untere Schranken [Ottman/Widmayer, Kap. 3.2, Cormen et al, Kap. 2: Problems 2.-3,2.2-3,2.3-] Menge von Datensätzen. Beispiele

Mehr

13. Dynamische Datenstrukturen

13. Dynamische Datenstrukturen Motivation: Stapel. Dynamische Datenstrukturen Verkettete Listen, Abstrakte Datentypen Stapel, Warteschlange, Sortierte Liste 40 40 Motivation: Stapel ( push, pop, top, empty ) Wir brauchen einen neuen

Mehr

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5. Vererbung Gerd Bohlender Institut für Angewandte und Numerische Mathematik Vorlesung: Einstieg in die Informatik mit Java 23.5.07 G. Bohlender (IANM UNI Karlsruhe) Vererbung 23.5.07 1 / 22 Übersicht 1

Mehr

Datenstrukturen und Algorithmen. Vorlesung 8

Datenstrukturen und Algorithmen. Vorlesung 8 Datenstrukturen und Algorithmen Vorlesung 8 Inhaltsverzeichnis Vorige Woche: ADT Stack ADT Queue Heute betrachten wir: ADT Deque ADT Prioritätsschlange Binomial-Heap Schriftliche Prüfung Informationen

Mehr

Inhaltsverzeichnis. Teil 1 Grundlagen 21. Teil 2 Datenstrukturen 85

Inhaltsverzeichnis. Teil 1 Grundlagen 21. Teil 2 Datenstrukturen 85 Inhaltsverzeichnis Vorwort 13 Umfang 14 Einsatz als Unterrichtsmittel 14 Algorithmen mit Praxisbezug 15 Programmiersprache 16 Danksagung 17 Vorwort des Java-Beraters 18 Hinweise zu den Übungen 19 Teil

Mehr

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

Das Suchproblem. Gegeben Menge von Datensätzen. Beispiele Telefonverzeichnis, Wörterbuch, Symboltabelle 122 4. Suchen Lineare Suche, Binäre Suche, Interpolationssuche, Untere Schranken [Ottman/Widmayer, Kap. 3.2, Cormen et al, Kap. 2: Problems 2.1-3,2.2-3,2.3-5] 123 Das Suchproblem Gegeben Menge von Datensätzen.

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Algorithmen und Datenstrukturen Tafelübung 03 Vererbung, Polymorphie, Sichtbarkeit, Interfaces Clemens Lang T2 11. Mai 2010 14:00 16:00, 00.152 Tafelübung zu AuD 1/26 Klassen und Objekte Klassen und Objekte

Mehr

Datenstrukturen & Algorithmen

Datenstrukturen & Algorithmen Datenstrukturen & Algorithmen Matthias Zwicker Universität Bern Frühling 2010 Übersicht Binäre Suchbäume Einführung und Begriffe Binäre Suchbäume 2 Binäre Suchbäume Datenstruktur für dynamische Mengen

Mehr

Übung Algorithmen und Datenstrukturen

Übung Algorithmen und Datenstrukturen Übung Algorithmen und Datenstrukturen Sommersemester 2017 Patrick Schäfer, Humboldt-Universität zu Berlin Agenda: Kürzeste Wege, Heaps, Hashing Heute: Kürzeste Wege: Dijkstra Heaps: Binäre Min-Heaps Hashing:

Mehr

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

Binäre Suchbäume. Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps Binäre Suchbäume Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps Mengen n Ziel: Aufrechterhalten einer Menge (hier: ganzer Zahlen) unter folgenden Operationen: Mengen n Ziel: Aufrechterhalten einer

Mehr

12.3 Ein Datenmodell für Listen

12.3 Ein Datenmodell für Listen Zweiter Versuch: Wir modellieren ein Element der Liste zunächst als eigenständiges Objekt. Dieses Objekt hält das gespeicherte Element. Andererseits hält das Element- Objekt einen Verweis auf das nächste

Mehr

3. Übungsblatt zu Algorithmen I im SoSe 2017

3. Übungsblatt zu Algorithmen I im SoSe 2017 Karlsruher Institut für Technologie Prof. Dr. Jörn Müller-Quade Institut für Theoretische Informatik Björn Kaidel, Sebastian Schlag, Sascha Witt 3. Übungsblatt zu Algorithmen I im SoSe 2017 http://crypto.iti.kit.edu/index.php?id=799

Mehr

Algorithmen und Programmierung III

Algorithmen und Programmierung III Musterlösung zum 4. Aufgabenblatt zur Vorlesung WS 2006 Algorithmen und Programmierung III von Christian Grümme Aufgabe 1 Amortisierte Analyse 10 Punkte Zu erst betrachte ich wie oft die letzte Ziffer

Mehr

Vererbung, Polymorphie

Vererbung, Polymorphie Vererbung, Polymorphie Gerd Bohlender Institut für Angewandte und Numerische Mathematik Vorlesung: Einstieg in die Informatik mit Java 21.1.08 G. Bohlender (IANM UNI Karlsruhe) Vererbung, Polymorphie 21.1.08

Mehr

Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5

Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5 Robert Elsässer Paderborn, den 15. Mai 2008 u.v.a. Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5 AUFGABE 1 (6 Punkte): Nehmen wir an, Anfang bezeichne in einer normalen

Mehr

Übung Algorithmen und Datenstrukturen

Übung Algorithmen und Datenstrukturen Übung Algorithmen und Datenstrukturen Sommersemester 217 Patrick Schäfer, Humboldt-Universität zu Berlin Agenda: Graphen, Suchbäume, AVL Bäume Heute: Graphen und Bäume Binäre Suchbäume AVL-Bäume Nächste

Mehr

(a, b)-bäume / 1. Datenmenge ist so groß, dass sie auf der Festplatte abgespeichert werden muss.

(a, b)-bäume / 1. Datenmenge ist so groß, dass sie auf der Festplatte abgespeichert werden muss. (a, b)-bäume / 1. Szenario: Datenmenge ist so groß, dass sie auf der Festplatte abgespeichert werden muss. Konsequenz: Kommunikation zwischen Hauptspeicher und Festplatte - geschieht nicht Byte für Byte,

Mehr

Datenstrukturen & Algorithmen

Datenstrukturen & Algorithmen Datenstrukturen & Algorithmen Matthias Zwicker Universität Bern Frühling 2010 Übersicht Sortieralgorithmen Einleitung Heapsort Quicksort 2 Motivation Sortieren ist Voraussetzung für viele Anwendungen Nach

Mehr

Algorithmen und Datenstrukturen 2. Dynamische Datenstrukturen

Algorithmen und Datenstrukturen 2. Dynamische Datenstrukturen Algorithmen und Datenstrukturen 2 Dynamische Datenstrukturen Algorithmen für dynamische Datenstrukturen Zugriff auf Variable und Felder durch einen Ausdruck: Namen durch feste Adressen referenziert Anzahl

Mehr

Theorie zu Übung 8 Implementierung in Java

Theorie zu Übung 8 Implementierung in Java Universität Stuttgart Institut für Automatisierungstechnik und Softwaresysteme Prof. Dr.-Ing. M. Weyrich Theorie zu Übung 8 Implementierung in Java Klasse in Java Die Klasse wird durch das class-konzept

Mehr

public interface Stack<E> { public void push(e e); public E pop();

public interface Stack<E> { public void push(e e); public E pop(); ADS Zusammenfassung René Bernhardsgrütter 02.04.2012 1 Generics Gewähren Typsicherheit und können für verschiedene Datentypen ohne Casts verwendet werden. Beim Erstellen der Klasse werden Platzhalter für

Mehr

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

Das Suchproblem. Gegeben Menge von Datensätzen. Beispiele Telefonverzeichnis, Wörterbuch, Symboltabelle 119 4. Suchen Lineare Suche, Binäre Suche, Interpolationssuche, Exponentielle Suche, Untere Schranken [Ottman/Widmayer, Kap. 3.2, Cormen et al, Kap. 2: Problems 2.1-3,2.2-3,2.3-5] 120 Das Suchproblem Gegeben

Mehr

4. Vererbung Die Klasse Object. Die Klasse Object

4. Vererbung Die Klasse Object. Die Klasse Object 4. Vererbung Die Klasse Object Die Klasse Object Alle Klassen ohne explizit deklarierte Superklasse haben die Klasse Object als Superklasse. Object gehört zum Paket java.lang. Object verfügt über einige

Mehr

13. Bäume: effektives Suchen und Sortieren

13. Bäume: effektives Suchen und Sortieren Schwerpunkte Aufgabe und Vorteile von Bäumen 13. Bäume: effektives Suchen und Sortieren Java-Beispiele: Baum.java Traverse.java TraverseTest.java Sortieren mit Bäumen Ausgabealgorithmen: - Preorder - Postorder

Mehr

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

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen Was bisher geschah abstrakter Datentyp : Signatur Σ und Axiome Φ z.b. ADT Menge zur Verwaltung (Finden, Einfügen, Entfernen) mehrerer Elemente desselben Typs Spezifikation einer Schnittstelle Konkreter

Mehr

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen 7. Schnittstellen Grundlagen zu Schnittstellen 7. Schnittstellen Eine Schnittstelle (Interface) ist eine Spezifikation eines Typs in Form eines Typnamens und einer Menge von Methoden, die keine Implementierungen

Mehr

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax Weitere Beispiele Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts public interface Funktion { boolean istimdefbereich(double x); double wert(double x); String gibbeschreibung(); public interface

Mehr

Inhaltsverzeichnis. Teil 1 Grundlagen 23

Inhaltsverzeichnis. Teil 1 Grundlagen 23 Inhaltsverzeichnis Vorwort 11 Umfang 12 Einsatz als Unterrichtsmittel 12 Algorithmen mit Praxisbezug 13 Programmiersprache 14 Danksagung 15 Vorwort des C++-Beraters 16 Hinweise zu den Übungen 21 Teil 1

Mehr

Einfache Liste: Ein Stapel (Stack) Ansatz. Schaubild. Vorlesung 1. Handout S. 2. Die einfachste Form einer Liste ist ein Stapel (stack).

Einfache Liste: Ein Stapel (Stack) Ansatz. Schaubild. Vorlesung 1. Handout S. 2. Die einfachste Form einer Liste ist ein Stapel (stack). Programmieren I Martin Schultheiß Hochschule Darmstadt Sommersemester 2011 1 / 64 2 / 64 Motivation Hauptteil dieser Vorlesung sind die so genannten. Zur Motivation (und als Vorbereitung der Datencontainer-Klassen

Mehr

Informatik II Vorlesung am D-BAUG der ETH Zürich

Informatik II Vorlesung am D-BAUG der ETH Zürich Informatik II Vorlesung am D-BAUG der ETH Zürich Vorlesung 9, 2.5.2016 [Nachtrag zu Vorlesung : Numerische Integration, Zusammenfassung Objektorientierte Programmierung] Dynamische Datenstrukturen II:

Mehr

8. A & D - Heapsort. Werden sehen, wie wir durch geschicktes Organsieren von Daten effiziente Algorithmen entwerfen können.

8. A & D - Heapsort. Werden sehen, wie wir durch geschicktes Organsieren von Daten effiziente Algorithmen entwerfen können. 8. A & D - Heapsort Werden sehen, wie wir durch geschicktes Organsieren von Daten effiziente Algorithmen entwerfen können. Genauer werden wir immer wieder benötigte Operationen durch Datenstrukturen unterstützen.

Mehr

Vorlesung Datenstrukturen

Vorlesung Datenstrukturen Vorlesung Datenstrukturen Prioritätswarteschlangen Maike Buchin 18. und 23.5.2017 Prioritätswarteschlange Häufiges Szenario: dynamische Menge von Objekten mit Prioritäten, z.b. Aufgaben, Prozesse, in der

Mehr

Teil 1: Suchen. Ausgeglichene Bäume B-Bäume Digitale Suchbäume. M.O.Franz, Oktober 2007 Algorithmen und Datenstrukturen - Binärbäume 1-1

Teil 1: Suchen. Ausgeglichene Bäume B-Bäume Digitale Suchbäume. M.O.Franz, Oktober 2007 Algorithmen und Datenstrukturen - Binärbäume 1-1 Teil : Suchen Problemstellung Elementare Suchverfahren Hashverfahren Binäre Suchbäume (Wiederholung aus Prog 2) Bäume: Begriffe, Eigenschaften und Traversierung Binäre Suchbäume Gefädelte Suchbäume Ausgeglichene

Mehr

Algorithmen und Datenstrukturen Heapsort

Algorithmen und Datenstrukturen Heapsort Algorithmen und Datenstrukturen 2 5 Heapsort In diesem Kapitel wird Heapsort, ein weiterer Sortieralgorithmus, vorgestellt. Dieser besitzt wie MERGE-SORT eine Laufzeit von O(n log n), sortiert jedoch das

Mehr

Einführung in die Informatik 2

Einführung in die Informatik 2 Einführung in die Informatik 2 Listen & Bäume Sven Kosub AG Algorithmik/Theorie komplexer Systeme Universität Konstanz E 202 SvenKosub@uni-konstanzde Sprechstunde: Freitag, 14:00-15:00 Uhr, onv Sommersemester

Mehr

Wiederholung: Zusammenfassung Felder. Algorithmen und Datenstrukturen (für ET/IT) Definition Abstrakter Datentyp. Programm heute

Wiederholung: Zusammenfassung Felder. Algorithmen und Datenstrukturen (für ET/IT) Definition Abstrakter Datentyp. Programm heute Wiederholung: Zusammenfassung Felder Algorithmen und Datenstrukturen (für ET/IT) Wintersemester / Dr. Tobias Lasser Computer Aided Medical Procedures Technische Universität München Ein Feld A kann repräsentiert

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen 1 Algorithmen und Datenstrukturen Wintersemester 2016/17 11. Vorlesung Elementare Datenstrukturen: Stapel + Schlange + Liste Prof. Dr. Alexander Wolff Lehrstuhl für Informatik I 2-4 Zur Erinnerung Datenstruktur:

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Algorithmen und Datenstrukturen Wintersemester 2012/13 13. Vorlesung Elementare Datenstrukturen: Stapel + Schlange + Liste Prof. Dr. Alexander Wolff Lehrstuhl für Informatik I 2. Test Termin: (voraussichtlich)

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Algorithmen und Datenstrukturen Dynamische Datenobjekte Pointer/Zeiger, Verkettete Liste Eigene Typdefinitionen 1 Zeigeroperatoren & und * Ein Zeiger ist die Speicheradresse irgendeines Objektes. Eine

Mehr

14 Abstrakte Klassen, finale Klassen, Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces Eine abstrakte Objekt-Methode ist eine Methode, für die keine Implementierung bereit gestellt wird. Eine Klasse, die abstrakte Objekt-Methoden enthält, heißt ebenfalls abstrakt. Für eine abstrakte Klasse

Mehr

Stud.-Nummer: Datenstrukturen & Algorithmen Seite 1

Stud.-Nummer: Datenstrukturen & Algorithmen Seite 1 Stud.-Nummer: Datenstrukturen & Algorithmen Seite 1 Aufgabe 1. / 16 P Instruktionen: 1) In dieser Aufgabe sollen Sie nur die Ergebnisse angeben. Diese können Sie direkt bei den Aufgaben notieren. 2) Sofern

Mehr

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen Auswertung von Ausdrücken Eine abstrakte Objekt-Methode ist eine Methode, für die keine Implementierung bereit gestellt wird. Eine Klasse, die abstrakte Objekt-Methoden enthält, heißt ebenfalls abstrakt.

Mehr

Übungsklausur Algorithmen I

Übungsklausur Algorithmen I Universität Karlsruhe, Institut für Theoretische Informatik Prof. Dr. P. Sanders 26.5.2010 svorschlag Übungsklausur Algorithmen I Hiermit bestätige ich, dass ich die Klausur selbständig bearbeitet habe:

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 41 Einstieg in die Informatik mit Java Vererbung Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 41 1 Überblick: Vererbung 2 Grundidee Vererbung 3 Verdeckte Variablen

Mehr

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

Gliederung. 5. Compiler. 6. Sortieren und Suchen. 7. Graphen 5. Compiler Gliederung 1. Struktur eines Compilers 2. Syntaxanalyse durch rekursiven Abstieg 3. Ausnahmebehandlung 4. Arrays und Strings 6. Sortieren und Suchen 1. Grundlegende Datenstrukturen 2. Bäume

Mehr

7. Sortieren Lernziele. 7. Sortieren

7. Sortieren Lernziele. 7. Sortieren 7. Sortieren Lernziele 7. Sortieren Lernziele: Die wichtigsten Sortierverfahren kennen und einsetzen können, Aufwand und weitere Eigenschaften der Sortierverfahren kennen, das Problemlösungsparadigma Teile-und-herrsche

Mehr

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

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v) Ein Baum T mit Knotengraden 2, dessen Knoten Schlüssel aus einer total geordneten Menge speichern, ist ein binärer Suchbaum (BST), wenn für jeden inneren Knoten v von T die Suchbaumeigenschaft gilt: Der

Mehr

Übung Algorithmen und Datenstrukturen

Übung Algorithmen und Datenstrukturen Übung Algorithmen und Datenstrukturen Sommersemester 2017 Patrick Schäfer, Humboldt-Universität zu Berlin Agenda 1. Sortierte Listen 2. Stacks & Queues 3. Teile und Herrsche Nächste Woche: Vorrechnen (first-come-first-served)

Mehr

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

Bäume. Text. Prof. Dr. Margarita Esponda SS 2012 O4 O5 O6 O ALP2-Vorlesung, M. Esponda Bäume O1 O2 Text O3 O4 O5 O6 O7 Prof. Dr. Margarita Esponda SS 2012 22. ALP2-Vorlesung, M. Esponda Inhalt 1. Einführung 2. Warum Bäume? 3. Listen und Arrays vs. Bäume 4. Einfach verkettete binäre Suchbäume

Mehr

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Heaps. Vorlesung 8: Heapsort (K6) Joost-Pieter Katoen. 7. Mai 2015

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Heaps. Vorlesung 8: Heapsort (K6) Joost-Pieter Katoen. 7. Mai 2015 Datenstrukturen und Algorithmen Vorlesung 8: (K6) 1 Joost-Pieter Katoen Lehrstuhl für Informatik Software Modeling and Verification Group http://moves.rwth-aachen.de/teaching/ss-15/dsal/ 7. Mai 015 3 Joost-Pieter

Mehr

Tafelübung 07 Algorithmen und Datenstrukturen

Tafelübung 07 Algorithmen und Datenstrukturen Tafelübung 07 Algorithmen und Datenstrukturen Lehrstuhl für Informatik 2 (Programmiersysteme) Friedrich-Alexander-Universität Erlangen-Nürnberg Wintersemester 2017/2018 Übersicht Vererbung Grundlagen Abstrakte

Mehr

Probeklausur: Programmierung WS04/05

Probeklausur: Programmierung WS04/05 Probeklausur: Programmierung WS04/05 Name: Hinweise zur Bearbeitung Nimm Dir für diese Klausur ausreichend Zeit, und sorge dafür, dass Du nicht gestört wirst. Die Klausur ist für 90 Minuten angesetzt,

Mehr

Stapel (Stack, Keller)

Stapel (Stack, Keller) Stapel (Stack, Keller) Eine wichtige Datenstruktur ist der Stapel. Das Prinzip, dass das zuletzt eingefügte Element als erstes wieder entfernt werden muss, bezeichnet man als LIFO-Prinzip (last-in, first-out).

Mehr

6/23/06. Universelles Hashing. Nutzen des Universellen Hashing. Problem: h fest gewählt es gibt ein S U mit vielen Kollisionen

6/23/06. Universelles Hashing. Nutzen des Universellen Hashing. Problem: h fest gewählt es gibt ein S U mit vielen Kollisionen Universelles Hashing Problem: h fest gewählt es gibt ein S U mit vielen Kollisionen wir können nicht annehmen, daß die Keys gleichverteilt im Universum liegen (z.b. Identifier im Programm) könnte also

Mehr

NAME, VORNAME: Studiennummer: Matrikel:

NAME, VORNAME: Studiennummer: Matrikel: TU Ilmenau, Fakultat IA Institut für Theoretische Informatik FG Komplexitätstheorie und Effiziente Algorithmen Prof. Dr. (USA) M. Dietzfelbinger Klausur Algorithmen und Datenstrukturen SS08, Ing.-Inf.

Mehr

Schein-/Bachelorklausur Teil 2 am Zulassung: Mindestens 14 Punkte in Teilklausur 1 und 50% der Übungspunkte aus dem 2. Übungsblock.

Schein-/Bachelorklausur Teil 2 am Zulassung: Mindestens 14 Punkte in Teilklausur 1 und 50% der Übungspunkte aus dem 2. Übungsblock. Schein-/Bachelorklausur Teil 2 am 13.02.2007 Zulassung: Mindestens 14 Punkte in Teilklausur 1 und 50% der Übungspunkte aus dem 2. Übungsblock. Alle Studiengänge außer Bachelor melden sich über die Lehrstuhlwebseite

Mehr

Voronoi-Diagramme. Dr. Martin Nöllenburg Vorlesung Algorithmische Geometrie INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK

Voronoi-Diagramme. Dr. Martin Nöllenburg Vorlesung Algorithmische Geometrie INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK Vorlesung Algorithmische Geometrie INSTITUT FÜR THEORETISCHE INFORMATIK FAKULTÄT FÜR INFORMATIK Martin Nöllenburg 29.05.2011 Das Postamt-Problem b(p, q) = {x R 2 : xp = xq } p q h(p, q) h(q, p) = {x :

Mehr

Wiederholung. Datenstrukturen und. Bäume. Wiederholung. Suchen in linearen Feldern VO

Wiederholung. Datenstrukturen und. Bäume. Wiederholung. Suchen in linearen Feldern VO Wiederholung Datenstrukturen und Algorithmen VO 708.031 Suchen in linearen Feldern Ohne Vorsortierung: Sequentielle Suche Speicherung nach Zugriffswahrscheinlichkeit Selbstanordnende Felder Mit Vorsortierung:

Mehr

Implementieren von Klassen

Implementieren von Klassen Implementieren von Klassen Felder, Methoden, Konstanten Dr. Beatrice Amrhein Überblick Felder/Mitglieder (Field, Member, Member-Variable) o Modifizierer Konstanten Methoden o Modifizierer 2 Felder und

Mehr

Mergeable Heaps. C. Komusiewicz 7.1 Fibonacci-Heaps: Überblick 117

Mergeable Heaps. C. Komusiewicz 7.1 Fibonacci-Heaps: Überblick 117 C. Komusiewicz 7.1 Fibonacci-Heaps: Überblick 117 Mergeable Heaps Erweiterung von Standardheaps, die die folgenden fünf Operationen unterstützen. Make-Heappq liefert neuen, leeren Heap. InsertpH, xq fügt

Mehr

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1 Kapitel 13 Listen Listen 1 Ziele Implementierungen für Listen kennenlernen Einfach verkettete und doppelt verkettete Listen verstehen Listen-Implementierungen in der Java-Bibliothek kennenlernen Durch

Mehr

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1 Kapitel 12 Listen Listen 1 Ziele Implementierungen für Listen kennenlernen Einfach verkettete und doppelt verkettete Listen verstehen Listen-Implementierungen in der Java-Bibliothek kennenlernen Durch

Mehr