• Keine Ergebnisse gefunden

Preisverleihung Begriffsdefinitionen Eigenschaften Implementierung von Bäumen Durchlaufen von Bäumen Breitensuche/Tiefensuche Huffman-Kodierung

N/A
N/A
Protected

Academic year: 2022

Aktie "Preisverleihung Begriffsdefinitionen Eigenschaften Implementierung von Bäumen Durchlaufen von Bäumen Breitensuche/Tiefensuche Huffman-Kodierung"

Copied!
4
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

1

Universität Bremen

Bäume 1

Thomas Röfer

Preisverleihung Begriffsdefinitionen Eigenschaften Implementierung von Bäumen Durchlaufen von Bäumen Breitensuche/Tiefensuche Huffman-Kodierung

2 Universität Bremen

PI-2: Bäume 1 Permutieren nach Dijkstra

Rückblick „Sortieren“

243 1

342 1

Sortieren durch … S = perm(T), s0≤s1≤... ≤sn-1

oder S = perm(T), s0≥s1≥... ≥sn-1

1235

… Einfügen

123 45

1

2 1

255 33 4 4

… Mischen Quicksort

7 4 1 9 0 2 5 4 8 3

7

7 4 1 3 0 2 5 4 8 9

7 4 1 3 0 2 5 4 8 9

4 4 1 3 0 2 5 7 8 9

4 4 1 3 0 2 5 7 8 9

quickSort

quickSort quickSort

quickSort

… Vertauschen (BubbleSort)

2314 5

… Auswählen

1352 4

3 Universität Bremen

PI-2: Bäume 1

Vier gewinnt – Preisverleihung

4 Universität Bremen

PI-2: Bäume 1

Schnittstelle für „Vier gewinnt“

package kimatch.connect4;

public abstract class Connect4Player {

public void begin() {}

public void end() {}

public abstract String getPlayerName();

public abstract void onMove(MoveEventArgs e);

public abstract void onOpponentMove(

OpponentMoveEventArgs e);

}

packagekimatch.connect4;

public abstractclass Connect4Player {

publicvoidbegin() {}

publicvoidend() {}

public abstractString getPlayerName();

public abstractvoid onMove(MoveEventArgs e);

public abstractvoid onOpponentMove(

OpponentMoveEventArgs e);

}

public final class MoveEventArgs {

public MoveEventArgs(

boolean[] availableColumns) … public boolean isAvailable(

int column) …

public void select(int column) … public int getSelectedColumn() … }

public final class OpponentMoveEventArgs {

public OpponentMoveEventArgs(

int column) …

public int getSelectedColumn() … }

public finalclassMoveEventArgs {

publicMoveEventArgs(

boolean[] availableColumns) … publicbooleanisAvailable(

intcolumn) …

publicvoidselect(intcolumn) … publicintgetSelectedColumn() … }

public finalclass OpponentMoveEventArgs {

publicOpponentMoveEventArgs(

intcolumn) …

publicintgetSelectedColumn() … }

5 Universität Bremen

PI-2: Bäume 1

Einleitung

Motivation

Reihungen sind statisch bzw. nur teuer zu vergrößern und zu verkleinern

Listen sind dynamisch, aber man kann in ihnen nur linear suchen

Ansatz

Man kann Bäume als verallgemeinerte Listenstruktur ansehen

Jeder Knoten hat nicht einen, sondern viele Nachfolger Beispiel

Z.B. Teile und Kapitel von „Algorithmen in Java“

6 Universität Bremen

PI-2: Bäume 1

Begriffe

Knoten

Kann einen Namen haben (Etikett, Label) und/oder andere Informationen tragen Kann mehrere untergeordnete Knotenhaben (Kindknoten, Nachfolger) Kann maximal einen übergeordneten Knotenhaben (Elternknoten, Vorgänger) Hat ein Knoten keinen übergeordneten Knoten, ist er die Wurzeldes Baums Der Verzweigungsgradeines Knotens ist die Anzahl seiner Kindknoten Hat ein Knoten keine Nachfolger, ist er ein Blatt(Terminalknoten) Kante

Verbindet jeweils zwei Knoten (Eltern- mit Kindknoten) Pfad

Folge von unterschiedlichen Knoten, wobei aufeinander folgende Knoten durch Kanten verbunden sind

Baum

Nichtleere Sammlung von Knoten und Kanten Jeweils zwei Knoten sind genau durch einen Pfad verbunden Mehrere nicht miteinander verbundene Bäume bezeichnet man als Wald

(2)

2

7 Universität Bremen

PI-2: Bäume 1

Begriffe

binärer Baum

ternärer Baum

Wurzelbaum

freier Baum

8 Universität Bremen

PI-2: Bäume 1

Begriffe

Ordnung eines Baums

