EINI LW/WiMa - TU Dortmund

78
EINI LW/WiMa Einführung in die Informatik für Naturwissenschaftler und Ingenieure Vorlesung 2 SWS WS 16/17 Dr. Lars Hildebrand Fakultät für Informatik – Technische Universität Dortmund [email protected] http://ls14-www.cs.tu-dortmund.de Dr. Lars Hildebrand – Eini LogWing / WiMa 1

Transcript of EINI LW/WiMa - TU Dortmund

Page 1: EINI LW/WiMa - TU Dortmund

EINI LW/WiMaEinführung in die Informatik für

Naturwissenschaftler und Ingenieure

Vorlesung 2 SWS WS 16/17

Dr. Lars HildebrandFakultät für Informatik – Technische Universität Dortmund

[email protected]://ls14-www.cs.tu-dortmund.de

Dr. Lars Hildebrand – Eini LogWing / WiMa 1

Page 2: EINI LW/WiMa - TU Dortmund

► Kapitel 5Algorithmen und Datenstrukturen

► Konstruktion von Datentypen: Arrays

► Algorithmen: Sortieren

► Unterlagen

► Gumm/Sommer, Kapitel 2.7 & 2.8

► Echtle/Goedicke, Einführung in die Programmierung mit Java, dpunkt Verlag, Kapitel 4

► Doberkat/Dißmann, Einführung in die objektorientierte Programmierung mit Java, Oldenbourg, Kapitel 3.4 & 4.1

Dr. Lars Hildebrand – Eini LogWing / WiMa 2

Thema

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen

Page 3: EINI LW/WiMa - TU Dortmund

Begriffe

► Spezifikationen, Algorithmen, formale Sprachen, Grammatik

► Programmiersprachenkonzepte

► Grundlagen der Programmierung

► Algorithmen und Datenstrukturen

► Felder

► Sortieren

► Rekursive Datenstrukturen (Baum, binärer Baum, Heap)

► Heapsort

► Objektorientierung

► Einführung

► Vererbung

► Anwendung

3

Übersicht

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 4: EINI LW/WiMa - TU Dortmund

4

Binärer Baum

► Definition: Binärer Baum

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

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.)

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

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 5: EINI LW/WiMa - TU Dortmund

► Sprech-/Darstellungsweisen (im Falle 2.)):

Sei B = (w, B1, B2) binärer Baum

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

5

Binärer Baum

B1 B2

w Wurzel

rechter

Unterbaum

linker

UnterbaumIn diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 6: EINI LW/WiMa - TU Dortmund

► Darstellung eines Beispiels nach Definition:

B1 = (k1, , (k2, (k3, , ), )).

6

Binärer Baum

k1

k2

k3In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 7: EINI LW/WiMa - TU Dortmund

7

Terminologie binärer Bäume

Wurzel

innerer Knoten

BlattIn diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 8: EINI LW/WiMa - TU Dortmund

► 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)

Jedem Knoten wird ein Element aus der Menge M zugeordnet.

Alternative: Markierung von Kanten.

8

Knotenmarkierter binärer Baum

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 9: EINI LW/WiMa - TU Dortmund

Beispiel

► M := Z, Z := Menge der ganzen Zahlen

► Damit existiert auf M eine Ordnung!

► "Übliche" Darstellung der Knotenbeschriftung km durch "Anschreiben" der Beschriftung an/in die Knoten.

9

Knotenmarkierter binärer Baum

k1

k2

k3

24

1816In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 10: EINI LW/WiMa - TU Dortmund

► Ein Heap (Haufen) ist ein knotenmarkierter binärer Baum, für den gilt:

► Die Markierungsmenge ist geordnet.

► Der binäre Baum ist links-vollständig.

► Die Knotenmarkierung der Wurzel ist kleiner oder gleich der Markierung des linken resp. rechten Sohnes (, sofern vorhanden).

► Die Unterbäume der Wurzel sind Heaps.

► An der Wurzel steht das kleinste (eines der kleinsten) Element(e).

10

Definition: Heap

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 11: EINI LW/WiMa - TU Dortmund

► Binärbaum

► Alle Ebene, bis auf letzte vollständig gefüllt

► Links-vollständig gefüllt

