Grunnleggende Datastrukturer

Like dokumenter
Datastrukturer. Stakker (Stacks) Hva er en datastruktur? Fordeler / Ulemper. Generelt om Datastrukturer. Stakker (Stacks) Elementære Datastrukturer

Lars Vidar Magnusson

Lars Vidar Magnusson Kapittel 13 Rød-Svarte (Red-Black) trær Rotasjoner Insetting Sletting

Lenkelister, iteratorer, indre klasser. Repetisjonskurs våren 2018 kristijb

Løsningsforslag for Obligatorisk Oppgave 3. Algoritmer og Datastrukturer ITF20006

Datastrukturer. Algoritmer og datastrukturer. Øvingsforelesning 2

Enkle datastrukturer. Lars Greger Nordland Hagen. Introduksjon til øvingsopplegget og gjennomgang av python

Heapsort. Lars Vidar Magnusson Kapittel 6 Heaps Heapsort Prioritetskøer

Heap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock

... Når internminnet blir for lite. Dagens plan: Løsning: Utvidbar hashing. hash(x) katalog. O modellen er ikke lenger gyldig ved

Lars Vidar Magnusson

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

Liste som abstrakt konsept/datatype

Heap* En heap er et komplett binært tre: En heap er også et monotont binært tre:

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

Repetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!

Hashtabeller. Lars Vidar Magnusson Kapittel 11 Direkte adressering Hashtabeller Chaining Åpen-adressering

Algoritmer og Datastrukturer

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

INF Algoritmer og datastrukturer

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

Stack. En enkel, lineær datastruktur

INF Algoritmer og datastrukturer

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

INF Algoritmer og datastrukturer

Binær heap. En heap er et komplett binært tre:

EKSAMEN Løsningsforslag. med forbehold om bugs :-)

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

INF Algoritmer og datastrukturer

Dagens tema INF1010 INF1010 INF1010 INF1010

Magnus Moan (Undertegnede) Enkle datastrukturer, trær, traversering og rekursjon

INF Algoritmer og datastrukturer

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

IN Algoritmer og datastrukturer

Inf 1020 Algoritmer og datastrukturer

Grunnleggende Grafalgoritmer

Sist gang (1) IT1101 Informatikk basisfag. Sist gang (2) Oppgave: Lenket liste (fysisk) Hva menes med konseptuelt og fysisk i forb med datastrukturer?

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

Studieaktiviteter i INF1010

Operasjoner på lenkede lister (enkeltlenket) Eksempel på en lenket liste: personliste. INF januar 2010 (uke 3) 2

Dagens forelesning. INF1010 Datastrukturer Lister og køer Pekerkjedelister Øvelser. Innhold i dette lysarksettet

Velkommen til INF1010

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

Lenkelister. Lister og køer.

Søkeproblemet. Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke?

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Prioritetskøer. Prioritetskøer. Binære heaper (vanligst) Prioritetskøer

Minimum Spenntrær - Kruskal & Prim

Dagens tema. INF Algoritmer og datastrukturer. Binærtrær. Generelle trær

EKSAMEN. Emne: Algoritmer og datastrukturer

Definisjon av binært søketre

Programmeringsspråket C Del 3

Datastrukturer for rask søking

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

Programmeringsspråket C Del 3

Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes

Prioritetskøer. Binære heaper Venstrevridde heaper (Leftist) Binomialheaper Fibonacciheaper

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

EKSAMEN. Algoritmer og datastrukturer. Eksamensoppgaven: Oppgavesettet består av 11 sider inklusiv vedlegg og denne forsiden.

Versjon (vil bli endret).

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

INF1020 Algoritmer og datastrukturer. Dagens plan

EKSAMEN med løsningsforslag

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

... Dagens plan. Prioritetskø ADT

INF1010 siste begreper før oblig 2

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

INF1010. Om pensum INF1010 INF1010 INF1010 INF1010. Det vesentlige er å forstå og kunne lage programmer ved hjelp av eksemplene i bøkene.

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

INF2810: Funksjonell Programmering. Muterbare data

Algoritmer og Datastrukturer

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

Algoritmer og Datastrukturer

