EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 8 Claudio...

Post on 05-Apr-2015

106 views 0 download

Transcript of EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 8 Claudio...

EINI-IEINI-IEinführung in die Informatik Einführung in die Informatik für Naturwissenschaftler und für Naturwissenschaftler und

Ingenieure IIngenieure I

Kapitel 8

Claudio Moraga; Gisbert Dittrich

FBI Unido

moraga@cs.uni-dortmund.de

2

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Gliederung Kapitel 8Gliederung Kapitel 8

• Motivation – Suchen in einfach verketteter Liste

+ deren Nachteile

• Binärer Suchbaum– Grobideen: Suchen, Suchstruktur– Idee Baum– Binärer Baum, Knotenmarkierung, Implementierung

knotenmarkierter bin. Bäume, Suchbaum – Suchen– Einfügen– Analyse

3

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Suchen in einer ListeSuchen in einer Liste

• Ist L die leere Liste: i kann nicht in L sein.

• Ist L nicht leer– entweder i == L->Element

– oder i wird in L->weiter gesucht

4

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Suchen in einer ListeSuchen in einer Liste

bool Suchen (int i, Liste * L) { if (L == NULL) return false; else return

(L->Element == i? true: Suchen(i, L->weiter));}

5

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Suchen in einer ListeSuchen in einer Liste

• Problem: langsame Suche– jedes Element muß bei einer erfolglosen Suche

betrachtet werden

– also: Suchzeit proportional zur Anzahl der Elemente in der Liste (lineare Suchzeit)

6

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Suchen in einer ListeSuchen in einer Liste

• Beispiel– erfolglose Suche bei 105 Elementen braucht 105

Vergleiche, also (pro Vergleich 10-1 sec.) 104 sec

= 2,7 h

– Bei geschickter Anordnung der Daten geht´s mit 35 Vergleichen, also in 3.5 sec.

7

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Suche „in einer Hälfte“Suche „in einer Hälfte“

• Grobidee: – Suchen in geordneter "Liste" durch Überprüfen des

"mittleren" Elementes + Fortsetzung in einer Hälfte

– Beispiel:

1 2 3 4 5 6 7 8 9

2 4 6 7 8 17 19 36 40

k: 19 k:5OK : nicht vorhanden

8

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Suchstruktur

Aufgabe: Trage die Zahlen 17, 4, 36, 2, 8, 19, 40, 6, 7 in eine baumförmige Struktur so ein:

17

4 36

2 8

6

7

19 40

9

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Ziel: Binärer SuchbaumZiel: Binärer Suchbaum

• Zu diesem Ziel nacheinander definieren:– (Binärer) Baum– Knotenmarkierter binärer Baum– Binärer Suchbaum

10

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Idee von BaumIdee von Baum

KünstlerischAbstrahiert 1Abstrahiert 2Die Informatiksicht:

11

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Binärer BaumBinärer Baum

3.) Jeder binäre Baum B läßt sich durch endlich häufige Anwendung von 1.) oder 2.) erhalten.

2.) Seien Bi binäre Bäume mit den Knotenmengen Ki , i = 1,2. Dann ist auch B = (w, B1, B2) ein binärer

Baum mit der Knotenmenge K = {w} K1 K2.

( bezeichnet disjunkte Vereinigung.) .

..

Definition: (Binärer Baum)

1.) Der "leere" Baum ist ein binärer Baum mit der Knotenmenge .

12

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Binärer BaumBinärer Baum

• Sprech-/Darstellungsweisen (im Falle 2.)):Sei B = (w, B1, B2) binärer Baum

w heißt Wurzel, B1 linker und B2 rechter Unterbaum.

B1 B2

Wurzel

linker Unterbaum

rechter Unterbaum

w

13

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Binärer BaumBinärer Baum

• Darstellung eines Beispiels nach Definition: B1 = (k1, , (k2, (k3, , ), )).

k1

k2

k3

14

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Terminologie Terminologie Binäre BäumeBinäre Bäume

Wurzel

innerer Knoten

Blatt

15

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Knotenmarkierter binärer BaumKnotenmarkierter binärer Baum