► Knotenmarkierung der Wurzel kleiner als die der Kinder

11

Beispiel: Heap

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 12: EINI LW/WiMa - TU Dortmund

Grobidee zum abstrakten Datentyp Heap

► Datenstruktur

► siehe Folien vorher

► Operationen

► Init

► Einfügen eines Elementes in einen Heap

► Entfernen eines der kleinsten Elemente/des kleinsten Elementes aus dem Heap und Hinterlassen eines Rest-Heaps

► Zudem:

• Heap ist leer ?/ Heap ist voll ?

• Drucken

• .....

12

Abstrakte Datentypen

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 13: EINI LW/WiMa - TU Dortmund

Darstellung: Binärer Baum <--> Feld

13

Implementierung über Feld

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

S[1]

S[2] S[3]

S[4] S[5] S[6] S[7]

S[8] S[9] S[10] S[11] S[12] S[13] S[14] S[15]

S[1] S[2] S[3] S[4] S[15]S[14]S[12] S[13]Array

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 14: EINI LW/WiMa - TU Dortmund

► Beziehung Baum-Feld-Darstellung:

► Der Inhalt des i-ten Knotens in der Baumdarstellung wird im i-ten Feldelement abgelegt.

• Das bedeutet: Baum ebenenweise von links nach rechts eintragen.

• Das Feldelement a[0] wird nicht verwendet!

► Beobachtung:

► Die Söhne des Knotens i in einem Heap haben die Knotennummern

• 2i : linker Sohn

• 2i + 1 : rechter Sohn

• Beweis : Induktiv

14

Implementierung über Feld

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 15: EINI LW/WiMa - TU Dortmund

In Tiefe i befinden sich die Schlüssel S[2i … 2i+1-1]

15

Implementierung über Feld

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

S[1]

S[2] S[3]

S[4] S[5] S[6] S[7]

S[8] S[9] S[10] S[11] S[12] S[13] S[14] S[15]

S[1] S[2] S[3] S[4] S[15]S[14]S[12] S[13]

Ebene 0

Ebene 1

Ebene 2

Ebene 3

ArrayIn diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 16: EINI LW/WiMa - TU Dortmund

► linker Sohn von S[i] S[2i]

► rechter Sohn von S[i] S[2i+1]

► Vater von S[i]S[⌊i/2⌋]

16

Implementierung über Feld

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

S[3]

S[6] S[7]

S[8] S[9] S[10] S[11] S[12] S[13] S[14] S[15]

S[3] S[15]S[14]S[12] S[13]

Ebene 0

Ebene 1

Ebene 2

Ebene 3

Array

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 17: EINI LW/WiMa - TU Dortmund

► Die Heapeigenschaft wird über die Inhalte definiert

► Ein Feld a mit n ganzen Zahlen realisiert einen Heap,

► falls a[i/2] ≤ a[i] für alle i= 2, ...., n gilt.

► Der Wert des Vaters ist höchstens so groß, wie der der Söhne

► Dabei ist "/" als ganzzahlige Division zu verstehen.

z.B. 5/2 = 2

► Verzicht auf Floor( )-Funktion ⌊ ⌋ in der Notation

► In einem (Minimum-)Heap, realisiert durch das Feld a, steht das kleinste Element immer in a[1].

► Analog wird der Maximum-Heap definiert

17

Heap-Eigenschaft

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 18: EINI LW/WiMa - TU Dortmund

► Ein Feld S[1 . . . n] ist ein Heap ab l, wenn der Teilbaum mit Wurzel l ein Heap ist.

► Jedes Feld ist ein Heap ab ⌊n/2⌋ + 1, denn alle Einträge mit Indices ab ⌊n/2 ⌋ + 1 haben keine Kinder, d.h. der Teilbaum besteht nur aus einer Wurzel

► Ist S[1 . . . n] ein Heap ab l , so ist S ebenfalls ein Heap ab 2l und 2l + 1.

18

Beobachtungen

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

S[1]

S[2] S[3]

S[4] S[5] S[6] S[7]

S[8] S[9] S[10] S[11] S[12] S[13] S[14] S[15]

S[1] S[2] S[3] S[4] S[15]S[14]S[12] S[13]

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 19: EINI LW/WiMa - TU Dortmund

► Eingabe:

