24
Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og køer Lenkede lister Pekere og objekter Trerepresentasjoner Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Grunnleggende Datastrukturer

Lars Vidar Magnusson

7.2.2014

Kapittel 10

Stakker og køer

Lenkede lister

Pekere og objekter

Trerepresentasjoner

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 2: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Datastrukturer

Vi er i gang med tredje del av kurset hvor vi skal se padatastrukturer.

I denne forelesningen skal vi se pa noen grunnleggende strukturer før vigar videre med mere kompliserte strukturer i de neste forelesningene.

Mange av disse bygger pa prinsippene og algoritmene presentert i dag.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 3: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Dynamiske Sett

Dynamiske sett er en viktig del i utviklingen av effektive algoritmerfordi de tilbyr operasjoner for a ivereta et sett med keys (nøkler)og satelittdata.

Mange algoritmer krever at man kan utføre grunnleggende operasjonersom innsetting, sletting og medlemskaptesting. Slike sett blir ofte refererttil som dictionaries

Andre algoritmer krever mere kompliserte operasjoner som f.eks enminimum-prioritets kø.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 4: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Operasjoner pa Dynamiske Sett

Det er normalt a kunne utføre en rekke operasjoner pa dynamiskesett.

Search(S , k) - en forespørsel som returnerer en peker/referanse tilelementet med nøkkel k i settet S , eller nil hvis elementet ikke finnes.

Insert(S , x) - setter inn et element x i settet S .

Delete(S , x) - sletter elementet x fra settet S .

Minimum(S) - returnerer elementet med minste nøkkel i settet S .

Maximum(S) - returnerer elementet med største nøkkel i settet S .

Successor(S , x) - returnerer det elementet som kommer etter x , sorterti henhold til nøkkelen til x .

Predecessor(S , x) - returnerer det elementet som kommer før x ,sortert i henhold til nøkkelen til x .

Datastrukturene vi skal se pa i denne delen av kurset implementerer typiskt etsubsett av disse operasjonene.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 5: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Stakker

Stakker er dynamiske sett som følger en LIFO policy.

LIFO (Last-In-First-Out) er en policy som navnet tilsier krever at sisteelement som blir satt inn skal først ut.

Minner om en stabbel med tallerkener i.e. man legger til og tartallerkener pa toppen av stabbelen.

En stakk S kan implementeres effektivt med en vanlig array.

En stakk S vil til enhver tid ivareta et attributt S .top som peker pa sisteelement satt inn.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 6: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Stakk Operasjoner

Insetting i stakker kalles typiskt push, og sletting kalles typisktpop.

Push(S , x)

1 S .top = S .top + 12 S [S .top] = x

Pop(S)

1 if Stack-Empty(S)2 error ”underflow”3 else S .top = S .top − 14 return S [S .top + 1]

Stack-Empty(S)

1 if S .top = = 02 return true3 else return false

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 7: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Hvordan Operasjonene Virker

Figuren under viser hvordan en stakk implementert med en arrayfungerer.

(a) viser en stakk etter at noen tilfeldige verdier er satt inn.

(b) viser den samme stakken etter at 17 og 3 har blitt satt inn.

(c) viser stakken etter at det siste elementet har blitt fjernet.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 8: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Køer

Køer er dynamiske sett som følger en FIFO policy.

LIFO (First-In-First-Out) er en policy som navnet tilsier krever at førsteelement som blir satt inn skal først ut.

En kø Q, som med en stakk, kan implementeres effektivt med en vanlig arraymed wrap-around.

En kø Q vil til enhver tid ivereta to attributter Q.head og Q.tail som peker pahenholdvis første elementet og den første ledige plassen etter det sisteelementet satt inn.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 9: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Kø Operasjoner

Insetting i køer kalles typiskt enqueue, og sletting kalles typisktdequeue.

Enqueue(Q, x)

1 Q[Q.tail ] = x2 if Q.tail = = Q. length3 Q.tail = 14 else Q.tail = Q.tail + 1

Dequeue(Q)

1 x = Q[Q.head ]2 if Q.head = = Q. length3 Q.head = 14 else Q.head = Q.head + 15 return x

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 10: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Hvordan Operasjonene Virker

Figuren under viser hvordan en kø implementert med en arrayfungerer.

(a) viser en kø etter at noen tilfeldige verdier er satt inn.

(b) viser den samme køen etter at 17, 3 og 5 har blitt satt inn.

(c) viser køen etter at det første elementet har blitt fjernet.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 11: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Lenkede Lister

Lenkede lister er dynamiske sett som er ordnet i en lineærrekkefølge som arrays.

I motsetning til arrays, hvor rekkefølgen er styrt av indeksen i arrayet, saer rekkefølgen i lenkede lister styrt av en peker/referanse i hvert element.

Enkeltlenkede lister ivaretar et attributt x .next pa hvert element x .

Dobbeltlenkede lister ivaretar to attributter pa hvert element x , x .next ogx .prev .

Lenkede lister kan være bade sorterte og usorterte.

I en sirkulær lenket liste sa peker x .prev til siste elementet og x .next i det sisteelementet peker pa det første.

Et attributt L.head peker til første element i listen L, eller til nil hvis listen ertom.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 12: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Søking i Lenkede Lister

