Föreläsning 3 Datastrukturer (DAT037)

Relevanta dokument
Föreläsning 3 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036)

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 2 Datastrukturer (DAT037)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning Datastrukturer (DAT036)

Föreläsning 4 Innehåll

Föreläsning 4 Datastrukturer (DAT037)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen Datastrukturer (DAT036)

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Tentamen Datastrukturer (DAT036)

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 10 Datastrukturer (DAT037)

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Föreläsning 9 Datastrukturer (DAT037)

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning 14 Innehåll

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 1 Datastrukturer (DAT037)

Länkade strukturer, parametriserade typer och undantag

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

Upplägg. Binära träd. Träd. Binära träd. Binära träd. Antal löv på ett träd. Binära träd (9) Binära sökträd (10.1)

Föreläsning Datastrukturer (DAT037)

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 2. Länkad lista och iterator

Trädstrukturer och grafer

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 7. Träd och binära sökträd

Föreläsning 9 Innehåll

Föreläsning 11. ADT:er och datastrukturer

Tentamen i Algoritmer & Datastrukturer i Java

Tentamen, Algoritmer och datastrukturer

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Tentamen Datastrukturer (DAT036)

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Dugga Datastrukturer (DAT036)

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Föreläsning 5 Datastrukturer (DAT037)

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Tentamen i Algoritmer & Datastrukturer i Java

13 Prioritetsköer, heapar

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Föreläsning Datastrukturer (DAT036)

Föreläsning 2. Länkad lista och iterator

BST implementering, huvudstruktur

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

Länkade strukturer. (del 2)

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 3. Stack

Lösningsförslag till exempeltenta 1

Tentamen i Algoritmer & Datastrukturer i Java

Algoritmer och datastrukturer 2012, föreläsning 6

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs

Föreläsning 7. Träd och binära sökträd

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

Lösningar Datastrukturer TDA

Föreläsning 8: Exempel och problemlösning

Lösningsförslag till tentamen Datastrukturer, DAT037,

Den som bara har en hammare tror att alla problem är spikar

Föreläsning 7 Datastrukturer (DAT037)

Föreläsning 3. Stack

Tentamen Datastrukturer (DAT037)

Föreläsning 9 Innehåll

Programmering för språkteknologer II, HT2014. Rum

Föreläsning Datastrukturer (DAT037)

Datastrukturer. föreläsning 10. Maps 1

Seminarium 13 Innehåll

Föreläsning 2. Stackar, köer och listor TDDC91,TDDE22,725G97: DALG. Innehåll. 1 ADT stack. 1.1 Tillämpningar

Föreläsning Datastrukturer (DAT036)

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Träd Hierarkiska strukturer

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Föreläsning 8 Datastrukturer (DAT037)

Tentamen Programmering fortsättningskurs DIT950

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Datastrukturer. Föreläsning 5. Maps 1

ADT Prioritetskö. Föreläsning 12 Innehåll. Prioritetskö. Interface för Prioritetskö. Prioritetsköer och heapar

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Transkript:

Föreläsning 3 Datastrukturer (DAT037) Fredrik Lindblad 1 6 november 2017 1 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt Se http://wwwcsechalmersse/edu/year/2015/course/dat037 1

Innehåll 2 Listor, Stackar, Köer Länkade listor Jämförelse av listimplementationer Cirkulära arrayer Invarianter, assertions, testning Träd

Listor, stackar och köer: ADT-er 3 ADT Lista Stack Kö Deque Operationer add(x), add(x, i), remove(i), get(i), set(i, x) push(x), pop() enqueue(x), dequeue() addfirst(x), removefirst(), addlast(x), removelast() (Endast de centrala operationerna)

Listor, stackar och köer: datastrukturer 4 ADT Implementationer Lista dynamisk array, enkellänkad lista, dubbellänkad lista Stack lista Kö, Deque länkad lista, cirkulär array

Stackar och köer: tillämpningar 5 Stackar Implementera rekursion Evaluera postfix-uttryck Köer Skrivarköer Bredden först-sökning (grafalgoritm)

6 Länkade listor

