Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering...

27
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas Hilpold Institut für Wirtschaftsinformatik Software Engineering JKU Linz Termin 6 – rek. Datentypen, verkettete Listen

Transcript of Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering...

Page 1: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1

Algorithmen und Datenstrukturen 1

SS 2002

Mag.Thomas HilpoldInstitut für Wirtschaftsinformatik

Software EngineeringJKU Linz

Termin 6 – rek. Datentypen, verkettete Listen

Page 2: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 2

•Lösung Übung 4 •Themenbereiche heute

• rekursive Datentypen• einfach verkettete Liste• Sortiertes Einfügen

• Übungsbesprechung Übung 6

Übersicht

Page 3: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 3

Lösung Ü4

boolean intersects(↓float r1x, ↓float r1y, ↓float r1width, ↓float r1height, ↓float r2x, ↓float r2y, ↓float r2width, ↓float r2height) {

return (r2x + r2width >= r1x && // rechte kante r2 rechts neben linke Kante r1r2y + r2height >= r1y && r2x <= r1x + r1width && //und: linke Kante r2 links neben rechter Kante r1r2y <= r1y + r1height); //

}

Verbunde, Verbunde mit Operationen

r1r2a

r2c

r2b

r2d

Page 4: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 4

Lösung Ü4 (2)

// prüft, ob das Rechteck r2 vollständig im Rechteck r1 enthalten ist.boolean contains (↓float r1x, ↓float r1y, ↓float r1width, ↓float r1height, ↓float r2x, ↓float r2y, ↓float r2width, ↓float r2height) {

return (r2x >= r1x &&r2y >= r1y &&(r2x + r2width) <= r1x + r1width &&(r2y + r2heigth) <= r1y + r1height);

}

Page 5: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 5

Lösung Ü4 (3)

// erzeugt ein neues Rechteck r3, das die Schnittmenge der Rechteck r1 und r2 enthält.// falls keine Schnittmenge –1,-1,-1,-1createIntersection(↓float r1x, ↓float r1y, ↓float r1width, ↓float r1height, ↓float r2x, ↓float r2y, ↓float r2width, ↓float r2height, ↑float r3x, ↑float r3y, ↑float r3width, ↑float r3height) {

if (intersects(r1x, r1y, r1widht, r1height, r2x, r2y, r2width, r2 height) {r3x = Math.max(r1x, r2x);r3y = Math.max(r1y, r2y);r3width = Math.min(r1x +r1width, r2x + r2width) - r3x;r3height = Math.min(r1y +r1heigth, r2x + r2height) – r3y;

}else {r3x = -1; r3y = -1; r3width = -1; r3heigth = -1;

}}

Page 6: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 6

Lösung Ü4 (4)type Rectangle = {

float x;float y;float width;float height;

}

Rectangle createIntersection(↓Rectangle r1, ↓Rectangle r2) // Funktion statt Methodeoder createIntersection(↓Rectangle r1, ↓Rectangle r2, ↑Rectangle r3) { // Methode

if (intersects(r1, r2) {r3.x = Math.max(r1.x, r2.x);r3.y = Math.max(r1.y, r2.y);r3.width = Math.min(r1.x +r1.width, r2.x + r2.width) - r3.x;r3.height = Math.min(r1.y +r1.heigth, r2.x + r2.height) – r3.y;

}else {r3.x = -1; r3.y = -1; r3.width = -1; r3.heigth = -1;

}}

Page 7: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 7

Lösung Ü4 (5)type Rectangle = {

float x;float y;float width;float height;...Rectangle createIntersection(↓Rectangle r)boolean intersects(↓Rectangle r) ...

}Rectangle createIntersection(↓Rectangle r) {

Rectangle ret;if (intersects(r) {

ret.x = Math.max(x, r.x);ret.y = Math.max(y, r.y);ret.width = Math.min(x +width, r.x + r.width) – ret.x;ret.height = Math.min(y +heigth, r.x + r.height) – ret.y;

}else {ret.x = -1; ret.y = -1; ret.width = -1; ret.heigth = -1;

}return ret;

}

Page 8: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 8

Lösung Ü4 (6)Algorithmen mit Gedächtnis

// totalDistance... Distanz seit erstem Aufruf in KM ; actSpeed... Momentangeschwindigkeit in KM/Hpulse(↑float totalDistance, ↑float actSpeed) {

final float DIAMETER_OF_TYRE = 2200/3.14159265; // Reifendurchmesser mmfinal float CIRCUMFERENCE = DIAMETER * PI / 1E3 //– in Meterstatic int pulseCount = 0; // Anzahl der Aufrufestatic float lastCallTime // first initialization

static boolean validLastCallTime = FALSE

if (!validLastCallTime){validLastCallTime = TRUElastCallTime = getTime()totalDistance = 0.0actSpeed = 0.0return // returns !!

}float curCallTime = getTime();float delay = curCallTime – lastCallTime;pulseCount++;totalDistance = pulseCount * CIRCUMFERENCE / 1000; // in KM// assert delay > 0actSpeed = (CIRCUMFERENCE) / delayactSpeed = actSpeed / 3.6; // m/sec -> km/hif (actSpeed < 1) actSpeed = 0; // erst ab 1 km/h sinnvoller WertlastCallTime = curCallTime; // merke letzte Zeit

}

