fh-hof sortieren mit binären bäumen richard göbel

Post on 05-Apr-2015

108 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

FH-Hof

Sortieren mit Binären Bäumen

Richard Göbel

FH-Hof

Beispielanwendung

Speichere alle Studierenden

Beantworte folgende Anfragen

Student/Studentin mit gegebener

Matrikelnummer finden

Studierende im 4. Semester finden

Studierende zwischen 3. und. 6. Semester finden

FH-Hof

Klassendefinition für Student

public class Student extends Person{

static ArrayList<Person> studenten;

int matrikelnummer;Vorlesung[] vorlesungenint anzVorlesungen;int semester,

static{

studenten = new ArrayList<Person>();}

Student ( … ){

studenten.add(this);…

}}

FH-Hof

Suchfunktionen

public class Student extends Person{

… static Student search(int matrikel) { … }

static Student search(int semester){

… }

static Student search(int minSem, int maxSem){

… }

…}

FH-Hof

Analyse des Zeitaufwands

Suchen bei

unsortierter Liste

sortierter Liste

Sortierkriterium?

Aufwand für weitere Operationen bei sortierten

Listen

Einfügen

Ändern

Löschen

Hilft die Datenstruktur LinkedList?

Alternative Datenstruktur: Bäume

FH-Hof

Sortierte Binäre Bäume

Jeder Knoten hat höchsten zwei Nachfolger

Alle Knoten im linken Teilbaum sind kleiner als die Wurzel

Alle Knoten im rechten Teilbaum sind größer als die Wurzel

Gleiche Elemente?

8

4 10

6 9 11

5 7 12

FH-Hof

Binärer Baum: Definition eines Knotens

class Node

{

int value;

Node left = null;

Node right = null;

}

FH-Hof

Binärer Baum: Suche nach Werten

Node search(int v)

{

if (v == value) return this;

if (v < value)

if (left == null) return null;

else return left.search(v);

else // v >= value

if (right == null) return null;

else return right.search(v);

}

FH-Hof

Binärer Baum: Einfügen von Werten

void insert(int v){ if (v == value) // neuen Eintrag einfuegen else if (v < value) if (left == null) { left = new Node();

left.value = v; }

else left.insert(v) else // v > n.value if (n.right == null) {

right = new Node(); right.value = v; }

else right.insert(v);}

FH-Hof

Binärer Baum: Löschen eines Knotens - Fälle

Knoten ohne Nachfolger

Knoten mit einem

Nachfolger

Knoten mit zwei

Nachfolgern

8

4 10

6 9 11

5 7 12

FH-Hof

Binärer Baum: Löschen eines Knotens - Code I

Node delete(int v) {

if (v == value) {

if (left == null) return right;if (right == null) return left;if (right.left == null){ value = right.value; right = right.right;

return this;}

else {

value = right.deleteMin(); return this;}

} . . .

FH-Hof

Binärer Baum: Löschen eines Knotens - Code II

. . .

if (v < value)

{

if (left != null) left = left.delete(v);

return this;

}

else // v > value

{

if (right != null) right = right.delete(v);

return n;

}

}

FH-Hof

Implementierung von deleteMin?

int deleteMin(Node n)

{

. . .

}

FH-Hof

Binärer Baum – Kapselung

Klasse für den Einstiegclass BinTree

{

Node content = null;

int size = 0;

}

Entsprechende Funktionen definierenNode search(int v) …

void insert(int v) …

void delete(int v) …

Klasse "Node" ist nur lokal wichtig

FH-Hof

Binärer Baum - Weitere Dienstleistungen

Sortierte Ausgabe aller Einträge

Sortierte Ausgabe aller Einträge größer

(kleiner) als ein vorgegebener Wert

Sortierte Ausgabe aller Einträge zwischen zwei

Werten

FH-Hof

Binärer Baum - Sortierte Ausgabe aller Einträge

void printAll()

{

if (left != null) left.printAll();

System.out.println(value);

if (right != null) right.printAll();

}

FH-Hof

Binärer Baum - Einträge größer als ein Wert

void printAbove(int min)

{

if (value < min)

{

if (right != null) right.printAbove(min);

}

else // value >= min

{

if (left != null) right.printAbove(min);

println(root.value);

if (right != null) right.printAll();

}

}

FH-Hof

Binärer Baum - Einträge in einem Bereich I

void printBetween(int min,int max) {

if (value < min) // nur rechts suchen{

if (right != null) right.printBetween(min,max);}else if (value > max) // nur links suchen {

if (left != null) left.printBetween(min, max);}else // value zwischen min und max{

if (left != null) left.printAbove(min);println(root.value);if (right != null) right.printBelow(max);

}}

FH-Hof

Problem - Bäume mit langen Ästen

1

2

3

4

5

6

1

2

3

4

5

6

FH-Hof

Lösung: (fast) balancierte Bäume

Höhendifferenz des linken und rechten

Teilbaums für jeden Knoten ist maximal k (k in

der Regel 1)

Beispiele:

Rot-Schwarz-Baum

AVL-Baum (G. M. Adel'son-Vel'skii und Y. M.

Landis)

Idee: Lokale Reorganisation des Baumes

möglich

FH-Hof

Lokale Transformation eines binären Baumes

X

YA

B C

X

Y

A B

C

FH-Hof

Transformationen des AVL-Baumes - Teil1

x

y

z

A

B

C D

n

n n+1

n+2

x

y

z

A B C Dn n

n+1

n+2

n+1

x

y

z

A

D

B C

n

nn+1

n+2

x

z

y

A B C Dn n

n+1

n+2

n+1

n n

FH-Hof

Transformationen des AVL-Baumes - Teil 2

x

y

z

D

C

A B

n

nn+1

n+2

z

y

x

A B C D

n+1

n+2

n+1

nn

x

y

z

D

A

B C

n

n n+1

n+2

y

z

x

A B C Dn n

n+1

n+2

n+1

n n

top related