Der maximale Verzweigungsgrad seiner Knoten Binärbaum

Die Ordnung des Baums ist 2 Geordneter Baum

Zwischen den Kindern der Knoten ist eine Ordnungdefiniert z.B. erster, zweiter, dritter … Kindknoten

Tiefe eines Knotens

Der Abstand zwischen der Wurzel und dem Knoten (Anzahl der Kanten)

Die Wurzel hat die Tiefe 0

Alle Knoten mit derselben Tiefe gehören zur selben Ebene (zum selben Niveau)

Höhe eines Baums

Die maximale Tiefe eines Knotens im Baum

9 Universität Bremen

PI-2: Bäume 1

Definitionen und Eigenschaften

Voller Baum

Ein Baum heißt voll, wenn der Verzweigungsgradaller inneren Knoten der Ordnung des Baumsentspricht

Vollständiger Baum

Ein Baum heißt vollständig, wenn die Tiefealler Blätterder Höhe des Baumsentspricht

Ein Baum mit nKnoten hat n-1 Kanten Zu jedem Knotenführt eine Kante, nur zur Wurzelnicht Ein vollständiger Binärbaum der Höhe nhat 2nBlätter

Ein Binärbaum, der nur aus der Wurzel besteht, hat ein Blatt Ein vollständiger Binärbaum der Höhe n+1 hat doppelt so viele Blätter wie einer der Höhe n

Ein vollständiger Binärbaum der Höhe n hat 2n+1– 1 Knoten Ein Binärbaum, der nur aus der Wurzel besteht, hat einen Knoten Mit jeder Ebene kommt ein Knoten mehr hinzu, als schon im Baum vorhanden sind: knoten(n+1) = 2 ×knoten(n) + 1

10 Universität Bremen

PI-2: Bäume 1

Graphen und Bäume

Andere Sichtweise

Bäume können nicht nur als Verallgemeinerung von Listengesehen werden, sondern auch als Spezialfall von Graphen

Baum mit gerichteten Kanten

Ein Baum mit gerichteten Kanten verhält sich in seiner Implementierung analog zu einer einfach verketteten Liste

Alle Kanten zeigen von Elternknoten zu Kindknoten

Baum mit ungerichteten Kanten Ein Baum mit ungerichteten Kanten verhält sich in seiner Implementierung analog zu einer doppelt verketteten Liste

Kindknoten haben zusätzlich einen Verweis auf ihren Elternknoten

11 Universität Bremen

PI-2: Bäume 1

Implementierung von Bäumen

Knoten Binärbaum

Baum

12 Universität Bremen

PI-2: Bäume 1

Implementierung eines Binärbaums

class Node {

Node left, right;

Object data;

Node(Object o, Node l, Node r) {

data = o;

left = l;

right = r;

}

boolean isLeaf() {

return left == null &&

right == null;

} classNode {

Node left, right;

Object data;

Node(Object o, Node l, Node r) {

data = o;

left = l;

right = r;

}

booleanisLeaf() {

returnleft == null&&

right == null;

}

boolean isInnerNode() {

return !isLeaf();

} } class Tree {

private Node root;

Tree(Node n) {

root = n;

}

boolean isEmpty() {

return root == null;

} }

booleanisInnerNode() {

return!isLeaf();

} } classTree {

privateNode root;

Tree(Node n) {

root = n;

}

booleanisEmpty() {

returnroot == null;

} }

(3)

3

13 Universität Bremen

PI-2: Bäume 1

Durchlaufen eines Baums

Ansatz

Die Knoten eines Baums können in verschiedenen Reihenfolgen durchlaufen werden Beim Durchlaufen können Operationen auf den in den Knoten enthaltenen Daten durchgeführt werden

Mögliche Reihenfolgen Präorder-Sequenz Postorder-Sequenz Inorder-Sequenz Level-Order-Sequenz

interface NodeAction {

void action(Node n);

}

class NodePrintAction implements NodeAction {

public void action(Node n) {

System.out.print(

n.data.toString() + " ");

} }

interfaceNodeAction {

voidaction(Node n);

}

classNodePrintAction implementsNodeAction {

publicvoidaction(Node n) {

System.out.print(

n.data.toString() + " ");

} }

14 Universität Bremen

PI-2: Bäume 1

Präorder-Sequenz

Ansatz

In jedem Knoten wird zuerst der Knoten verarbeitet, dann die Kindknoten Beispiel

+ 1 * 2 3

void preorder(NodeAction a) {

if(!isEmpty()) {

a.action(root);

new Tree(root.left) .preorder(a);

new Tree(root.right) .preorder(a);

} }

voidpreorder(NodeAction a) {

if(!isEmpty()) {

a.action(root);

newTree(root.left) .preorder(a);

newTree(root.right) .preorder(a);

} }