Definition: Sei M eine Menge. (B, km) ist ein knotenmarkierter binärer Baum

(mit Markierungen aus M)

:¤1.) B ist binärer Baum (mit Knotenmenge K = K(B))

2.) km: K --> M Abbildung.

(Markierung/Beschriftung der Knoten k K mit Elementen m M)

16

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Knotenmarkierter binärer Baum binärer Baum

Beispiel: (M := Menge der ganzen Zahlen)

damit existiert auf M eine Ordnung !

"Übliche" Darstellung der Knotenbeschriftung km

durch "Anschreiben" der Beschriftung an/in die Knoten.

k1

k2

k3

24

18

16

17

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Datentyp Datentyp BinBaumBinBaum

• Implementierung knotenmarkierter binärer Bäume durch eine struct mit Zeigern:– Inhalt, (hier z. B.) ganzzahlig (Später allgemeiner möglich)

– Zeiger jeweils auf den linken und den rechten Unterbaum

struct BinBaum { int Element; BinBaum *Lsohn, *Rsohn; }

18

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Binäre SuchbäumeBinäre Suchbäume

Definition: (B, km) ist ein binärer Suchbaum (über M)

:¤1.) (B, km) ist ein binärer, knotenmarkierter Baum.

2.) Ist w die Beschriftung der Wurzel w, so ist die Wurzelmarkierung im linken Unterbaum kleiner als w, die Wurzelmarkierung im rechten Unterbaum größer als w. (Jeweils, sofern diese vorhanden.)

3.) Ist (B, km) mit B , B = (w, B1, B2), so sind (Bi,kmi) mit kmi := km|Bi (i= 1,2) binäre Suchbäume.

19

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Binäre SuchbäumeBinäre Suchbäume

Beispiel:

Aufgaben im Zusammenhang mit (binären) Suchbäumen:• Suchen nach Markierungen/Elementen im

Suchbaum• Aufbau solcher Bäume• Abbau, z. B. Entfernen eines Knotens mit

Markierung• Durchlaufen aller Knoten

20

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Binäre Suchbäume: SuchenBinäre Suchbäume: Suchen

Gegeben: ein binärer Suchbaum (durch Zeiger B darauf),

ganze Zahl k

Problem:

Ist k in durch B bezeichneten Baum gespeichert?

Lösungsidee: Stimmt B->Element mit k überein: Antwort ja

Gilt B->Element < k: suche in B->Rsohn

Gilt B->Element > k: suche in B->Lsohn

Ist B leer, Antwort nein

21

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Binäre Suchbäume: SuchenBinäre Suchbäume: Suchen

17

4 36

2 8

6

7

19 40

Suche nachdem Element 5

Suche nachdem Element 19

22

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Binäre Suchbäume: SuchenBinäre Suchbäume: Suchen

bool Suche (BinBaum * B, int k) {if (B == NULL) return false;else {

if (B->Element == k) return true;else if (B->Element < k)

return Suche(B->Rsohn, k);Suche(B->Rsohn, k);else if (B->Element > k)

return Suche(B->Lsohn, k);Suche(B->Lsohn, k);}

}

23

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Binäre Suchbäume: EinfügenBinäre Suchbäume: Einfügen

• Aufbau durch wiederholtes Einfügen in einen leeren binären Suchbaum

• Einfügeoperation für binären Suchbaum *B und eine ganze Zahl k– B == NULL: erzeuge neuen Knoten, weise ihn B zu

und setze B->Element = k– B != NULL

• B->Element < k: Einfügen von k in B->RSohn• B->Element > k: Einfügen von k in B->LSohn

24

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Binäre Suchbäume: EinfügenBinäre Suchbäume: Einfügen

• Rekursion wichtiger Bestandteil der Funktion• Idee:

– suche den Unterbaum, in den eingefügt werden soll, – füge in den Unterbaum ein,– weise diesem Unterbaum das Resultat der Einfügung

zu.

25

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Binäre Suchbäume: EinfügenBinäre Suchbäume: Einfügen