► Heap a mit n Elementen, neues Element x

► Ergebnis:

► Heap a mit n+1 Elementen, x seiner Größe gemäß eingefügt

► Vorgehensweise:

► Schaffe neuen Knoten n+1, setze a[n+1] = x

► Füge also neuen Knoten mit Beschriftung x in den Heap (evtl.noch an falscher Stelle) ein

► Sortiere an richtige Stelle ein

19

Operation Einfügen: Algorithmus

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 20: EINI LW/WiMa - TU Dortmund

► "An richtige Stelle einsortieren" - Idee:

► einsortieren(k) :

► k bezeichnet Knotennummer

► ist k=1, so ist nichts zu tun,

► ist k>1, so geschieht folgendes:

• falls a[k/2] > a[k],

– vertausche a[k/2] mit a[k],

– rufe einsortieren(k/2) auf

► einsortieren ist somit eine rekursive Funktion

20

Operation Einfügen: Algorithmus

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

Verletzung der Heap-Eigenschaft

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 21: EINI LW/WiMa - TU Dortmund

21

Beispiel

3

6

7 13

9 10 21 15

14

20 11

Ausgangssituation

18

12

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 22: EINI LW/WiMa - TU Dortmund

22

Beispiel

3

6 12

7 13

9 10 21 15

14

20

Einfügen der Zahl 11 in den Heap 11

Dr. Lars Hildebrand – Eini LogWing / WiMa

18

Page 23: EINI LW/WiMa - TU Dortmund

23

Beispiel

3

6 12

7 13

9 10 21 15

14

20

Linksvollständigkeit bietet nur eine Position

11

Dr. Lars Hildebrand – Eini LogWing / WiMa

18

Page 24: EINI LW/WiMa - TU Dortmund

24

Beispiel

3

6 12

7 13

9 10 21 15

14

20

Binärer Baum? Ja. Test auf Heap-Eigenschaften …

11

Dr. Lars Hildebrand – Eini LogWing / WiMa

18

Page 25: EINI LW/WiMa - TU Dortmund

25

Beispiel

3

6 12

7 13

9 10 21 15

14

20

Binärer Baum? Ja. Test auf Heap-Eigenschaften …

11

Dr. Lars Hildebrand – Eini LogWing / WiMa

18

Page 26: EINI LW/WiMa - TU Dortmund

26

Beispiel

3

6 12

7 13

9 10 21 15

14

20

Vater größer als Sohn Positionen vertauschen

11

Dr. Lars Hildebrand – Eini LogWing / WiMa

18

Page 27: EINI LW/WiMa - TU Dortmund

27

Beispiel

3

6 12

7 13

9 10 21 15

14

20

Knoten mit Inhalt 18 an der richtigen Position.

18

11

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 28: EINI LW/WiMa - TU Dortmund

28

Beispiel

3

6 12

7 13

9 10 21 15

14

20

Knoten mit Inhalt 11 an der richtigen Position? Rekursiver Aufruf!

18

11

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 29: EINI LW/WiMa - TU Dortmund

29

Beispiel

3

6 12

7 13

9 10 21 15

14

20

Binärer Baum? Ja. Test auf Heap-Eigenschaften …

18

11

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 30: EINI LW/WiMa - TU Dortmund

30

Beispiel

3

6 12

7 13

9 10 21 15

14

20

Vater größer als Sohn Positionen vertauschen

18

11

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 31: EINI LW/WiMa - TU Dortmund

31

Beispiel

3

6 11

7 13

9 10 21 15

14

20

Knoten mit Inhalt 12 an der richtigen Position.

18

12

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 32: EINI LW/WiMa - TU Dortmund

32

Beispiel

3

6 11

7 13

9 10 21 15

14

20

Knoten mit Inhalt 11 an der richtigen Position? Rekursiver Aufruf!

18

12

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 33: EINI LW/WiMa - TU Dortmund

33

Beispiel

3

6 11

7 13

9 10 21 15

14

20

Binärer Baum? Ja. Test auf Heap-Eigenschaften …

18

12

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 34: EINI LW/WiMa - TU Dortmund

34

Beispiel

3

6 11

7 13

9 10 21 15

14

20

Binärer Baum? Ja. Heap? Ja.

18

