Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering...
-
Upload
emmeline-reck -
Category
Documents
-
view
215 -
download
2
Transcript of Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering...
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
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
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
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);
}
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;
}}
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;
}}
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;
}
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
}
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)
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;
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
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 ?
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?
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)}
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
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
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
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
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
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
}
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)
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)
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
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
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
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
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