Datastrukturer och algoritmer Föreläsning 4 Test, Stack och Kö 1
Innehåll Test Datatyperna Stack och kö Specifikation och Gränssnitt Konstruktion Tillämpning 2
Testa VIKTIGT! Test går att göra under många olika faser i utvecklingen. Från specifikation av problemet tills dess att den färdiga produkten har installerats och börjat användas hos kund. I denna kurs kommer vi ge en introduktion till testning av mindre mjukvarukomponenter - enhetstestning. 3
Syfte med testning Syftet är att hitta och identifiera fel så att dessa kan identifieras och åtgärdas så tidigt som möjligt i utvecklingsprocessen. Mycket dyrare att åtgärda fel om vi hittar det i ett senare skede. 4
Enhetstestning Målet med enhetstestning är att testa en mjukvarukomponent (klass, funktion eller metod) isolerat från resten av programmet Man kan på så vis övertyga sig om att komponenten fungerar korrekt innan man använder sig av den i ett större program. Enhetstestet funkar också som ett kontrakt som koden måste följa. Tex om man ändrar något i implementationen. Görs ofta av programmeraren som skriver/ska skriva koden 5
Testa en datatyp Vad testa? - Börja med de enklaste testerna. - Testa gränsfall - Fundera över vad som kan ställa till problem. - Viktigt att täcka in alla operationer... -... och att täcka in de olika fall som finns i operationerna. Genom att vi noga tänker efter vilka tester vi gör så kan vi minska antalet tester. Försök testa så lite som möjligt i varje test - hjälper till att identifiera vad som går fel. Skriv varje test i en egen funktion. 6
Stack Modell Papperstrave Specialisering av datatypen Lista Begränsningar på operationer Linjärt ordnad struktur Före / efter relation 7
Stack LIFO Last In First Out Insättning, borttagning, avläsning i toppen av stacken 8
Informell specifikation till Stack Empty konstruerar tom stack Push(v,s) lägger (ett element med värdet) v överst på stacken Top(s) är värdet av det översta elementet på stacken (förutsatt att stacken inte är tom) Pop(s) avlägsnar det översta elementet från stacken (förutsatt att stacken inte är tom) Isempty(s) testar om stacken är tom 9
Formell definition Uppsättning axiom Beskriver relationer mellan typens olika operationer Axiom kan användas för att göra formella härledningar i datatypen 10
Formell specifikation till Stack Ax 1: Isempty(Empty) Ax 2: Isempty(Push(v,s)) Ax 3: Pop(Push(v,s)) = s Ax 4: Top(Push(v,s)) = v Ax 5: Isempty(s) => Push(Top(s), Pop(s)) = s 11
Gränsyta till Stack abstract datatype Stack(val) Empty() -> Stack(val) Push(v:val,s:Stack(val)) -> Stack(val) Top(s:Stack(val)) -> val Pop(s:Stack(val)) -> Stack(val) Isempty(s:Stack(val)) -> Bool 12
Stack Konstruktion Lista Toppen av stacken = början av listan 13
Komplexitet Relativ komplexitet: Tittar bara på ytan hur många list-operationer som behövs per stack-operation Antalet listoperationer är inte beroende av antalet element i stacken Absolut komplexitet: Multiplicerar alla relativa komplexiteter ned till fysiska datatyper. Dvs tittar även på hur listan är konstruerad. 14
Stack konstruerad som Lista Lista som fält Tidskomplexiteten Push och Pop förväntas vara oberoende av stackens storlek Toppen av stacken början eller slutet av listan? Lista som Riktad lista med 1-celler Uteslutningar och specialiseringar av operationer O(1) tidskomplexitet 15
Stack Konstruerad som fält - Botten i slutet - Stacken läggs i slutet av fältet Push och Pop Ο(1) Inga stora dataomflyttningar - Botten i början - Två stackar i samma fält 16
Stack Tillämpningar Avbryter bearbetning som senare kanske återupptas Återspårning (backtracking) Till senaste gjorda valet Traversera i andra datatyper (grafer och träd) 17
Stack Tillämpningar Rekursion Fakultet n! factorial(n) if (n<=1) then return 1; else return n*factorial(n-1); Evaluering av uttryck 18
Kö Modell Kö Specialisering av Lista Begränsningar på operationer Linjärt ordnad struktur 19
Kö FIFO First In First Out Insättning i slutet av kön Borttagning i början av kön 20
Gränsyta för kö abstract datatype Queue(val) Empty () Queue(val) Enqueue (v:val,q:queue(val)) Queue(val) Front (q:queue(val)) val Dequeue (q:queue(val)) Queue(val) Isempty (q:queue(val)) Bool 21
Kö - konstruktion Lista Fronten på kön = början av listan Listan som Fält Komplexiteten Riktad lista med 1-celler Första köelementet länkar till det andra osv 22
Kö Konstruktion Cirkulär struktur med 1-celler Länken i slutet av kön pekar på fronten Cirkulär vektor Fördelar Inga omflyttningar Nackdelar Maximal storlek Outnyttjat utrymme Problem skilja en tom kö från en full 23
Kö Tillämpningar Buffert Routrar Skrivarkö Bredden-först-traversering 24