12

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 35: EINI LW/WiMa - TU Dortmund

35

Beispiel

3

6 11

7 13

9 10 21 15

14

20

Fertig! Neuer Heap mit eingefügtem Inhalt 11.

18

12

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 36: EINI LW/WiMa - TU Dortmund

36

Beispiel – mit Array

3

6

7 13

9 10 21 15

14

20 11

Ausgangssituation

18

12

1

2 3

4 5 6 7

8 9 10 11 12

3 6 12 7 13 18 14 9 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 37: EINI LW/WiMa - TU Dortmund

37

Beispiel – mit Array

3

6 12

7 13 18

9 10 21 15

14

20

Einfügen der Zahl 11 in den Heap 11

1

2 3

4 5 6 7

8 9 10 11 12

3 6 12 7 13 18 14 9 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 38: EINI LW/WiMa - TU Dortmund

38

Beispiel – mit Array

3

6 12

7 13 18

9 10 21 15

14

20

Linksvollständigkeit bietet nur eine Position

11

1

2 3

4 5 6 7

8 9 10 11 12 13

3 6 12 7 13 18 14 9 10 21 15 20 11 . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 39: EINI LW/WiMa - TU Dortmund

39

Beispiel – mit Array

3

6 12

7 13 18

9 10 21 15

14

20

Binärer Baum? Ja. Test auf Heap-Eigenschaften …

11

1

2 3

4 5 6 7

8 9 10 11 12 13

3 6 12 7 13 18 14 9 10 21 15 20 11 . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 40: EINI LW/WiMa - TU Dortmund

40

Beispiel – mit Array

3

6 12

7 13

9 10 21 15

14

20

Binärer Baum? Ja. Test auf Heap-Eigenschaften …

11

18

1

2 3

4 5 6 7

8 9 10 11 12 13

3 6 12 7 13 18 14 9 10 21 15 20 11 . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 41: EINI LW/WiMa - TU Dortmund

41

Beispiel – mit Array

3

6 12

7 13

9 10 21 15

14

20

Vater größer als Sohn Positionen vertauschen

11

18

1

2 3

4 5 6 7

8 9 10 11 12 13

3 6 12 7 13 18 14 9 10 21 15 20 11 . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 42: EINI LW/WiMa - TU Dortmund

42

Beispiel – mit Array

3

6 12

7 13

9 10 21 15

14

20

Knoten mit Inhalt 18 an der richtigen Position.

18

11

1

2 3

4 5 6 7

8 9 10 11 12 13

3 6 12 7 13 11 14 9 10 21 15 20 18 . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 43: EINI LW/WiMa - TU Dortmund

43

Beispiel – mit Array

3

6 12

7 13

9 10 21 15

14

20

Knoten mit Inhalt 11 an der richtigen Position? Rekursiver Aufruf!

18

11

1

2 3

4 5 6 7

8 9 10 11 12 13

3 6 12 7 13 11 14 9 10 21 15 20 18 . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 44: EINI LW/WiMa - TU Dortmund

44

Beispiel – mit Array

3

6 12

7 13

9 10 21 15

14

20

Binärer Baum? Ja. Test auf Heap-Eigenschaften …

18

11

1

2 3

4 5 6 7

8 9 10 11 12 13

3 6 12 7 13 11 14 9 10 21 15 20 18 . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 45: EINI LW/WiMa - TU Dortmund

45

Beispiel – mit Array

3

6 12

7 13

9 10 21 15

14

20

Vater größer als Sohn Positionen vertauschen

18

11

1

2 3

4 5 6 7

8 9 10 11 12 13

3 6 12 7 13 11 14 9 10 21 15 20 18 . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 46: EINI LW/WiMa - TU Dortmund

46

Beispiel – mit Array

3

6 11

7 13

9 10 21 15

14

20

Knoten mit Inhalt 12 an der richtigen Position.

18

12

1

2 3

4 5 6 7

8 9 10 11 12 13

3 6 11 7 13 12 14 9 10 21 15 20 18 . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 47: EINI LW/WiMa - TU Dortmund

47

Beispiel – mit Array

3

6 11

7 13

9 10 21 15

14

20

Knoten mit Inhalt 11 an der richtigen Position? Rekursiver Aufruf!

18