Grunnleggende Grafalgoritmer III

INF2220: Forelesning 2

UNIVERSITETET I OSLO

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

PQ: HEAP. Heap. Er disse heap er? Hvordan implementere heap:

Definisjon: Et sortert tre

ADTer: Stabel, Kø og 2-sidig Kø. ADT Kø (eng: queue) ... En tabell-basert kø. Abstrakt Data Type Kø

Løsningsforslag EKSAMEN

Et eksempel: Åtterspillet

PG 4200 Algoritmer og datastrukturer Innlevering 2

Øvingsforelesning 4. Martin Aasen

Dagens plan: INF Algoritmer og datastrukturer. Repetisjon: Binære søketrær. Repetisjon: Binære søketrær

INF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet

Grådige algoritmer. Lars Vidar Magnusson Kapittel 16. Aktivitetvelgingsproblemet Huffmankoder

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

INF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

EKSAMEN. Algoritmer og datastrukturer

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

INF Notater. Veronika Heimsbakk 10. juni 2012

Hvorfor sortering og søking? Søking og sortering. Binære søketrær. Ordnet innsetting forbereder for mer effektiv søking og sortering INF1010 INF1010

Transkript:

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

Datastrukturer Vi er i gang med tredje del av kurset hvor vi skal se på datastrukturer. I denne forelesningen skal vi se på noen grunnleggende strukturer før vi går videre med mere kompliserte strukturer i de neste forelesningene. Mange av disse bygger på prinsippene og algoritmene presentert i dag.

Dynamiske Sett Dynamiske sett er en viktig del i utviklingen av effektive algoritmer fordi de tilbyr operasjoner for å ivereta et sett med keys (nøkler) og satelittdata. Mange algoritmer krever at man kan utføre grunnleggende operasjoner som innsetting, sletting og medlemskaptesting. Slike sett blir ofte referert til som dictionaries Andre algoritmer krever mere kompliserte operasjoner som f.eks en minimum-prioritets kø.

Operasjoner på Dynamiske Sett Det er normalt å kunne utføre en rekke operasjoner på dynamiske sett. Search(S, k) - en forespørsel som returnerer en peker/referanse til elementet 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, sortert i 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 på i denne delen av kurset implementerer typiskt et subsett av disse operasjonene.

Stakker Stakker er dynamiske sett som følger en LIFO policy. LIFO (Last-In-First-Out) er en policy som navnet tilsier krever at siste element som blir satt inn skal først ut. Minner om en stabbel med tallerkener i.e. man legger til og tar tallerkener på 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 på siste element satt inn.

Stakk Operasjoner Insetting i stakker kalles typiskt push, og sletting kalles typiskt pop. Push(S, x) 1 S.top = S.top + 1 2 S[S.top] = x Pop(S) 1 if Stack-Empty(S) 2 error underflow 3 else S.top = S.top 1 4 return S[S.top + 1] Stack-Empty(S) 1 if S.top = = 0 2 return true 3 else return false

