Abstrakte Daten Typen

Werbung
252-0027
Einführung indie Programmierung I
11.0Abstrakte Datentypen
ThomasR.Gross
DepartmentInformatik
ETHZürich
Copyright(c)Pearson2013andThomasGross2016
Allrightsreserved.
Uebersicht
§ 11.1Stacks
§ 11.2Warteschlangen (Queues)
§ 11.3Iterator
§ 11.4Schnittstelle vs.Implementation
2
Abstrakte Daten Typen (ADT)
§ InJava(insb.im CollectionFramework)beschreiben wir ADTs
mit Interfaces:
§ Collection,Deque,List,Map,Queue,Set,SortedMap
§ Ein ADTkann dann aufdurch verschiedene Klassen
implementiert sein:
§ ArrayList undLinkedList
implementiert List
§ Stack
implementiert ???
§ Ooops – Stackswurden vergessen,es gibt nur eine Klasse (bzw List)
Warteschlangen
§ Warteschlange ("Queue):Elemente werden inder
Reihenfolge entfernt indersie hinzugefuegt wurden
§ First-In,First-Out("FIFO")
§ Elemente werden inderReihenfolge gespeichert inderindieSammlung hinzugefuegt
wurden aber es gibt keinen Index.
§ Klient kann nur amAnfang hinzufuegen und
amEnde entfernen.
Warteschlangen
§ Wassind dieOperationen dieeine Queueanbieten muss?
§ Hinzufügen ("insert")
add (enqueue): Ein ElementamSchluss derWarteschlange hinzufügen.
§ Entfernen ("remove")
remove (dequeue):Dasvorderste Elemententfernen.
§ Anschauen ("examine")
element:Dasvorderste Elementanschauen.
6
Warteschlangen inderInformatik
§ Betriebssysteme:
§ QueuederDruckaufträge für einen Drucker
§ QueuederProgramme (Prozesse)dieausgeführt werden sollen
§ QueuederDatenpackete diezu sendsind bzw.dieempfangen wurden
§ Programmierung:
§ Modellierung einer Schlange vonKunden oder Klienten
§ Folge vonInstruktionen dieausgeführt werden sollen
Arbeiten mit Queues
add(value) places given value at back of queue
remove()
removes value from front of queue and returns it;
throws a NoSuchElementException if queue is
empty
element() returns front value from queue without removing it
size()
isEmpty()
returns number of elements in queue
returns true if queue has no elements
Queue<Integer> q = new LinkedList<Integer>();
q.add(42);
q.add(-3);
q.add(17);
// front [42, -3, 17] back
System.out.println(q.remove());
// 42
9
Warum Interface(undnicht Klasse)?
§ InderPraxisbrauchen wir oftQueuesmit weiteren
Eigenschaften
§ (Dazu später mehr)
§ Wenn wir eine QueueInstanz brauchen müssen wir eine Klasse
verwenden,diediesesInterfaceimplementiert.
§ Z.B.können wir LinkedList verwenden
Queue<Integer> q = new LinkedList<Integer>();
§ Queue geht nicht.
10
Erwartungen andenKlienten
§ Wassollen wir machen wenn derKlient eine remove
Operationversucht unddieQueueenthält keine Elemente?
11
Erwartungen andenKlienten
§ Wassollen wir machen wenn derKlient eine remove
Operationversucht unddieQueueenthält keine Elemente?
1. Fehler desKlienten – throwIllegalStateException
Exception
2. Kann passieren (z.B.,es gibt keine Arbeit mehr zu erledigen)
– Klient mussinformiert werden aber keine
"aussergewöhnliche Situation"
3. ???
12
1. Fehler desKlienten – throwIllegalStateException
Exception
§ Verhalten derremove() Operation
13
3. ???
§ Ein häufiges Einsatzgebiet für Queuesist Kommunikation in
parallelen (undverteilten)Systemen
§ Z.B.Lesen vonempfangenen (Netzwerk)Packeten
§ Wenn es kein Packetgibt müssen wir warten
§ Z.B.Schicken eines Packets
§ Wenn es keinen Platz gibt (oder dasNetzwerk nicht verfügbar ist)
dann wollen wir warten
§ Es ist normaldass daswir nicht sofort senden können
14
15
KlassendieQueue implementieren
§ DiverseKlassenimplementieren dasQueueInterface
§ Legen z.B.Verhalten bei voller (insert)undleerer Queue
(remove)fest
§ ArrayBlockingQueue, LinkedBlockingDeque,
SynchronousQueue
§ Arbeitet evtl.dann mit einer festen Anzahl vonQueueSlots
("capacity")
16
2. Kann passieren (z.B.,es gibt keine Arbeit mehr zu erledigen)
– Klient mussinformiert werden aber keine
"aussergewöhnliche Situation"
§ Ein zweiter Satz vonMethoden
§ Hinzufügen ("insert")
offer(enqueue):Ein ElementamSchluss derWarteschlange
hinzufügen sofern es Platz gibt
§ Entfernen ("remove")
poll(dequeue):Dasvorderste Elemententfernen sofern nicht leer
§ Anschauen ("examine")
peek:Dasvorderste Elementanschauen.
§ Diese Methoden liefern null oder false anstatt eine
Exceptionzu generieren
17
Arbeiten mit Queues
offer(value)
poll()
places given value at back of queue, returns true if successful
peek()
returns front value from queue without removing it;
returns null if queue is empty
size()
isEmpty()
returns number of elements in queue
returns true if queue has no elements
removes value from front of queue and returns it;
returns null if queue is empty
Queue<Integer> q = new LinkedList<Integer>();
q.offer(42); // could also use add
q.add(-3);
// front [42, -3] back
System.out.println(q.poll());
System.out.println(q.poll());
System.out.println(q.poll());
//
//
//
//
42, could use remove instead
-3, could use remove instead
null
remove throws exception
Einsatz vonQueues
§ Wie bei denStacksmüssen wir denInhalt entfernen umihn
anzusehen.
while (!q.isEmpty()) {
dosomethingwith q.remove();
}
§ Jedes Elementgenau einmal inspizieren (aber Queuenicht
ändern).
int size = q.size();
for (int i = 0; i < size; i++) {
dosomethingwith q.remove();
//undevtl.wieder indieQueue(amEnde!)einfügen
}
§ Warum brauchen wir eine separateVariablesize dievor dem Loop
initialisiert wird?
20
21
Mengen
§ Menge (“set”):Eine Sammlung eindeutiger undeinzigartiger
Elemente (d.h.,wir lassen keine Duplikate zu undkönnen für 2beliebige
Elemente feststellen,obsie gleich oder ungleich sind)für diefolgende
Operationen ausgeführt werden können:
§ Hinzufügen (add),Entfernen (remove),Suche (contains)
§ Bei einer Menge erwarten wir keinen Zugriff über einen Indexund
eine Reihenfolge spielt keine Rolle
set.contains("to")
set.contains("be")
"if"
"the"
"to"
"of"
"down"
"from"
"by"
"she"
"you"
"in"
"why" "him"
true
false
set
23
Set Implementierungen
§ InJavakönnen Mengendurch dasSet Interface(aus
java.util) realisiert werden
§ Set wird durch dieKlassen HashSet undTreeSet
implementiert
Abbildungen (Maps)undMengen (Sets)
§ Eine Menge ist eine Abbildung (map)der Elemente auf
bool’sche Werte.
§ Set:Ist ”ETH"inder Menge?(true/false)
”ETH"
true
Set
false
§ Map: Wasist diePostleitzahl der ”ETH”?
”ETH"
Map
”8092"
∀Elemente der Menge
§ DadieOrdnung derElemente inderMengennicht bekannt ist
müssen wir einen (stabilen)Weg finden,Operationen mit
allen Elemente einer Menge auszuführen.
§ DieOperationkann einen Testeinschliessen derdann – jenach
Ergebnis – dieOperationen genauer definiert
§ Wenn element.hasProperty() dann element.moreOps()
§ Idee:Schleife über alle Elemente einer Menge
26
keySet
§ DieMethode keySet liefert dieMenge (Set)aller “Keys”
(Schlüssel)inderAbbildung (Map)
§ Kann dieMenge aller Keysineiner foreach Schleife bearbeiten
§ Kann denWertderzu einem Keygehört durch Aufruf vonget für die
Maperhalten
Map<String, Integer> ages = new TreeMap<String, Integer>();
ages.put(”Roland", 19);
ages.put(”Clara", 2); // ages.keySet() returns Set<String>
ages.put(”Sarah", 57);
for (String name : ages.keySet()) {
// Clara -> 2
int age = ages.get(name);
// Roland -> 19
System.out.println(name + " -> " + age); // Sarah -> 57
}
values
§ DieMethode values liefert eine Ansammlung aller inder
Mapauftretenden Werte
§ Kann über diese Werte mit einer foreach Schleife abarbeiten
§ Esgibt keinen einfachen Weg dieSchlüssel für einen Wertzu finden
29
Uebung
§ Schreiben Sie ein Programm,daszählt wieviele verschiedene
Wörter ineinem Textauftauchen.
§ Speichern Sie dieWörter ineiner (An)Sammlung undgeben Sie die
Anzahl deraufgetretenen Wörter aus.
§ Nach dem Einlesen desTextes sollte es möglich sein,festzustellen ob
ein bestimmtes Wortim Textauftritt.
§ Geben Sie jedes Wortdasmindestens 1000malauftritt aus
(sortiert nach derHäufigkeit (von1000anaufwärts))undentfernen es
aus derMenge.
Mit denElementen einer Menge (Map)arbeiten
§ AufdieElemente eines JavaSetsoder einer JavaMap kann
nicht mittels eines Indexzugegriffen werden
§ Dafür gibt es den"foreach"Loop:
Set<Integer> scores = new HashSet<Integer>();
for (int score : scores) {
System.out.println("The score is " + score);
}
Die"foreach”Schleife
Syntax:
for (type name : collection) {
statements;
}
§ Definiert einen Loopüber alle Elemente einer beliebigen
Collection(z.B.,Set,List, Arrayoder andere)
Beispiel
Set<Double> temperatures = new HashSet<Double>();
...
for (double measured : temperatures) {
System.out.println(”Measured Temp (F): " + measured);
}
Die"foreach”Schleife
§ Problem: Dieforeach Schleife ist "read-only",d.h.dieMenge darf
nicht modifiziert werden während derLoopausgeführt wird.
for (int score : scores) {
if (score >= 1000) {
// throws a ConcurrentModificationException
scores.remove(score);
}
}
33
Iteratoren
§ Iterator("iterator"):Ein Objekt daseinem Klienten erlaubt,
dieElemente einer Ansammlung zu besuchen
§ Erinnert sich andie(aktuelle)Positionanderlaubt es
§
§
§
§
aufdasElementandieser Positionzuzugreifen
dasElementandieser Positionzu entfernen
abzufragen ob es weitere Elemente gibt
zur nächsten Positionvorzurücken
list
index 0 1 2 3 4
5
6 7 8 9
value 3 8 9 7 5
1
2
0 0 0 0
size
iterator
6
current element: 9
currentindex:2
set
"the"
"to" "we"
"from"
iterator
current element: "from"
next element:
"the"
35
Iterator Methoden
hasNext() returns true if there are more elements to examine
next()
returns the next element from the collection (throws a
NoSuchElementException if there are none left to examine)
remove()
removes the last value returned by next() (throws an
IllegalStateException if you haven't called next() yet)
§ Iterator ist ein Interfaceinjava.util
§ Jede Ansammlung stellt dieiterator() Methode zur Verfügung,
dieeinen Iteratorliefert mit dem dieElemente besucht werden
können.
Set<String> set = new HashSet<String>();
...
Iterator<String> itr = set.iterator();
37
Iterator Beispiel 1
Set<Integer> scores = new TreeSet<Integer>();
scores.add(94);
scores.add(38);
// Kim
scores.add(87);
scores.add(43);
// Marty
scores.add(72);
...
Iterator Beispiel 1(Teil 2)
Iterator<Integer> itr = scores.iterator();
while (itr.hasNext()) {
int score = itr.next();
System.out.println("The score is " + score);
// eliminate any failing grades
if (score < 60) {
itr.remove();
}
}
System.out.println(scores);
// [72, 87, 94]
39
Iterator Beispiel 2
Map<String, Integer> scores = new TreeMap<String, Integer>();
scores.put("Kim", 38);
scores.put("Lisa", 94);
scores.put("Roy", 87);
scores.put("Marty", 43);
scores.put("Marisa", 72);
...
Iterator Beispiel 2 (Teil 2)
Iterator<String> itr = scores.keySet().iterator();
while (itr.hasNext()) {
String name = itr.next();
int score = scores.get(name);
System.out.println(name + " got " + score);
// eliminate any failing students
if (score < 60) {
itr.remove();
// removes name and score
}
}
System.out.println(scores);
// {Lisa=94, Marisa=72, Roy=87}
41
DerADT"Map"
§ Map,Abbildung ("map"):Hält eine Menge Schlüssel (keys)
undeine (An)Sammlung vonWerten (values),wobei jeder
Schlüssel mit einem Wertassoziiert ist.
§ Auch als "dictionary","associativearray",
"hash"bekannt.
myMap.get("Juliet") returns "Capulet"
DerADT"Map"
§ Wichtigste Operationen:
§ put(key,value):Hinzufügen eines Schlüssels mit einem Wert
§ get(key):Lesen desWertes dermit dem Schlüssel assoziiert ist.
§ remove(key):Entfernen desSchlüssels (unddesmit ihm assoziierten
Wertes)
45
Map Implementation
§ InJava, Abbildungen (“maps”)werden durch Map Interfacein
java.util unterstützt.
§ Map wird durch dieKlassen HashMap undTreeMap
implementiert
§ HashMap: mit einem Array,dem "hashtable”,implementiert;
sehr effizient:O(1) ; Schlüssel sind inirgendeiner Reihenfolge
gespeichert.
§ TreeMap: mit einem binärem Baumimplementiert;
ziemlich effizient:O(logN) ; Schlüssel sind sortiert gespeichert
§ Eine Abbildung erfordert 2TypeParameter:einen für die
Schlüssel,einen für dieWerte.
// maps from String keys to Integer values
Map<String, Integer> votes =
new HashMap<String, Integer>();
48
Map Methoden
put(key, value)
containsKey(key
)
adds a mapping from the given key to the given value;
if the key already exists, replaces its value with the given
one
returns the value mapped to the given key (null if not
found)
returns true if the map contains a mapping for the given
key
remove(key)
removes any existing mapping for the given key
clear()
removes all key/value pairs from the map
size()
returns the number of key/value pairs in the map
isEmpty()
returns true if the map's size is 0
toString()
returns a string such as "{a=90, d=60, c=70}"
get(key)
Map Methoden
keySet()
returns a set of all keys in the map
values()
returns a collection of all values in the map
putAll(map)
adds all key/value pairs from the given map to this map
equals(map)
returns true if given map has the same mappings as this
one
50
Einsatz vonAbbildungen
§ Eine Abbildung stellt eine Assoziation zwischen Schlüssel und
Werten her.
§ Speichert einen Wertfür jeden Index(Schlüssel).
//
key
value
put(”ETH", ”044-632-1111")
Map
§ Später brauchen wir nur einen Schlüssel angeben underhalten den
entsprechenden Wertzurück:
Dannkönnen wir fragen:Wasist dieETHTelefonnummer?
get(”ETH")
Map
"044-632-1111"
Lösung der1.Uebungsaufgabe
// read file into a map of [word --> number of occurrences]
Map<String, Integer> wordCount = new HashMap<String, Integer>();
Scanner input = new Scanner(new File("mobydick.txt"));
while (input.hasNext()) {
String word = input.next();
if (wordCount.containsKey(word)) {
// seen this word before; increase count by 1
int count = wordCount.get(word);
wordCount.put(word, count + 1);
} else {
// never seen this word before
wordCount.put(word, 1);
}
}
Scanner console = new Scanner(System.in);
System.out.print("Word to search for? ");
String word = console.next();
System.out.println("appears " + wordCount.get(word) +
" times.");
53
Abstraktion
§ Prozedural :
§ DetailsdesVerhaltens (Prozeduren,z.B.derMethoden)nicht sichtbar
§ Spezifikation desVerhaltens ist dieAbstraction
§ Müssen dieSpezifikation mit einer Implementationerfüllen
§ Darstellung:
§ DetailsderDatendarstellung nicht sichtbar
§ Auch ein Weg Eigenschaften zu spezifizieren
§ Ein Ansatzüber Programm +Daten zu folgern
§ StandardTerminologie:Abstrakte DataTypen,oder ADT
54
Warum ist Daten Abstraktion sowichtig
§ Arbeiten mit Daten zentrales Thema vieler Anwendungen
§ "Datenverarbeitung"
§ DataScience
§ Entwickeln (undBeschreiben)vonAlgorithmen seltener
§ Ueberlegen Sie sich welchen Datenstrukturen Sie brauchen
§ Wie werden diewichtigen Daten organisiert?
§ Welche Operationen dürfen Klienten mit denDaten machen?
55
Warum ist Daten Abstraktion sowichtig
§ Mögliche Probleme diesich beim Ausarbeiten der
Abstraktion derDatendarstellung ergeben können:
§ Entscheidungen für/gegen eine Datenstruktur werden zu früh gemacht
§ Unnötige Wiederholungen (insbesonderen wenn Transformationen
gemacht werden)
§ Spätere Aenderungen der(Kern)Datenstrukture(n)oftschwierig bzw
aufwending
§ Gliederung inModulehilft ist aber nicht einfach
56
Ein ADTdefiniert Operationen
§ ADTabstrahiert dieOrganizationundbetont dieBedeutung
derDaten
§ ADTändert Fokus vonStruktur aufGebrauch
§ Darstellung sollte für denKlienten nicht wichtig sein
§ Daher sollte sie nicht sichtbar sein!
class RightTriangle {
double base, altitude;
}
class RightTriangle {
double base, hypot, angle;
}
§ Denken im Raum derOperationen
§ Instanzieren,getBase,getAngle,….
57
Sinddiese Klassengleich?
class Point {
}
class Point {
public double x;
public double r;
public double y;
public double theta;
}
§ (Nein)Unterschiedlich:können nicht dieeine Klasse durch die
andere ineinem Programm ersetzen
§ (Ja)Gleich :Beide Klassenimplementieren dieIdee eines
"Punktes ineiner 2-dimEbene"
58
Warum ADTs?
§ DerKlient sollte mit Operationen (Methode)arbeiten
§ Nicht direkt mit Daten – dann mussdieDarstellung bekannt sein
§ Ziel derADTMethodologie ist es,dieGleichheit (aufder
vorherigen Seite)auszudrücken:
§ Klienten sollten mit Idee eines "Punktes ineiner 2-dimEbene"
arbeiten
§ Undnicht mit derDarstellung
59
Vorteile eines Fokus aufADTs
§ Wenn Klienten dieDatenabstraktion respektieren (oder
respektieren müssen)
§ z.B.arbeitet mit einem "Punkt ineiner 2-dimEbene mit diesen
Operationen"
§ Entscheidung über dieImplementationdesADTkann
aufgeschoben werden
§ Können Fehler durch Aenderung derDarstellung beheben
§ Algorithmen können geändert werden
§ Um(bessere)Leistung zu erhalten
§ Umbesondere Situationen auszunutzen
60
Idee eines 2-dPunktes,als ein ADT
class Point {
// A 2-d point exists in the plane, ...
public double x() { … };
public double y() { … };
public double r() { … };
Observers
public double theta() { … };
// ... can be created, ...
public Point() { ... }; // new point at (0,0)
public Point centroid(Set<Point> points) { … };
Creators/
Producers
61
Idee eines 2-dPunktes,als ein ADT(Teil 2)
// ... can be moved, ...
public void translate(double delta_x, double delta_y) { … };
public void scaleAndRotate(double delta_r,
Mutators
double delta_theta) { … };
// attributes
private double x;
private double y;
}
62
ADT=Objekte +Operationen
Rest des
Programms
Klienten
Point
x
y
r
theta
translate
scale_ro
t
"Abstraction
barrier
Implementation
§ Implementationist nicht sichtbar (versteckt)
§ Für Objekte desTyps gibt es nur dieOperationen,dievon
63
derAbstraktion zugelassen sind
Herunterladen