Föreläsning 3 Datastrukturer (DAT037)

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

Föreläsning Datastrukturer (DAT036)

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning 4 Datastrukturer (DAT037)

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

Föreläsning 9 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 10 Datastrukturer (DAT037)

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning 1 Datastrukturer (DAT037)

Föreläsning 13 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036)

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 4 Innehåll

Föreläsning 14 Innehåll

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

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

Föreläsning Datastrukturer (DAT037)

Länkade strukturer, parametriserade typer och undantag

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

Tentamen Datastrukturer, DAT037 (DAT036)

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

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)

Tentamen, Algoritmer och datastrukturer

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

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

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Trädstrukturer och grafer

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

Tentamen Datastrukturer (DAT036)

Dugga Datastrukturer (DAT036)

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

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

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

Föreläsning 9 Innehåll

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

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

Föreläsning 5 Datastrukturer (DAT037)

Länkade strukturer. (del 2)

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

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

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

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

Föreläsning Datastrukturer (DAT036)

Träd Hierarkiska strukturer

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

Tentamen Datastrukturer, DAT037 (DAT036)

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

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

Lösningar Datastrukturer TDA

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

Föreläsning Datastrukturer (DAT036)

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

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

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Lösningsförslag till exempeltenta 1

Algoritmer och datastrukturer 2012, föreläsning 6

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

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Tentamen i Algoritmer & Datastrukturer i Java

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

Föreläsning 9 Innehåll

Datastrukturer. föreläsning 10. Maps 1

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

Träd, binära träd och sökträd. Koffman & Wolfgang kapitel 6, avsnitt 1 4

Lösningsförslag till tentamen Datastrukturer, DAT037,

BST implementering, huvudstruktur

Seminarium 13 Innehåll

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

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

Tentamen Datastrukturer (DAT037)

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

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

Tentamen Programmering fortsättningskurs DIT950

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Föreläsning Datastrukturer (DAT037)

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Algoritmer och datastrukturer 2012, fo rela sning 8

Tentamen i Algoritmer & Datastrukturer i Java

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

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

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

Stackar, köer, iteratorer och paket

Symboliska konstanter const

Tentamen i Algoritmer & Datastrukturer i Java

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

Datastrukturer. Föreläsning 5. Maps 1

13 Prioritetsköer, heapar

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

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

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

Transkript:

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

Förra gången Amorterad tidskomplexitet Dynamisk array Generics ADT-er/datastrukturer Introduktion till Listor, stackar, köer

Abstrakt datatyp/datastruktur Abstrakt datatyp (matematisk abstraktion): lista Datastrukturer (implementation): Array Enkellänkad lista

Listor, stackar och köer: ADT-er ADT Stack Kö Lista Iterator Operationer (exkl konstruerare) push, pop enqueue, dequeue add(x), add(x, i), remove(x), remove(i), get(i), set(i, x), contains(x), size, iterator hasnext, next, remove (Inte exakta definitioner)

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

ADT-er Kan använda en datastruktur för en viss ADT för att implementera en annan ADT

Collections i Java Java Collections Framework ADT gränssnitt, datastruktur klass

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

Länkade listor

Länkade listor 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?

Dubbellänkad lista med dubbla vaktposter 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 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; }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Listor: tidskomplexitet Några kommentarer: remove, contains: Givet att jämförelser tar konstant tid Indexbaserade operationer för länkade listor: Bättre än Θ(n) om man vet att i pekar nära början (eller i vissa fall slutet) av listan

Testning

Invariant 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 Krav som förväntas vara uppfyllt då metod anropas Exempel: pop kräver att stacken inte är tom

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

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 // 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 // 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); }

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; Link l = first; for (int i = -1; i < size; i++) { assert lnext!= null; assert lnextprev == l; l = lnext; } assert l == last; }

Korrekthet Hur kan man förvissa sig om att man löst en uppgift korrekt? Bevis Kan vara svårt, ta mycket tid Tester Kan gå snabbare

Tester När ni jonglerar pekare (på papper eller i dator): Testa gärna lösningen Några representativa fall: Tom lista Lista med några element

Träd

Träd Ä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 och man implementerar träd från början när man behöver dem

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

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)

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 Filsystem, klassificering med kategorier och underkategorier, representation för matematiska uttryck, programmeringsspråk och naturliga språk Som konkrek implementering för ADTer används det till sorterade samlingar och avbildningar samt prioritetsköer, tex PriorityQueue och TreeMap i java

Fler definitioner 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 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 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 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 D E J O P K C G I H L N

Sorterade och balanserade träd Många typer av träd är sorterade, dvs elementen i noderna uppfyller någon ordning (t ex vid 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) 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

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

public void traverseprint() { printsubtree(root); } private void printsubtree(node n) { if (root == 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 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 ä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

Sammanfattning Länkade listor, pekarjonglering Komplexitet för implementeringar av listor Invarianter, assertions, testning Träd