15 Universität Bremen

PI-2: Bäume 1

Postorder-Sequenz

Ansatz

In jedem Knoten werden zuerst die Kindknoten verarbeitet, dann der Knoten selbst Beispiel

1 2 3 * +

void postorder(NodeAction a) {

if(!isEmpty()) {

new Tree(root.left) .postorder(a);

new Tree(root.right) .postorder(a);

a.action(root);

} }

voidpostorder(NodeAction a) {

if(!isEmpty()) {

newTree(root.left) .postorder(a);

newTree(root.right) .postorder(a);

a.action(root);

} }

16 Universität Bremen

PI-2: Bäume 1

Inorder-Sequenz

Ansatz

In jedem Knoten wird zuerst der linke Kindknoten verarbeitet, dann der Knoten selbst, dann der rechte Kindknoten Funktioniert nur bei Binärbäumen Beispiel

1 + 2 * 3

void inorder(NodeAction a) {

if(!isEmpty()) {

new Tree(root.left) .inorder(a);

a.action(root);

new Tree(root.right) .postorder(a);

} }

voidinorder(NodeAction a) {

if(!isEmpty()) {

newTree(root.left) .inorder(a);

a.action(root);

newTree(root.right) .postorder(a);

} }

17 Universität Bremen

PI-2: Bäume 1

Präorder-Sequenz ohne Rekursion

Ansatz

Statt Rekursion wird ein Stapel verwendet, um die offenen Knoten zu speichern

Der Stapel ist vom Typ last-in-first- out

Hinweis

Kann ebenfalls für Postorder- und Inorder-Sequenz genutzt werden

void preorder(NodeAction a) {

Stack stack = new Stack();

stack.push(root);

while(!stack.isEmpty()) {

Node node = (Node) stack.pop();

if(node != null) {

a.action(node);

stack.push(node.right);

stack.push(node.left);

} } }

voidpreorder(NodeAction a) {

Stack stack = newStack();

stack.push(root);

while(!stack.isEmpty()) {

Node node = (Node) stack.pop();

if(node != null) {

a.action(node);

stack.push(node.right);

stack.push(node.left);

} } }

18 Universität Bremen

PI-2: Bäume 1

Level-Order-Sequenz

Ansatz

Die Knoten werden ihrer Ebene nach durchlaufen und innerhalb jeder Ebene von links nach rechts Nutzung eines first-in-first-outStapels (Warteschlange) Beispiel

+ 1 * 2 3

void levelOrder(NodeAction a) {

Queue stack = new Queue();

stack.push(root);

while(!stack.isEmpty()) {

Node node = (Node) stack.pop();

if(node != null) {

a.action(node);

stack.push(node.left);

stack.push(node.right);

} } }

voidlevelOrder(NodeAction a) {

Queue stack = newQueue();

stack.push(root);

while(!stack.isEmpty()) {

Node node = (Node) stack.pop();

if(node != null) {

a.action(node);

stack.push(node.left);

stack.push(node.right);

} } }

(4)

4

19 Universität Bremen

PI-2: Bäume 1

Spielprobleme

Spielprobleme

Bei Spielproblemen (z.B. Vier gewinnt) werden mögliche Zugfolgen durchprobiert und das Ergebnis bewertet

Dabei wird unter allen eigenen Zügen der mit der besten Bewertung gesucht (Bewertung maximieren)

Allerdings muss man davon ausgehen, dass der Gegner den für einen selbst ungünstigsten Zug auswählen wird (Bewertung minimieren)

Daher spricht man dabei von einem Mini-Max-Problem Eigene Züge

Gegnerische Züge Eigene Züge Gegnerische Züge Eigene Züge

20 Universität Bremen

PI-2: Bäume 1

Spielprobleme – Tiefen-/Breitensuche

Tiefensuche

Durchsuche den Baum der möglichen Zugfolgen bis zu einer bestimmten Tiefe

Verwende den besten gefundenen Zug Breitensuche

Durchsuche den Baum der möglichen Zugfolgen in Level-Order-Reihenfolge so lange, bis die Zeit um ist

Verwende den besten gefundenen Zug Inkrementelle Tiefensuche

Durchsuche den Baum der möglichen Zugfolgen bis zu einer bestimmten Tiefe

Ist noch Zeit übrig, erhöhe die Tiefe um 1 und beginne von vorne

Verwende den besten gefundenen Zug

21 Universität Bremen

PI-2: Bäume 1

Huffman Komprimierung

Kodierung mit fester Bitanzahl A: 000 C: 010 E: 100 G: 110 B: 001 D: 011 F: 101 H: 111

BACADAEAFABBAAAGAH wird mit 18 ×3 = 54 Bits kodiert:

001 000 010 000 011 000 100 000 101 000 001 001 000 000 000 110 000 111 Ansatz