BinBaum *Einfuegen (BinBaum * B, int k) {

if (B == NULL){

Binbaum *Hilf = new BinBaum;

Hilf->Element = k; Hilf->Lsohn = Hilf->Rsohn = NULL;

B = Hilf; Hilf = NULL;

}

else {

if (B->Element < k)

B->Rsohn = Einfuegen(B->Rsohn, k);B->Rsohn = Einfuegen(B->Rsohn, k);

else if (B->Element > k)

B->Lsohn = Einfuegen(B->Lsohn, k);B->Lsohn = Einfuegen(B->Lsohn, k);

}

return B;

}

26

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

BinBaum *Einfuegen(BinBaum * B, int k){

if (B == NULL){

Binbaum *Hilf = new BinBaum;

Hilf->Element = k;

Hilf->Lsohn = Hilf->Rsohn = NULL;

B = Hilf; Hilf = NULL;

};

return B;}

B

Hilf

k

else {if (B->Element > k)

B->Lsohn = Einfuegen(B->Lsohn, k);B->Lsohn = Einfuegen(B->Lsohn, k);

else if (B->Element < k)

B->Rsohn = Einfuegen(B->Rsohn, k);B->Rsohn = Einfuegen(B->Rsohn, k);

};};

Return B;Return B;

}

k

27

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

weise dem Unterbaum

das Resultat der Einfügung zu

Kommentar: EinfügenKommentar: Einfügen

if (B->Element < k) B->Rsohn = Einfuegen(B->Rsohn, k);B->Rsohn = Einfuegen(B->Rsohn, k);else if (B->Element > k) B->Lsohn = Einfuegen(B->Lsohn, k);B->Lsohn = Einfuegen(B->Lsohn, k);return B;

Suche den Unterbaum, in den eingefügt wird

28

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Analyse: EinfügenAnalyse: Einfügen

• Wie schnell geht das eigentlich?• Maß für die Güte eines Algorithmus:

– Anzahl von Operationen und – Speicherplatz-Verbrauch

• hier: – Speicherplatz: pro Knoten eines Exemplars von BinBaum, also relativ uninteressant.

– Operationen sind hier Vergleiche: interessant

29

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Analyse: EinfügenAnalyse: Einfügen

• Frage: wieviele Vergleiche sind beim Einfügen (oder bei der erfolglosen Suche) notwendig?

• Antwort: nicht so leicht zu geben:– ist der günstigste Fall gemeint? (klar: 1)– ist der ungünstigste Fall gemeint? (auch ziemlich

klar: längster Pfad im Baum)– ist der durchschnittliche Fall gemeint? (völlig unklar)

30

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Suchen: ungünstigster FallSuchen: ungünstigster Fall

• Erfolglose Suche: – suche von der Wurzel zu einem Blatt, jeder Knoten

entspricht einem Vergleich.

• Höhe eines Baums: – gibt den längsten Pfad von der Wurzel zu einem Blatt

an. Ist rekursiv definiert• Höhe des leeren Baums ist 0,

• Höhe eines nicht-leeren Baums ist 1 + max{Höhe Lsohn, Höhe Rsohn}

31

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Höhe eines binären BaumsHöhe eines binären Baums

17

4 36

2 8

6

7

19 40

37

Der Baum hat die Höhe 5

32

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Suchen: ungünstigster FallSuchen: ungünstigster Fall

• Es gilt der Satz:

Ein binärer Baum der Höhe n hat zwischen n und 2 n- 1 Knoten.– Daraus folgt: k Knoten können in einem binären

Baum gespeichert werden, der eine Höhe zwischen ~log2 k und k hat

– Also: der schlechteste Fall bei der erfolglosen Suche in einem binären Suchbaum mit k Elementen liegt bei k Vergleichsoperationen

33

Kap 8: Binäre Bäume + Suchen Vorl “EINI-I"

08.01.2001

Suchen: zu erwartender FallSuchen: zu erwartender Fall

• Die erfolglose Suche in einem binären Suchbaum mit k Elementen erfordert im Durchschnitt proportional zu log k Vergleichsoperationen.

• Recht kompliziert herzuleiten.