ADT:er, datastrukturer och standardklasser i Java Föreläsning 2 (Weiss kap. 6) Datatyp, abstrakt datatyp, datastruktur Några vanliga datastrukturer Tillämpningar Tidskomplexitet Standardklasser Standardalgoritmer Datatyp En datatyp är en mängd av värden Ex. int, char, boolean, double, Person, String Typer som int, char, boolean och float kallas ibland konkreta datatyper eftersom de är inbyggda i språket och har en direkt representation i datorns minne Definitionen av en datatyp säger ej nödvändigtvis vilka operationer som är giltiga för den nya typen 1 2 Abstrakt datatyp En Abstrakt DataTyp (ADT) består av en datatyp (en mängd av värden) operationer som är giltiga för värden av typen axiom som beskriver operationernas betydelse Ex. heltalen tillsammans med de aritmetiska operationerna + - * / och lagarna för aritmetik En abstrakt datatyp definierar inte hur värden av typen representeras i en dator En abstrakt datatyp kan implementeras på olika sätt Datastruktur Representation av data (värden) och operationer i en abstrakt datatyp En datastruktur är en konkret implementering av en abstrakt datatyp -- med hjälp av typbildningskonstruktioner i ett programmeringsspråk: Datarepresentation för typens värden int, char, boolean, float + fält, post (struct), pekare, + Algoritmer för typens operationer metoder, operatorer 3 4 Exempel på datastrukturer Datastrukturers resurskrav ADT:n Mängd av heltal med operationerna add och contains implementeras av datastrukturerna SimpleSet och SetOfInt (båda representeras som fält - men på olika sätt) Datarepresentationen påverkar datastrukturens minnesbehov beräkningstiden för strukturens operationer ADT:erna Stack (Last-In-First-Out) Kö (First In First Out) kan t.ex. representeras med: Fält Länkad lista 5 Fält + snabb åtkomst av samtliga element - ofta outtnyttjat minne (overhead) Länkad lagring + minnesåtgången motsvarar behovet, men - en (eller flera) extra pekare per dataelement - åtkomst av vissa element kan vara långsam 6
Några vanliga ADT:er Stack Stack Kö Lista Sökträd HashTabell Prioritetskö Map LIFO FIFO flexibel access ordnad mängd oordnad mängd ordnad kö avbildningstabell (associationslista) LIFO = Last In First Out push(x) Lägger x överst på stacken pop() Tar bort översta elementet top() Returnerar översta elementet isempty() Avgör om stacken är tom push(x) x top x pop 7 8 Kö FIFO = First In First Out enqueue(x) Lägger x sist i kön dequeue() Tar bort första elementet getfront() Returnerar första elementet isempty() Avgör om kön är tom y getfront y x enqueue(x) Lista Insättning och uttag kan göras i valfri position a c d e f b dequeue 9 10 Sökträd Ordnat binärt träd utan duplikat (ordnad mängd) add(x) Sätter in x i trädet y contains(x) Söker efter x i trädet remove(x) Tar bort x ur trädet isempty() Avgör om trädet är tomt x < y x > y Hashtabell Tabellbaserad struktur utan duplikat (oordnad mängd) add(x) Sätter in x i tabellen contains(x) Söker efter x i tabellen remove(x) Tar bort x ur tabellen isempty() Avgör om tabellen är tom Allan Kalle hash() 0 1 2 N-1 Kalle Allan 11 12
Prioritetskö Snabb access av minsta elementet (ordnad kö) add(x) Lägger x i kön peek() Returnerar minsta elementet y remove() Tar bort minsta elementet isempty() Avgör om kön är tom Map Tabell för namn-värde-avbildningar add(k,x) Sätter in avbildningen (k,x) i tabellen get(k) Returnerar värdet med nyckeln k remove(k) Tar bort nyckeln k ur tabellen isempty() Avgör om tabellen är tom x > y x > y Kalle 031-123456 Allan 023-112112 13 14 Tillämpningar Stack Lagring av aktiveringsposter i blockstrukturerade programmeringsspråk. Reversering av dataström x,y,z,,z,y,x DFS = Djupet Först Sökning i grafer och träd Ex. kommandot back i Zuul (sökning efter ett visst rum) Ex. parentesmatchning (()([]())) ([)] 15 16 FIFO-kö Operativsystem BFS = Bredden Först Sökning i grafer och träd Ex. Nivåvis genomlöpning av träd Ex. Släck ljuset rum för rum i ett hus 4 4 4 4 4 4 4 4 3 3 3 3 3 4 4 3 2 2 2 3 4 4 3 2 1 2 3 4 4 3 2 2 2 3 4 4 3 3 3 3 3 4 Binära sökträd Ex. Ordlistor Ordnade mängder med stor förändringsintensitet Om sökning blandas med insättningar och uttag sök blir linjära strukturer som listor och fält blanda uttag alltför ineffektiva alltför med 4 4 4 4 4 4 4 Beräkning av kortaste avstånden i en oviktad graf 17 18
Hashtabell Symboltabeller i kompilatorer Oordnade mängder med stor förändringsintensitet Sökning blandat med insättningar och uttag Spelprogram Ex. memorering av spelställningar i ett schackparti Prioritetskö Operativsystem Datakompression med Huffmans algoritm MST = Minsta Uppspännande Trädet i grafer Dijkstras algoritm för kortaste avstånden i viktad graf 19 20 Tidskomplexitet hos vanliga datastrukturer DS Access, T(N) Kommentar Stack Sist insatta, O(1) Mycket snabb FIFO-kö Först insatta, O(1) Mycket snabb Länkad lista Valfritt element, O(N) Linjärsökning Sökträd Valfritt element, O(log N) AC, WC (kräver balansering av trädet) Hashtabell Valfritt element, O(1) AC Prioritetskö finnminsta, O(1) tagbortminsta, O(log N) insättning är O(1) i genomsnitt, men O(log N) i värsta fall (WC) Standardklasser i Java (Weiss kap. 6) Standardklasser Standardalgoritmer WC = Worst Case (Värsta fallet) AV = Average Case (I genomsnitt) T(N) = tidsåtgång när operationen i fråga appliceras på en struktur av storlek N T(N) är O(f(N)) omm T(N) är uppåt begränsad av f(n) O(1) betyder att operationen tar konstant tid (beror ej av N) 21 22 Objektsamlingar och avbildningstabeller Köer Gräns -snitt (ADT) Implementeringsteknik (datastruktur) Hashtabell Flexibelt fält Balanserat sökträd Set HashSet TreeSet Länkad lista List ArrayList LinkedList Map HashMap TreeMap Gränssnitt Implementeringsteknik Binär hög Länkad lista Queue PriorityQueue LinkedList 23 24
Behållare och asssociativa datastrukturer Ordnade Oordnade HashSet ArrayList TreeSet Behållare LinkedList Vector PriorityQueue Stack Associativa TreeMap HashMap 25 public interface <E> public Iterator<E> iterator() Returns an iterator over a set of elements of type E Ex. public class SomeClass implements <SomeType> { public Iterator<SomeType> iterator(); 26 public interface Iterator<E> boolean hasnext() Returns true if the iteration has more elements. E next() Returns the next element in the iteration. void remove() Removes from the underlying collection the last element returned by the iterator. 27 public interface <E> extends <E> boolean add(e o) Ensures that this collection contains the specified element. boolean addall(<? extends E> c) Adds all of the elements in the specified collection to this collection. void clear() Removes all of the elements from this collection. boolean contains( o) Returns true if this collection contains the specified element. int size() Returns the number of elements in this collection. boolean isempty() Returns true if this collection contains no elements. Iterator<E> iterator() Returns an iterator over the elements in this collection. boolean remove( o) Removes a single instance of the specified element from this collection. [] toarray() Returns an array containing all of the elements in this collection. + others 28 Förenklad iterering f.o.m. Java 5 SomeClass some for ( type variable : some ) { Ex. Förenklad iterering HashSet<Integer> hs = new HashSet<Integer>(); Iterator itr = some.iterator(); while (itr.hasnext()) { type variable = itr.next(); for ( Integer x : hs ) System.out.println(x); 29 30
Abstrakta mallklasser Gränssnitt public Interface Int Implementerar vissa grundmetoder Mallklasser AbstractMap Map Abstrakt mallklass public abstract class AbsCls implements Int List Set Abstract Queue AbstractList AbstractSet AbstractQueue Konkret klass public class Cls1 extends AbsCls Konkret klass public class Cls2 implements Int AbstractSequentialList 31 32 Linjära liststrukturer Direktaccesstrukturer List Abstract Queue List Abstract AbstractList RandomAccess AbstractList AbstractSequentialList ArrayList LinkedList ArrayList Vector 33 34 Stackar och prioritetsköer Mängdstrukturer List RandomAccess Abstract Queue Set Abstract AbstractList AbstractQueue SortedSet AbstractSet Vector Stack PriorityQueue TreeSet HashSet 35 36
Associativa strukturer public interface Map<K,V> SortedMap Map TreeMap AbstractMap HashMap void clear() Removes all mappings from this map (optional operation). boolean containskey( key) Returns true if this map contains a mapping for the specified key. boolean containsvalue( value) Returns true if this map maps one or more keys to the specified value. Set<Map.Entry<K,V>> entryset() Returns a set view of the mappings contained in this map. V get( key) Returns the value to which this map maps the specified key. boolean isempty() Returns true if this map contains no key-value mappings. Set<K> keyset() Returns a set view of the keys contained in this map. V put(k key, V value) Associates the specified value with the specified key in this map. V remove( key) Removes the mapping for this key from this map if it is present. int size() Returns the number of key-value mappings in this map. <V> values() Returns a collection view of the values contained in this map. 37 38 Standardalgoritmer Statiska metoder i class s Används för linjära strukturer, t.ex. ArrayList och LinkedList Ex. LinkedList<Integer> l = new LinkedList<Integer>(); for ( int i = 0; i < 10; i++ ) l.add(i); s.shuffle(l); s.sort(l); System.out.println(s.binarySearch(l,x)); 39 Standardalgoritmer forts. rotate(list list,int distance) Rotates all of the elements in the list by the specified distance replaceall(list list, oldval, newval) Replaces all occurrences of one specified value with another indexofsublist(list source,list target) Returns the index of the first sublist of source that is equal to target lastindexofsublist(list source,list target) Returns the index of the last sublist of source that is equal to target swap(list,int,int) Swaps the elements at the specified positions in the specified list frequency(,) Counts the number of times the object occurs in the collection disjoint(,) Determines whether two collections are disjoint addall(,elements) Adds specified elements to the collection 40 Standardalgoritmer forts. sort(list) Sorts a list using a merge sort algorithm binarysearch(list,) Searches for an element in an ordered list using the binary search algorithm shuffle(list) Randomly permutes the elements in a list fill(list,) Overwrites every element in a list with the specified value copy(list dest,list src) Copies the source list into the destination list min() Returns the minimum element in a collection max() Returns the maximum element in a collection 41 Equals Alla klasser ärver metoden equals från. Den ärvda metoden ger pekarlikhet vilket i allmänhet är alltför diskriminerande. En korrekt överskuggning av equals bör ha följande form public class SomeClass { public boolean equals( obj) { if ( obj == null getclass()!= obj.getclass() ) return false; else { SomeClass tmp = (SomeClass)obj; jämför instansvariablerna i detta objekt med variablerna i obj och returnera resultatet 42
Equals - exempel Equals - exempel public class Geometric { private int x = 0; private int y = 0; public class Circle extends Geometric { private int radius; public Geometric(int x,int y) { this.x = x; this.y = y; public boolean equals( obj) { if ( obj == null getclass()!= obj.getclass() ) return false; else { Geometric tmp = (Geometric)obj; return x == tmp.x && y == tmp.y; public Circle(int x,int y,int radius) { super(x,y); this.radius = radius; public boolean equals( obj) { return super.equals(obj) && radius == ((Circle)obj).radius; 43 44