Page 9: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 9

RückblickRückblick

Datentypen• elementare Datentypen • Verbunde (type)

• werden implizit erzeugt• keine Referenzen, Variable repräsentiert ganzes Datenobjekt

• Referenzdatentypen (refType)• dynamisch verwaltete Datenobjekte• Referenzvariable• werden explizit erzeugt und gelöscht (new/delete)

Page 10: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 10

Rekursive Datentypen

AllgemeinesEin rekursiver Datentyp enthält Referenzvariablen vom eigenen Typ.Referenzdatentypen sind eine Voraussetzung für rekursive Datentypen.

Beispiel:refType Node = {

int valueNode next

}

Node first, otherfirst = new Node; first^.value = 1;other = new Node; other^.value = 2; first^.next = other;other = new Node; other^.value = 3; first^.next^.next = other;

Page 11: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 11

Rekursive Datentypen

AllgemeinesEin rekursiver Datentyp enthält Referenzvariablen vom eigenen Typ. (Voraussetzung: Referenztypen !!)Mit rekursiven Datentypen kann man dynamische Datenstrukturen realisieren (Listen, Bäume, ...)

Beispiel:refType Node = {

int valueNode next

}

Node first, otherfirst = new Node; first^.value = 1;other = new Node; other^.value = 2; first^.next = other;other = new Node; other^.value = 3; first^.next^.next = other;

value = 1next

value = 2next

value = 3next

first

Page 12: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 12

Verkettete Listen

AllgemeinesVerkettete Listen sind dynamische Datenstrukturen. Sie bestehen aus Knoten (nodes, rekursiver Datentyp), die –je nach Listenart- auf Nachfolgeknoten und/oder Vorgängerknoten zeigen.

value = 1next

value = 2next

value = 3next

head

Beispiel – einfach verkettete Liste

Operationen ?

Page 13: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 13

Einfach verkettete Liste

Operationen• vorne einfügen (insertFirst)• hinten anfügen (append)• löschen (delete) (eines, ganze Liste)

value = 1next

value = 2next

value = 3next

head

BeispielZiel: einfach verkettete Liste mit Knoten, die int-Wert enthalten.Realisierung: Referenzdatentyp mit oder ohne Operationen?

Page 14: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 14

Einfach verkettete Liste

ohne und mit List

value = 1next

value = 2next

value = 3next

first

reftype Node = {int valueNode next

}

append( Node node, int a)f() {Node first;append(first, 12)}

type List = {reftype Node = {

int valueNode next

} // Node

Node first // !init() {

first = null}append(int a) // zu List !

} // Listf() {List l; l.init()append(10)}

Page 15: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 15

Einfach verkettete Liste

insertFirst

value = 5next

first

List l; l.init()l.insertFirst(5) // 1 Liste leer, first zeigt auf nulll.insertFirst(3) // 2

Einfügen an Beginn der Liste. Liste kann leer oder ein oder mehrere Elemente enthalten.

first zeigt immer auf das erste Element oder null (== leer)

nach 1

value = 3next

firstnach2 value = 5next

Page 16: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 16

Einfach verkettete Liste

insertFirst

value = 5next

first

insertFirst(int a) {Node newElemnewElem = new NodenewElem^.value = anewElem^.next = first // neues Element zeigt auf bisherigs erstesfirst = newElem // und wird erstes Element der Liste

}

nach 1

value = 3next

firstnach2 value = 5next

Page 17: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 17

Einfach verkettete Liste

insertLast (hinten anfügen), append

value = 5next