Hvordan Operasjonene Virker Figuren under viser hvordan en stakk implementert med en array fungerer. (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.

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ørste element som blir satt inn skal først ut. En kø Q, som med en stakk, kan implementeres effektivt med en vanlig array med wrap-around. En kø Q vil til enhver tid ivereta to attributter Q.head og Q.tail som peker på henholdvis første elementet og den første ledige plassen etter det siste elementet satt inn.

Kø Operasjoner Insetting i køer kalles typiskt enqueue, og sletting kalles typiskt dequeue. Enqueue(Q, x) 1 Q[Q.tail] = x 2 if Q.tail = = Q.length 3 Q.tail = 1 4 else Q.tail = Q.tail + 1 Dequeue(Q) 1 x = Q[Q.head] 2 if Q.head = = Q.length 3 Q.head = 1 4 else Q.head = Q.head + 1 5 return x

Hvordan Operasjonene Virker Figuren under viser hvordan en kø implementert med en array fungerer. (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.

Lenkede Lister Lenkede lister er dynamiske sett som er ordnet i en lineær rekkefølge som arrays. I motsetning til arrays, hvor rekkefølgen er styrt av indeksen i arrayet, så er rekkefølgen i lenkede lister styrt av en peker/referanse i hvert element. Enkeltlenkede lister ivaretar et attributt x. next på hvert element x. Dobbeltlenkede lister ivaretar to attributter på hvert element x, x. next og x. prev. Lenkede lister kan være både sorterte og usorterte. I en sirkulær lenket liste så peker x.prev til siste elementet og x.next i det siste elementet peker på det første. Et attributt L.head peker til første element i listen L, eller til nil hvis listen er tom.

Søking i Lenkede Lister Et søk i en lenket liste er et lineært søk som returnerer første forekomst 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.head 2 while x nil and x.key k 3 x = x.next 4 return x Kjøretiden til List-Search er i verstefall Θ(n) siden den må gå gjennom hele listen.

Innsetting og Sletting i en Lenket Liste Innsetting og sletting kan gjøres i lenkede lister med henholdsvis List-Insert og List-Delete. List-Insert(L, x) 1 x.next = L.head 2 if L.head nil 3 L.head.prev = x 4 L.head = x 5 x.prev = nil List-Delete(L, x) 1 if x.prev nil 2 x.prev.next = x.next 3 else L.head = x.next 4 if x.next nil 5 x.next.prev = x.prev List-Insert og List-Delete kjører i Θ(1) tid.

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.

Lenkede Lister og Sentinels Vi kan forenkle koden til List-Delete ved å introdusere sentinels. En sentinel er et dummy elemement som forenkler grensesjekkene. Vi kan f.eks introdusere et attributt L.nil i listen og bytte ut alle referanser til nil med L.nil. Attributtet L.head ville blitt byttet ut med L. nil. Pseudekoden for List-Delete ville blitt betraktelig enklere med sentinels. List-Delete(L, x) 1 x.prev.next = x.next 2 x.next.prev = x.prev

Hvordan En Lenket Liste med Sentinels Virker Figuren under viser hvordan en sirkulær dobbeltlenket liste med sentinels 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.

Pekere og Objekter Pekere og objekter er nyttige mekanismer, men de eksisterer ikke i alle platformer. Da kan det være nødvendig å implementere de selv. Det kan også være hjelpsomt å implementere en egen utgave i miljø som støtter pekere og objekter for å økt kontrol.

Representasjon med Flere Arrays Vi kan representere objekter ved å iverate et array for hvert attributt i objektet. Et eksempel er elementet i lenkede lister. Figuren under viser hvordan tre arrays kan brukes til å holde på x.key, x.next og x.prev. Denne måten er begrenset ved at alle objekter må ha sammen antall og type attributter.

Representasjon med Én Array Alternativt kan vi representere objektene sekvensielt i et array. Dette fjerner da begrensingen med et fast antall attributter, men det blir betraktelig mer komplisert å vedlikeholde. Figuren under viser hvordan vi kan bruke et enkelt array til å lagre elementen i en lenket liste. Vi kommer til å se nærmere på det å representere objekter med flere arrays.

Allokering og Sletting av Objekter Vi kan implementer allokering og sletting av objekter i en reprentasjon med flere arrays ved å ivereta en enkeltlenket liste over ledige plasser. Vi får da et ekstra attributt free som peker til første ledige plass. Dette passer fint med lenkede lister, siden hvert objekt allerede har en next peker, men dette er på ingen måte et krav. Allocate-Object() 1 if free = = nil 2 error out of space 3 else x = free 4 free = x.next 5 return x Free-Object(x) 1 x.next = free 2 free = x

Hvordan Fungerer Allokering og Sletting? I figuren under kan du se hvordan pekere og objekter, samt ledige plasser blir iveretatt.

Representere Trær Det å representere trær er ikke så veldig annerledes enn å representere lenkede lister. Vi trenger bare flere pekere/referanser. Vi skal ta en rask titt på hvordan vi kan representere binære trær og trær med et vilkårlig antall barn.

Representere Binære Trær Vi kan enkelt representere binære trær ved å ivereta tre attributter på 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.

Representere Trær Vi kan utvide skjemaet fra forrige slide slik at vi kan ha et vilkårlig antall barn mindre enn k på 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 til høyre.