Et søk i en lenket liste er et lineært søk som returnerer førsteforekomst av et element med nøkkel k i listen L.

Algoritmen returnerer nil hvis elementet ikke blir funnet.

List-Search(L, k)

1 x = L.head2 while x 6= nil and x .key 6= k3 x = x .next4 return x

Kjøretiden til List-Search er i verstefall Θ(n) siden den ma ga gjennom helelisten.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 13: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Innsetting og Sletting i en Lenket Liste

Innsetting og sletting kan gjøres i lenkede lister med henholdsvisList-Insert og List-Delete.

List-Insert(L, x)

1 x .next = L.head2 if L.head 6= nil3 L.head .prev = x4 L.head = x5 x .prev = nil

List-Delete(L, x)

1 if x .prev 6= nil2 x .prev .next = x .next3 else L.head = x .next4 if x .next 6= nil5 x .next.prev = x .prev

List-Insert og List-Delete kjører i Θ(1) tid.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 14: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Hvordan En Lenket Liste Virker

Figuren under viser hvordan en dobbeltlenket liste virker.

(a) viser listen etter at noen tilfeldige verdier er satt inn.

(b) viser den samme listen etter at 25 er blitt satt inn.

(c) viser listen etter at det elementet 4 har blitt fjernet.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 15: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Lenkede Lister og Sentinels

Vi kan forenkle koden til List-Delete ved a introduseresentinels.

En sentinel er et dummy elemement som forenkler grensesjekkene.

Vi kan f.eks introdusere et attributt L.nil i listen og bytte ut allereferanser til nil med L.nil . Attributtet L.head ville blitt byttet ut medL.nil .

Pseudekoden for List-Delete ville blitt betraktelig enklere med sentinels.

List-Delete(L, x)

1 x .prev .next = x .next2 x .next.prev = x .prev

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 16: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Hvordan En Lenket Liste med Sentinels Virker

Figuren under viser hvordan en sirkulær dobbeltlenket liste medsentinels virker.

(a) viser en tom liste.

(b) viser listen etter at noen tilfeldige verdier er satt inn.

(c) viser den samme listen etter at 25 er blitt satt inn.

(d) viser listen etter at det elementet 1 har blitt fjernet.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 17: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Pekere og Objekter

Pekere og objekter er nyttige mekanismer, men de eksisterer ikke ialle platformer. Da kan det være nødvendig a implementere de selv.

Det kan ogsa være hjelpsomt a implementere en egen utgave i miljø somstøtter pekere og objekter for a økt kontrol.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 18: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Representasjon med Flere Arrays

Vi kan representere objekter ved a iverate et array for hvertattributt i objektet.

Et eksempel er elementet i lenkede lister. Figuren under viser hvordan trearrays kan brukes til a holde pa x .key , x .next og x .prev .

Denne maten er begrenset ved at alle objekter ma ha sammen antall og typeattributter.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 19: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Representasjon med En Array

Alternativt kan vi representere objektene sekvensielt i et array.

Dette fjerner da begrensingen med et fast antall attributter, men det blirbetraktelig mer komplisert a vedlikeholde.

Figuren under viser hvordan vi kan bruke et enkelt array til a lagre elementen ien lenket liste.

Vi kommer til a se nærmere pa det a representere objekter med flere arrays.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 20: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Allokering og Sletting av Objekter

Vi kan implementer allokering og sletting av objekter i enreprentasjon med flere arrays ved a ivereta en enkeltlenket listeover ledige plasser.

Vi far da et ekstra attributt free som peker til første ledige plass.

Dette passer fint med lenkede lister, siden hvert objekt allerede har en nextpeker, men dette er pa ingen mate et krav.

Allocate-Object()

1 if free = = nil2 error ”out of space”3 else x = free4 free = x .next5 return x

Free-Object(x)

1 x .next = free2 free = x

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 21: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Hvordan Fungerer Allokering og Sletting?

I figuren under kan du se hvordan pekere og objekter, samt ledigeplasser blir iveretatt.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 22: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Representere Trær

Det a representere trær er ikke sa veldig annerledes enn arepresentere lenkede lister. Vi trenger bare flere pekere/referanser.

Vi skal ta en rask titt pa hvordan vi kan representere binære trær og trærmed et vilkarlig antall barn.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 23: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Representere Binære Trær

Vi kan enkelt representere binære trær ved a ivereta tre attributterpa hver node x .

x .p som peker til foreledernoden, eller til nil hvis x er rotnoden.

x . left peker til venstre barn, eller til nil hvis noden er en bladnode.

x . right peker til høyre barn, eller til nil hvis noden er en bladnode.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Page 24: Grunnleggende Datastrukturer - hiof.nolarsvmag/itf20006_14/forelesning09.pdf · 2014. 2. 23. · Grunnleggende Datastrukturer Lars Vidar Magnusson 7.2.2014 Kapittel 10 Stakker og

Representere Trær

Vi kan utvide skjemaet fra forrige slide slik at vi kan ha et vilkarligantall barn mindre enn k pa hver node.

En bedre tilnærming er left-child, right-sibling representasjon.

Her vil hver node bare ha en peker til venstre barn og første nabo tilhøyre.

Lars Vidar Magnusson Algoritmer og Datastrukturer 2014