12

1

2 3

4 5 6 7

8 9 10 11 12 13

3 6 11 7 13 12 14 9 10 21 15 20 18 . . .

1 2 3 4 5 6 7 9 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 48: EINI LW/WiMa - TU Dortmund

48

Beispiel – mit Array

3

6 11

7 13

9 10 21 15

14

20

Binärer Baum? Ja. Test auf Heap-Eigenschaften …

18

12

1

2 3

4 5 6 7

8 9 10 11 12 13

3 6 11 7 13 12 14 9 10 21 15 20 18 . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 49: EINI LW/WiMa - TU Dortmund

49

Beispiel – mit Array

3

6 11

7 13

9 10 21 15

14

20

Binärer Baum? Ja. Heap? Ja.

18

12

1

2 3

4 5 6 7

8 9 10 11 12 13

3 6 11 7 13 12 14 9 10 21 15 20 18 . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 50: EINI LW/WiMa - TU Dortmund

50

Beispiel – mit Array

3

6 11

7 13

9 10 21 15

14

20

Fertig! Neuer Heap mit eingefügtem Inhalt 11.

18

12

1

2 3

4 5 6 7

8 9 10 11 12 13

3 6 11 7 13 12 14 9 10 21 15 20 18 . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 51: EINI LW/WiMa - TU Dortmund

► In das Feld heapFeld wird richtig einsortiert gemäß:

void einsortieren(int knotenNr) {

if (knotenNr > 1)

{

int vaterNr = knotenNr/2;

if (heapFeld[knotenNr] < heapFeld[vaterNr])

{

tausche(knotenNr, vaterNr);

einsortieren(vaterNr);

}

}

}

51

Code: Einsortieren

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 52: EINI LW/WiMa - TU Dortmund

► Grundlegender Schritt für das Sortieren

► Idee einer Hau-Ruck-Lösung:

► Entfernen des kleinsten Elements

► Baue einen neuen Heap ohne das erste Element auf

► z.B. durch sukzessives Einfügen der Elemente in einen neuen Heap

► Nachteil

► Berücksichtigt nicht, dass vor dem Entfernen des kleinsten Elements ein Heap vorliegt

► Idee einer effizienteren Lösung

► siehe Diagramm auf der folgenden Folie

52

Entfernen des kleinsten Elements

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 53: EINI LW/WiMa - TU Dortmund

► Wie behält man in diesem Fall einen Heap?

► Beobachtung

► Jedes Blatt erfüllt die Heapbedingung

► Allgemeinere Situation:

53

Erzeugung eines Heap

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

Wurzel erfülltdie Heap-Bedingung

Unterbäume sollendie Heap-Bedingung erfüllen

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 54: EINI LW/WiMa - TU Dortmund

► Grundlegender Schritt für das Sortieren

► Idee einer Hau-Ruck-Lösung:

► Entfernen des kleinsten Elements

► Baue einen neuen Heap ohne das erste Element auf

► z.B. durch sukzessives Einfügen der Elemente in einen neuen Heap

► Nachteil

► Berücksichtigt nicht, dass vor dem Entfernen des kleinsten Elements ein Heap vorliegt

► Idee einer effizienteren Lösung

► Verwende genau diese Information über die Unterbäume

54

Entfernen des kleinsten Elements

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 55: EINI LW/WiMa - TU Dortmund

55

Beispiel

3

6 11

7 13

9 10 21 15

14

20

Entfernen der Wurzel (kleinstes Element).

18

12

1

2 3

4 5 6 7

8 9 10 11 12 13

3 6 11 7 13 12 14 9 10 21 15 20 18 . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 56: EINI LW/WiMa - TU Dortmund

56

Beispiel

6 11

7 13

9 10 21 15

14

20

Füllen der Wurzel mit dem „letzten“ Element.

18

12

1

2 3

4 5 6 7

8 9 10 11 12 13

. 6 11 7 13 12 14 9 10 21 15 20 18 . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 57: EINI LW/WiMa - TU Dortmund

57

Beispiel

18

6 11

7 13

9 10 21 15

14

20

Knoten mit Index 13 wird nicht mehr benötigt.

12

1

2 3

4 5 6 7

8 9 10 11 12