first

List l; l.init()l.insertLast( 5) // 1l.insertLast( 3) l.insertLast( 4) // 2

nach 1

value = 5next

firstnach2 value = 3next

value = 4next

hier Sonderfall, Liste leer

1. suche Letztes (cur^.next == null)

2. Letztes soll auf Angehängtes zeigen

3. Angehängtes zeigt auf null

Page 18: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 18

Einfach verkettete ListeinsertLast(int a) {

Node newElemnewElem = new NodenewElem^.value = anewElem^.next = nullif (first != null) { // sonderfall leer

first = newElem} else { // suche,...

Node curcur = firstwhile (cur^.next != null) {

cur = cur^.next}cur^.next = newElem

}} value =

5next

firstnach2 value = 3next

value = 4next

1. suche Letztes (cur^.next == null)

2. Letztes soll auf Angehängtes zeigen

3. Angehängtes zeigt auf null

Page 19: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 19

Einfach verkettete Liste

delete (löschen der Liste)l.delete() // alle Elemente werden gelöscht// first zeigt auf null, liste leer

value = 5next

first value = 3next

value = 4next

1. durchlaufe liste

2. falls aktuelles nicht null ->

merke nächstes

lösche aktuelles

Page 20: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 20

Einfach verkettete Listedelete() {

Node cur, next;cur = firstwhile (cur != null) {

next = cur^.nextdelete curcur = next;

}first = null;

}

value = 5next

first value = 3next

value = 4next

starte mit first

durchlaufe liste solange aktuelles nicht null{

merke Nachfolger

lösche aktuelles

aktuelles = Nachfolger

}

Page 21: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 21

Einfach verkettete Liste

Zusammenfassung

value = 5next

first value = 3next

value = 4next

• unsortierte Liste• Verbund Liste mit Referenzdatentyp node• Liste hat einige Operationen (insertFirst, insertLast, delete)

Page 22: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 22

Einfach verkettete Liste

Sortierung

value = 1next

first value = 2next

value = 3next

Ziel: aufsteigend sortierte Listenötig: Operation insert(int a)

insertFirst, insertLast kann Sortierung zerstören.Löschen eines Elements ändert nichts an der Sortierung.

Lösungsidee:1. Neues Erzeugen (trivial)2. Position suchen3. Einfügen (Sonderfall, erstes, letztes)

Page 23: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 23

Sortieres Einfügen in ListeSuche der Einfügeposition

value = 1next

first value = 5next

value = 7next

cur = first; prev = nullwhile (cur != null && cur^.value < newElem.value) {

prev = cur // prev nötig, da prev^.next nötigcur = cur^.next

} // prev zeig// einfügen als erstes ? prev = null, cur egal, Liste leer// einfügen in der mitte ? prev != null// einfügen als letztes ? prev != null, cur == null

value = 3next

prev cur

Page 24: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 24

Sortieres Einfügen in ListeEinfügen (1. Element)

value = 1next

first value = 5next

value = 7next

if (prev == null) {first = newElem;newElem^.next = cur; // auch wenn cur == null, also Liste leer

}

value = 0nextprev cur

Page 25: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 25

Sortieres Einfügen in ListeEinfügen (Mitte, Ende)

value = 1next

first value = 5next

value = 7next

if (prev != null) {prev^.next = newElem; newElem^.next = cur; // auch wenn cur == null, also Ende

}

value = 6nextprev

cur

Page 26: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 26

Sortieres Einfügen in ListeEinfügen

insertSorted(int a) {Node newElem, cur, prevnewElem = new NodenewElem^.value = a

//position suchencur = first; prev = nullwhile(cur != null && cur^.value < newElem.value) {

prev = curcur = cur^.next

}if (prev != null) { // Mitte oder Ende

prev^.next = newElem} else {

first = newElem}newElem^.next = cur

} // end insertSorted

Page 27: Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.

Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 27

Übung 6ad 1) StudentList

• Doppelt verkettete nach Matrikelnummern sortierte Liste

• reftype Student nicht verändern (Student statt int in Übung)

• Liste erzeugt und löscht nur Knotenelemente, keine Students

• remove(int matNr) // Annahme eindeutig ??

• printAscending / printDescending – Liste von first oder last beginnend

ad 2) TODO-List

•insertTask(Task t)

•boolean next(Task t) •absteigend sortiert einfügen -> höchste Priorität zuerst

•Task ist ein Verbundtyp