Länkade listor 7 Många varianter: Objekt med pekare till första noden, kanske storlek Pekare till sista noden? Enkellänkad, dubbellänkad? Vaktposter (sentinels)? Först/sist/både och?

Länkade listor 7 Många varianter: Objekt med pekare till första noden, kanske storlek Pekare till sista noden? Enkellänkad, dubbellänkad? Vaktposter (sentinels)? Först/sist/både och? Vi tar dubbellänkad lista med dubbla vaktposter som exempel Det gäller att vara noggrann när man utför den sk pekarjongleringen

Dubbellänkad lista med dubbla vaktposter 8 public class DoublyLinkedList<A> { private class ListNode { A contents; ListNode next; // null omm sista vakten ListNode prev; // null omm första vakten } }

Dubbellänkad lista med dubbla vaktposter 9 public class DoublyLinkedList<A> { private ListNode first, last; private int size; // Ej null } // Konstruerar tom lista public DoublyLinkedList() { first = new ListNode(); last = new ListNode(); firstnext = last; lastprev = first; size = 0; }

10 Implementera metoden add som lägger till ett element i slutet av listan void add(a x) { }

void add(a x) { ListNode l = new ListNode(); lcontents = x; lnext = last; lprev = lastprev; lastprevnext = l; lastprev = l; size++; } 11

Listor: tidskomplexitet add(x) add(x, i) remove(x) remove(i) get(i) set(i, x) contains(x) size iterator hasnext/next remove Dynamisk array Dubbellänkad lista 12

Listor: tidskomplexitet Dynamisk array add(x) O(1) am O(1) add(x, i) remove(x) remove(i) get(i) set(i, x) contains(x) size iterator hasnext/next remove Dubbellänkad lista 12

Listor: tidskomplexitet Dynamisk array add(x) O(1) am O(1) add(x, i) O(n) O(n) remove(x) remove(i) get(i) set(i, x) contains(x) size iterator hasnext/next remove Dubbellänkad lista 12

Listor: tidskomplexitet Dynamisk array add(x) O(1) am O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) get(i) set(i, x) contains(x) size iterator hasnext/next remove Dubbellänkad lista 12

Listor: tidskomplexitet Dynamisk array add(x) O(1) am O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) O(n) O(n) get(i) set(i, x) contains(x) size iterator hasnext/next remove Dubbellänkad lista 12

Listor: tidskomplexitet Dynamisk array add(x) O(1) am O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) O(n) O(n) get(i) O(1) O(n) set(i, x) contains(x) size iterator hasnext/next remove Dubbellänkad lista 12

Listor: tidskomplexitet Dynamisk array add(x) O(1) am O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) O(n) O(n) get(i) O(1) O(n) set(i, x) O(1) O(n) contains(x) size iterator hasnext/next remove Dubbellänkad lista 12

Listor: tidskomplexitet Dynamisk array add(x) O(1) am O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) O(n) O(n) get(i) O(1) O(n) set(i, x) O(1) O(n) contains(x) O(n) O(n) size iterator hasnext/next remove Dubbellänkad lista 12

Listor: tidskomplexitet Dynamisk array add(x) O(1) am O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) O(n) O(n) get(i) O(1) O(n) set(i, x) O(1) O(n) contains(x) O(n) O(n) size O(1) O(1) iterator hasnext/next remove Dubbellänkad lista 12

Listor: tidskomplexitet Dynamisk array add(x) O(1) am O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) O(n) O(n) get(i) O(1) O(n) set(i, x) O(1) O(n) contains(x) O(n) O(n) size O(1) O(1) iterator O(1) O(1) hasnext/next remove Dubbellänkad lista 12

Listor: tidskomplexitet Dynamisk array add(x) O(1) am O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) O(n) O(n) get(i) O(1) O(n) set(i, x) O(1) O(n) contains(x) O(n) O(n) size O(1) O(1) iterator O(1) O(1) hasnext/next O(1) O(1) remove Dubbellänkad lista 12

