© Anders Broberg, Lena Kallin Westin, 2007 Datastrukturer och algoritmer Föreläsning 4
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Innehåll Stack, Kö Tillämpningar Konstruktion Dubbeländad kö Genomgång av Routeruppgiften Att läsa: Kapitel 7-8
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Stack Modell Papperstrave Kommer bara åt det översta arket Kan bara lägga till nytt överst Linjärt ordnad struktur Före /efter relation Specialisering av Lista oÄnnu fler begränsningar på operationer än Riktad lista
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Stack Andra namn på Stack är ”Pushdown list” och ”LIFO list” LIFO – Last In First Out Insättning, borttagning, avläsning i toppen av stacken I listan behövdes en position, detta behövs inte här (eftersom vi bara håller oss till toppen)
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 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 Empty och Push är konstruktorer Alla objekt kan byggas med först Empty och sedan en sekvens av Push
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 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 inte stacken är tom) Pop(s) – avlägsnar det översta elementet från stacken (förutsatt att inte stacken är tom) Isempty(s) – testar om stacken är tom
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 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
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Stack konstruerad som Lista Uteslutningar och specialiseringar av operationer Empty konstrueras som List-Empty IsEmpty(s) konstrueras som List-IsEmpty(s) Top(s) konstrueras som List-Inspect(s, List-First(s)) Pop(s) konstrueras som List-Remove(s, List-First(s)) Push(v, s) konstrueras som List-Insert(s, v, List-First(s)) 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
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Stack konstruerad som Lista Absolut komplexitet: Multiplicerar alla relativa komplexiteter ned till fysiska datatyper. Dvs tittar även på hur listan är konstruerad. Lista som fält Tidskomplexiteten ökar (måste flytta stacken fram och tillbaka) Push och Pop förväntas vara oberoende av stackens storlek Toppen av stacken obörjan eller slutet av listan?
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Stack Egen struktur konstruerad mha fält Botten i slutet oStacken läggs i slutet av fältet –Push och Pop (1) –Inga stora dataomflyttningar Botten i början Två stackar i samma fält
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Stack-interface i Java public interface Stack { public boolean isEmpty(); public Object top(); public void push(Object v); public Object pop(); }
DoA VT -07 © Anders Broberg, Lena Kallin Westin, ArrayStack.java public class ArrayStack implements Stack { public static final int CAPACITY = 1000; private int capacity; private Object S[]; private int top = -1; public ArrayStack() { this(CAPACITY); } public ArrayStack(int cap) { capacity = cap; S = new Object[capacity]; }
DoA VT -07 © Anders Broberg, Lena Kallin Westin, ArrayStack.java public boolean isEmpty() { return (top < 0); } public void push(Object obj) { if ((top+1) < capacity) { top = top + 1; S[top] = obj; } public Object top() { return S[top]; }
DoA VT -07 © Anders Broberg, Lena Kallin Westin, ArrayStack.java public Object pop() { Object elem; elem = S[top]; S[top] = null; top = top – 1; return elem; }
DoA VT -07 © Anders Broberg, Lena Kallin Westin, ArrayStack i C Kod från Weiss bok finns på sidan Där finns en ArrayStack som är väldigt lik vår java-implementation.
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Stack Egen struktur konstruerad mha fält Botten i början Botten i slutet oStacken läggs i slutet av fältet –Push och Pop (1) –Inga stora dataomflyttningar Två stackar i samma fält Egen struktur mha av länkade celler oHärma riktad lista mha 1-celler oO(1) för push och pop
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Stack Tillämpningar Avbryter bearbetning som senare kanske återupptas Återspårning (backtracking) oTill senaste gjorda valet Hjälpstruktur för att traversera i grafer och träd
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Stack Tillämpningar Rekursion Fakultet n! ofactorial(n) –if (n<=1) then return 1; –else return n*factorial(n-1); Evaluering av uttryck
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Kö Modell Kö Specialisering av Lista Begränsningar på operationer Insättning görs bara i en ände (slutet, rear), Borttagning görs i andra änden (början, front), Avläsning: oftast bara intresserad av läsa av det första elementet i kön Pos behövs inte eftersom man bara är intresserad av vad som händer i början och slutet av kön Linjärt ordnad struktur
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Kö FIFO – First In First Out 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
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Kö - konstruktion Lista Fronten på kön = början av listan Listan som Fält oMåste flytta hela listan vid insättning eller borttagning beroende på om köns början är i fältets början eller slut Riktad lista med 1-celler o Första köelementet länkar till det andra osv oHuvud som pekar ut början och slutet av kön FrontRear
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Kö – Konstruktion Cirkulär struktur med 1-celler Länken i slutet av kön pekar på fronten FrontRear
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Kö – Konstruktion Cirkulär vektor (”ringbuffert”) Indexen cirkulärt ordnade. I en vektor med n element är indexmängden {0,1,..., n-1} Next(x) = (x+1) mod n Prev(x) = (x-1) mod n + Inga omflyttningar - Maximal storlek - Outnyttjat utrymme - Problem skilja tom kö ifrån en full Bild från sidan 165 i Janlert L-E., Wiberg T., Datatyper och algoritmer, Studentlitteratur, 2000
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Kö Tillämpningar Buffert o Routrar oSkrivarkö Bredden-först-traversering oEx. Alla websidor man kan nå med 10 klick från en given sida...
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Modell för datatypens byggande Specifikatören – utformar specifikationen Vet inget om implementatören och dennes resurser. Har fått reda på vad användaren tror sig behöva. Vill ge en spec som ”håller” i evighet => kanske inte överensstämmer med det användaren vill ha Implementatören – implementerar specen Går enbart efter specifikationen Användaren – använder implementationen Vet inget om implementationen, känner endast till specifikationen, får hålla till godo med det som erbjuds
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Felhantering Specifikationen bestämmer implementationens spelrum Ska styra så lite som möjligt Ex. Ej specat vad som händer om man gör Front eller Dequeue på en tom kö. Implementatören ska uppfylla specifikationen... och inte mer! Användaren bör inte konstruera algoritmer som beror på ospecifierade förhållanden dvs ska aldrig göra Front på en tom kö...
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Robusthet och effektivitet Robusthet Användaren kan begå misstag utan att det leder till katastrof Effektivitet specifierar felhantering => robust lösning men mindre effektiv Tex att alltid kolla indexgränser i en array... En del felhantering blir implementationsberoende Det kan man inte ha med i en specifikation som ska vara oberoende. Tex i Lista/Stack/Kö som Fält finns risk för overflow Om inte felhantering är specificerad får användaren göra avvägningarna mellan robusthet och effektivitet