18 6 11 7 13 12 14 9 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 58: EINI LW/WiMa - TU Dortmund

58

Beispiel

18

116

7 13

9 10 21 15

14

20

Binärer Baum? Ja. Heap? …

12

1

2 3

4 5 6 7

8 9 10 11 12

18 6 11 7 13 12 14 9 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 59: EINI LW/WiMa - TU Dortmund

59

Beispiel

18

116

7 13

9 10 21 15

14

20

Knoten mit Index 2 ist der kleinere Sohn. Vater ist größer …

12

1

2 3

4 5 6 7

8 9 10 11 12

18 6 11 7 13 12 14 9 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 60: EINI LW/WiMa - TU Dortmund

60

Beispiel

6

1118

7 13

9 10 21 15

14

20

Tausche Vater (Index 1) mit kleinerem Sohn (Index 2).

12

1

2 3

4 5 6 7

8 9 10 11 12

6 18 11 7 13 12 14 9 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 61: EINI LW/WiMa - TU Dortmund

61

Beispiel

6

1118

7 13

9 10 21 15

14

20

Knoten mit Index 1, Inhalt 6 am richtigen Platz.

12

1

2 3

4 5 6 7

8 9 10 11 12

6 18 11 7 13 12 14 9 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 62: EINI LW/WiMa - TU Dortmund

62

Beispiel

6

1118

7 13

9 10 21 15

14

20

Rekursiver Aufruf mit geändertem Sohn.

12

1

2 3

4 5 6 7

8 9 10 11 12

6 18 11 7 13 12 14 9 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 63: EINI LW/WiMa - TU Dortmund

63

Beispiel

6

1118

7 13

9 10 21 15

14

20

Binärer Baum? Ja. Heap? …

12

1

2 3

4 5 6 7

8 9 10 11 12

6 18 11 7 13 12 14 9 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 64: EINI LW/WiMa - TU Dortmund

64

Beispiel

6

1118

7 13

9 10 21 15

14

20

Knoten mit Index 4 ist der kleinere Sohn. Vater ist größer …

12

1

2 3

4 5 6 7

8 9 10 11 12

6 18 11 7 13 12 14 9 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 65: EINI LW/WiMa - TU Dortmund

65

Beispiel

6

117

18 13

9 10 21 15

14

20

Tausche Vater (Index 2) mit kleinerem Sohn (Index 4).

12

1

2 3

4 5 6 7

8 9 10 11 12

6 7 11 18 13 12 14 9 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 66: EINI LW/WiMa - TU Dortmund

66

Beispiel

6

117

18 13

9 10 21 15

14

20

Knoten mit Index 2, Inhalt 7 am richtigen Platz.

12

1

2 3

4 5 6 7

8 9 10 11 12

6 7 11 18 13 12 14 9 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 67: EINI LW/WiMa - TU Dortmund

67

Beispiel

6

117

18 13

9 10 21 15

14

20

Rekursiver Aufruf mit geändertem Sohn.

12

1

2 3

4 5 6 7

8 9 10 11 12

6 7 11 18 13 12 14 9 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 68: EINI LW/WiMa - TU Dortmund

68

Beispiel

6

117

18 13

9 10 21 15

14

20

Binärer Baum? Ja. Heap? …

12

1

2 3

4 5 6 7

8 9 10 11 12

6 7 11 18 13 12 14 9 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 69: EINI LW/WiMa - TU Dortmund

69

Beispiel

6

117

18 13

9 10 21 15

14

20

Knoten mit Index 8 ist der kleinere Sohn. Vater ist größer …

12

1

2 3

4 5 6 7

8 9 10 11 12

6 7 11 18 13 12 14 9 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 70: EINI LW/WiMa - TU Dortmund

70

Beispiel

6

117

9 13

18 10 21 15

14

20

Tausche Vater (Index 4) mit kleinerem Sohn (Index 8).

12

1

2 3

4 5 6 7

8 9 10 11 12

6 7 11 9 13 12 14 18 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 71: EINI LW/WiMa - TU Dortmund

71

Beispiel

Knoten mit Index 4, Inhalt 9 am richtigen Platz.

6 7 11 9 13 12 14 18 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

6

117

9 13

18 10 21 15

14

20

12

1

2 3

4 5 6 7

