1 / 22

Datastrukturer och algoritmer

Datastrukturer och algoritmer. Föreläsning 7. Innehåll. Stack, Kö Tillämpningar Konstruktion Att läsa: Kapitel 7-8. 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

clio
Download Presentation

Datastrukturer och algoritmer

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Datastrukturer och algoritmer Föreläsning 7

  2. Innehåll • Stack, Kö • Tillämpningar • Konstruktion • Att läsa: Kapitel 7-8

  3. 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 • Ännu fler begränsningar på operationer än Riktad lista

  4. 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)

  5. 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

  6. 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

  7. 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

  8. 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 • början eller slutet av listan?

  9. Stack • Egen struktur konstruerad mha 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

  10. Stack-interface i Java public interface Stack { public boolean isEmpty(); public Object top(); public void push(Object v); public Object pop(); }

  11. 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]; }

  12. 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]; }

  13. ArrayStack.java public Object pop() { Object elem; if(! isEmpty()) { elem = S[top]; S[top] = null; top = top – 1; } return elem; } }

  14. Stack • Tillämpningar • Avbryter bearbetning som senare kanske återupptas • Återspårning (backtracking) • Till senaste gjorda valet • Hjälpstruktur för att traversera i grafer och träd

  15. • 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

  16. • 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

  17. Kö - konstruktion • Lista • Fronten på kön = början av listan • Listan som Fält • Måste flytta hela listan vid insättning eller borttagning beroende på om köns början är i fältets början eller slut (Komplexitet O(n)) • Riktad lista med 1-celler • Första köelementet länkar till det andra osv • Huvud som pekar ut början och slutet av kön Front Rear

  18. 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

  19. • Tillämpningar • Buffert • Routrar • Skrivarkö • Bredden-först-traversering • Ex. Alla websidor man kan nå med 10 klick från en given sida...

  20. 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

  21. 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ö...

  22. Robusthet och effektivitet • Robusthet • Användaren ska kunna 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

More Related