Listor: tidskomplexitet Dynamisk array add(x) O(1) am O(1) add(x, i) O(n) O(n) remove(x) O(n) O(n) remove(i) O(n) O(n) get(i) O(1) O(n) set(i, x) O(1) O(n) contains(x) O(n) O(n) size O(1) O(1) iterator O(1) O(1) hasnext/next O(1) O(1) remove O(n) O(1) Dubbellänkad lista 12

13 Cirkulära arrayer

Cirkulära arrayer 14 Alternativ till länkade listor för implementering av köer

Cirkulära arrayer 14 Alternativ till länkade listor för implementering av köer Utgår från en dynamisk array Två indexpekare; en för början av kön och en för slutet Behöver hålla reda på om kön är tom eller full när båda pekar på samma element När man kopierar till ett större array får man ta hänsyn till vilka element som används i den gamla

Cirkulära arrayer 15 public static class CircularArrayQueue<A> { private A[] queue; private int size; private int front; // nästa element private int rear; // nästa lediga public CircularArrayQueue(int capacity) { if (capacity <= 0) { throw new IllegalArgumentException( "non-positive capacity"); } queue = (A[]) new Object[capacity]; size = front = rear = 0; }

Cirkulära arrayer 16 public void enqueue(a a) { if (size == queuelength) { doublecapacity(); } } size++; queue[rear] = a; rear = (rear + 1) % queuelength;

Cirkulära arrayer 17 public A dequeue() { if (size == 0) { throw new NoSuchElementException( "queue empty"); } size--; A a = queue[front]; queue[front] = null; // undvik minnesläckor front = (front + 1) % queuelength; } return a;

Cirkulära arrayer 18 private void doublecapacity() { A[] newqueue = (A[]) new Object[2 * queuelength]; } } for (int i = 0, j = front; i < size; i++, j = (j + 1) % queuelength) { newqueue[i] = queue[j]; } queue = newqueue; front = 0; rear = size;

Testning 19

Invariant 20 Egenskap som alltid gäller för programmets tillstånd Exempel: 1 first!= null 2 lastnext = null 3 nnextprev = n (om n ej är vaktpost) 4 firstnext size+1 = last Invarianter bryts ibland temporärt när objekt uppdateras

Precondition 21 Krav som förväntas vara uppfyllt då metod anropas Exempel: pop kräver att stacken inte är tom

Postcondition 22 Egenskap som är uppfylld efter anrop, givet preconditions och invarianter Exempel: Efter push är stacken inte tom

23 Assertion Man kan testa vissa egenskaper med assertions Kan vara smidigt för att hitta/undvika fel i labbar Failjava public class Fail { public static void main (String[] args) { assert argslength == 2; } } $ javac Failjava $ java Fail $ java -ea Fail ett två $ java -ea Fail Exception in thread "main" javalangassertionerror at Failmain(Failjava:3)

Assertion 24 // Skapar ny /intern/ listnod // Precondition: prev!= null && next!= null ListNode(A contents, ListNode prev, ListNode next) { assert prev!= null && next!= null; thiscontents = contents; thisprev = prev; thisnext = next; } Nu leder new ListNode(x,firstprev,firstnext) till ett AssertionError (med -ea), inte ett kryptiskt fel senare

Assertion 25 // Lägger till x efter n // Precondition: n!= null && n!= last void addafter(listnode n, A x) { assert n!= null && n!= last; } ListNode next = nnext; nnext = new ListNode(x, n, next); nextprev = nnext; size++; void addfirst(a x) { addafter(first, x); }

26 Exempel på metod som kontrollerar invarianter hos en instans av den dubbellänkade listan vi tittade på tidigare private void checkinvariants() { assert first!= null && last!= null; assert firstprev == null; assert lastnext == null; assert size >= 0; ListNode l = first; for (int i = -1; i < size; i++) { assert lnext!= null; assert lnextprev == l; l = lnext; } assert l == last; }

Korrekthet 27 Hur kan man förvissa sig om att man löst en uppgift korrekt? Bevis Svårt, ta mycket tid Tester Enklare och snabbare, men ger ingen garanti för korrekt Snarare ett sätt att upptäcka fel

Träd 28

Träd 29 Är ytterligare ett exempel på en ADT Är dock inte så tydligt vilken standarduppsättningen av metoder skulle vara Därför är träd är inte en ADT (ett interface) i java collection framework Olika former av träd förekommer däremot som representation i implementeringar för andra ADTer

Abstrakt beskrivning A C H L N M G I R F B E K J Q P O D 30

Termer Träd(trees) består av noder, som har 0 eller flera underordnade noder/delträd Noderna är förbundna med bågar(edges) Noden som är underordnad en annan kallas barn(child), den överordnade noden för förälder(parent) En indirekt överordnad nod kallas förfader(ancestor) och indirekt underordnad för avkomling(descendant) Noder som har samma förälder kallas syskon(siblings) I varje träd finns en nod som är rot Den har ingen förälder Alla andra noder i ett träd har en förälder Noder som inte har några barn kallas löv(leaves) 31

32 Trädstrukturer brukar ritas upp-och-ner jämför med riktiga träd, dvs med roten högst upp En mängd av träd kallas skog(forest) I ett ordnat träd har syskonen en inbördes ordning Motsatsen är oordnat träd Jmf lista gentemot mängd

Användningsområden 33 Filsystem, klassificering med kategorier och underkategorier, representation för matematiska uttryck, programmeringsspråk och naturliga språk

Användningsområden 33 Filsystem, klassificering med kategorier och underkategorier, representation för matematiska uttryck, programmeringsspråk och naturliga språk Som representation för ADTer används det till sorterade samlingar och avbildningar samt prioritetsköer, tex PriorityQueue och TreeMap i java

Fler definitioner 34 Längden(length) av en väg(path) mellan två noder = antal passerade bågar Djupet(depth) av en nod är längden till roten Höjden(height) av en nod är längsta vägen ner till ett löv Höjden av ett träd = rotens höjd Storleken(size) av ett träd är antalet noder

Implementering 35 Pekare motsvarar länkade listor för listor Detta funkar för alla typer av träd Array effektivt för vissa typer av träd, tex binära heapar som vi kommer titta på nästa gång

Representation med pekare 36 En lokal klass för noder I huvudklassen en pekare till rotnoden I nodklassen en pekare till varje barn Ibland pekare till föräldern Om obegränsat antal barn lista (ordnad), mängd (oordnad), eller i varje nod en pekare till vänstra barnet och syskonet till höger

Binära träd 37 Binära träd är en vanlig typ av träd Varje nod har max två barn och man skiljer på en nod med bara ett delträd till vänster och samma nod med samma delträd till höger A B C D E G H J K I L O P N

Sorterade och balanserade träd 38 Många typer av träd är sorterade, dvs elementen i noderna uppfyller någon ordning (t ex enligt en Comparator), och balanserade, dvs uppfyller vissa krav på hur höjden av delträd förhåller sig till varandra Vi kommer se ett exempel på detta nästa gång och fler när vi behandlar sökträd om ett par veckor

Trädgenomlöpning (Tree traversal) 39 Besöker alla noder i ett träd Pre-order först noden själv, sedan vänster delträd och sist höger delträd In-order vänster, noden, höger Post-order vänster, höger, noden Bredden först Först roten, sedan nodenerna på nästa nivå, etc

40 Antag binärt träd med följande representation class Tree<E> { private class Node { E data; Node left = null, right = null; } Node root = null; public void traverseprint() { } } Skriv en metod som genomlöper alla noder pre/in/post-order och skriver ut datan

41 public void traverseprint() { printsubtree(root); } private void printsubtree(node n) { if (n == null) return; Systemoutprintln(ndatatoString()); printsubtree(nleftchild); printsubtree(nrightchild); } Ovan ger pre-order traversal In-order och post-order fås genom att sätta raden som skriver ut mellan resp efter de rekursiva anropen

Rekursion 42 Rekursiv metod anropar sig själv Rekursiva metoder som anropar sig själv en gång går utan större problem att skriva ut som icke-rekursiv med slinga Men kan vara naturligare med rekursion Vid flera rekursiva anrop, tex vid trädtraversering, är det ofta krångligt att implementera på annat sätt Tänk på att det måste finnas ett slutvillkor så anropen inte sker i oändlighet