8 9 10 11 12

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 72: EINI LW/WiMa - TU Dortmund

72

Beispiel

Rekursiver Aufruf mit geändertem Sohn.

6 7 11 9 13 12 14 18 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

6

117

9 13

18 10 21 15

14

20

12

1

2 3

4 5 6 7

8 9 10 11 12

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 73: EINI LW/WiMa - TU Dortmund

73

Beispiel

Der hat keine Nachfolger. Fertig.

6 7 11 9 13 12 14 18 10 21 15 20 . . . .

1 2 3 4 5 6 7 8 9 10 11 120 13 14 15 16

6

117

9 13

18 10 21 15

14

20

12

1

2 3

4 5 6 7

8 9 10 11 12

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 74: EINI LW/WiMa - TU Dortmund

74

Code: Heapify01 void heapify(int k) {

02 int lsNR = 2*k; // Nummer des linken Sohns

03 int rsNR = 2*k + 1; // Nummer des rechten Sohns

04 int selSohn; // Nummer des selektierten Sohns

05

06 if (lsNr <= anzahlKnoten && rsNr > anzahlKnoten) { // es gibt

07 if (heapFeld[lsNr] < heapFeld[k] { // keinen

08 tausche(k, lsNr); // rechten

09 } // Sohn

10 }

11 else if (rsNr <= anzahlKnoten) {

12 sel Sohn =(heapFeld[lsNr]<heapFeld [rsNr] ? lsNr : rsNr );

13 // Wähle den Sohn mit der kleineren Markierung aus.

14 // Bei Gleichheit wähle den rechten Sohn.

15

16 if (heapFeld[selSohn] < heapFeld[k]) { // Heap

17 tausche (k, selSohn); // Bedingung

18 heapify(selSohn); // verletzt.

19 }

20 }

21 }

Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 75: EINI LW/WiMa - TU Dortmund

Aufgabe: Benutze Heap zum (effizienten) Sortieren.

► Heapsort arbeitet in zwei Phasen:

► Aufbau eines Heaps aus einem Feld

► Schrittweiser Abbau des Heaps

• Auslesen des Wurzelelementes und Entfernen desselben

• Legen des "letzten" Elementes in die Wurzel

• Rekonstruktion der Heap-Bedingungfür diese restlichen Elemente.

75

Anwendung 1: Heapsort

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 76: EINI LW/WiMa - TU Dortmund

Warum?

Laufzeitenvergleich (mittlere Laufzeit)

zu sortierende naives Sortierverfahren Heapsort

Elemente

10 100 33

100 10.000 664

1.000 1.000.000 9.965

10.000 100.000.000 132.877

100.000* 10.000.000.000* 1.660.964*

1.000.000 1.000.000.000.000 19.931.568

10.000.000 100.000.000.000.000 232.534.966

* 100.000 Vergleiche pro Sekunde: 27 h vs. 16 sek

76

Anwendung 1: Heapsort

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen Dr. Lars Hildebrand – Eini LogWing / WiMa

Page 77: EINI LW/WiMa - TU Dortmund

► Arrays

► Datenstruktur zur Abbildung gleichartiger Daten

► Deklaration

► Dimensionierung und Zuordnung von Speicher zur Laufzeit

► Zuweisung: ganzes Array, Werte einzelner Elemente

► Algorithmen auf Arrays: Beispiel Sortieren

► naives Verfahren: Minimum bestimmen, entfernen, Restmenge sortieren

► Heapsort: ähnlich, nur mit Binärbaum über Indexstruktur

Dr. Lars Hildebrand – Eini LogWing / WiMa 77

Zusammenfassung

Eini LogWIng / WiMa

Kapitel 5

Algorithmen und Datenstrukturen

In diesem Kapitel:

• Prolog

• Arrays

• Sortieren

• Rekursive Datenstrukturen

Page 78: EINI LW/WiMa - TU Dortmund

Dr. Lars Hildebrand – Eini LogWing / WiMa 78

Übersicht

Frohe Weihnachten & guten Rutsch!

Nächste Termine

► Nächste Vorlesung – WiMa 12.1.2017, 08:15

► Nächste Vorlesung – LogWIng 13.1.2017, 08:15

► Nächsten Übungen/Praktika ab 9.1.2017