Wenn Zeichen in einem Text unterschiedlich häufig vorkommen, wäre es günstig, die häufigeren mit weniger Bits zu kodieren und die seltenen mit mehr

Kodierung mit variabler Bitanzahl A: 0 C: 1010 E: 1100 G: 1110 B: 100 D: 1011 F: 1101 H: 1111 BACADAEAFABBAAAGAH wird mit 42 Bits kodiert:

100 0 1010 0 1011 0 1100 0 1101 0 100 100 0 0 0 1110 0 1111 Probleme

Wenn Zeichen durch unterschiedlich viele Bits repräsentiert werden, muss man erkennen können, wo ein Zeichen endet und wo das nächste beginnt Zudem braucht man ein Lexikon, in dem steht, welche Bitfolge welchem Zeichen entspricht

22 Universität Bremen

PI-2: Bäume 1

Aufbau eines Huffman-Baumes

Gegeben sei eine leere Liste von Binärbäumen Für jedes Zeichen

Erzeuge einen Binärbaum, bei dem die Wurzel ein Blatt ist und das Zeichen und seine Häufigkeit enthält.

Füge den Baum aufsteigend nach der in der Wurzel vermerkten Häufigkeit sortiert in die Liste ein

Solange die Liste mehr als einen Baum enthält Entnimm die beiden ersten Elemente aus der Liste

Erzeuge einen neuen Binärbaum, bei dem der linke Kindknoten der ursprünglich erste Baum in der Liste ist und der rechte Kindknoten der ursprünglich zweite Baum Die in der Wurzel vermerkte Häufigkeit ist die Summe der Häufigkeiten der beiden Teilbäume

Füge den Baum aufsteigend nach der in der Wurzel vermerkten Häufigkeit sortiert in die Liste ein

Der letzte in der Liste verbliebene Binärbaum ist der Huffman-Baum

23 Universität Bremen

PI-2: Bäume 1

Beispiel: BACADAEAFABBAAAGAH

D 1

C 1

F 1

E 1

H 1

G 1

B 3

A 9

2 H 1

G 1 F 1

E 1

B 3

A 9

D 1

C 1

2 H

1 G 1

B 3

A 9

D 1

C 1 2

F 1

E 1

2 B 3

A 9

D 1

C 1 2

F 1

E 1 2

H 1

G 1

B 2 3

A 9

F 1

E 1 2

H 1

G 1 2

D 1

C 1

4

2

B 3 A

9

F 1

E 1 2

H 1

G 1

2

D 1

C 1

4 5

24 Universität Bremen

PI-2: Bäume 1

Beispiel: BACADAEAFABBAAAGAH

Eigentliche Kodierung Durch Pfad von der Wurzel zum Zeichen

Wenn nach rechts verzweigt wird, schreibe eine 0

Wenn nach links verzweigt wird, schreibe eine 1

Beispiel

C: links, rechts, links rechts 1010

2

B 3

A 9

F 1

E 1 2

H 1

G 1

2

D 1

C 1

4 5

9

2

B 3

A 9

F 1

E 1 2

H 1

G 1

2

D 1

C 1

4 5

9 18 0 1 1 1

1 0 1 0 1 0

0 1 0

0

Referenzen

ÄHNLICHE DOKUMENTE

Und wenn ich das tue, möchte ich auch nicht Toleranz in Anspruch nehmen müssen - Toleranz würde ja nur bedeuten, dass ich zwar schon was und womöglich begründet dagegen habe,

Für die Beurteilung von abweichenden Situationen wird angenommen, dass sich die Störwirkung in Abhängigkeit der Anzahl Stop & Go Ereignisse verändert. Bei einer minimal

  Felder mit einem Namen zzz, die den Access-Type exposedField haben, haben implizit den Namen zzz_changed, wenn sie als Ausgabe-Feld verwendet werden, und den Namen set_zzz,

Technische Universität München, Fakultät für Medizin, Klinik und Poliklinik für Derma- tologie und

Im weiteren Verlauf erfolgte bei dem Patienten im stabilen Stadium der Erkran- kung die operative Korrektur der Penisdeviati- on durch partielle Plaqueexzision und Grafting, da

Computer-gestützte Programme für das Ge- wichtsmanagmeent seien zwar weniger wirk- sam als persönliche Interventionen, aber auf jeden FAll besser als nichts und auch ange- sichts

denn vorher müssen sid1 die eingeengten Kronen entwickeln und aus- breiten können und hiezu ist es dann mondnnol sd1011 reid1lid1 spüf. Ein zweiter Punkt betrifft

Wenngleich das Konzept quattromodaler Knoten einen gewissen Interpretationsspielraum lässt – so werden etwa die Pipeline, Normal- und Breitspur sowie die Binnen- und