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

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

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

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

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

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

Stack. En enkel, lineær datastruktur

Liste som abstrakt konsept/datatype

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

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

INF Algoritmer og datastrukturer

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

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

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

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

Oppgave 1. Sekvenser (20%)

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

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

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

Definisjon av binært søketre

INF1020 Algoritmer og datastrukturer. Dagens plan

Definisjon: Et sortert tre

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

... Dagens plan. Prioritetskø ADT

INF Algoritmer og datastrukturer

Datastrukturer for rask søking

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

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

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

Binære trær: Noen algoritmer og anvendelser

Scheduling og prosesshåndtering

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

PG4200 Algoritmer og datastrukturer Forelesning 7

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

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

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

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

INF Algoritmer og datastrukturer

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

Grunnleggende Datastrukturer

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

Et eksempel: Åtterspillet

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

Inf 1020 Algoritmer og datastrukturer

Et eksempel: Åtterspillet

IN Algoritmer og datastrukturer

Flerveis søketrær og B-trær

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

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

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

Velkommen til INF1010

Lenkelister. Lister og køer.

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

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

Selv-balanserende søketrær

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

NORGES INFORMASJONSTEKNOLOGISKE HØGSKOLE PG4200 Algoritmer og datastrukturer

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.4

København 20 Stockholm

Algoritmer og Datastrukturer

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

Kap 9 Tre Sist oppdatert 15.03

Dagens tema INF1010 INF1010 INF1010 INF1010

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

UNIVERSITETET I OSLO

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

Notater til INF2220 Eksamen

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

UNIVERSITETET I OSLO

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

Vi skal se på grafalgoritmer for:

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

PG4200 Algoritmer og datastrukturer Forelesning 10

Sorteringsproblemet. Gitt en array A med n elementer som kan sammenlignes med hverandre:

Hvor raskt klarer vi å sortere?

Studieaktiviteter i INF1010

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

Pensum: fra boken (H-03)+ forelesninger

INF1010 siste begreper før oblig 2

EKSAMEN med løsningsforslag

Pensum: fra boken (H-03)+ forelesninger

INF Algoritmer og datastrukturer

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Programmeringsspråket C Del 3

Innhold. Innledning 1

INF Algoritmer og datastrukturer

Versjon (vil bli endret).

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

INF Algoritmer og datastrukturer. Hva er INF2220? Algoritmer og datastrukturer

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

Programmeringsspråket C Del 3

Oppgave 1. Stabler og Køer (30%)

UNIVERSITETET I OSLO

INF2220: Time 4 - Heap, Huffmann

Operativsystemer og grensesnitt

Obligatorisk oppgave 1 INF1020 h2005

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

Transkript:

Køer

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først Et nytt element legges alltid til sist i køen Skal vi ta ut et element, tar vi alltid det første Sammenlikning: Kø med kunder som venter på betjening Elementet som har ventet lengst er det som behandles først: FIFO First In, First Out

Innsetting og fjerning av data: enqueue og dequeue

Operasjonene på en kø enqueue: legge til et element bakerst i køen dequeue: ta ut første element i køen first: isempty: sjekk om køen er tom size: se på første element i køen antall elementer som er lagret i køen

Grensesnitt for en kø-adt i Java * public interface Queue<T> { // Legge nytt element bakerst i køen public void enqueue(t element); // Fjerne første element fra køen; public T dequeue(); // Se på første element i køen; public T first(); // Avgjøre om køen er tom public boolean isempty(); // Antall elementer i køen public int size(); } *: Som i læreboka

Anvendelser av kø Kryptering/dekryptering (avsnitt 5.3 i læreboka) Simulering av systemer med en eller flere køer av objekter som må vente på betjening (første obligatoriske oppgave) I operativsystemer, der brukere eller prosesser må vente i kø for å få tilgang til en delt ressurs (RAM, CPU, printer, disk, nettverksport...) Algoritmer som krever at data legges systematisk i kø for å kunne behandles i riktig rekkefølge (f.eks. radixsortering og bredde-først traversering av trær og grafer)

Kø implementert med enkel array Mulig løsning: La fronten av køen alltid ligge på indeks 0 Hold rede på lengden av køen med en indeksvariabel rear Sett inn nye elementer på indeks rear og øk denne med 1 for hver innsetting enqueue blir O(1) Problem: Hver gang vi tar ut et element, må hele resten av køen flyttes et hakk fremover i arrayen Dequeue blir O(n) for en kø med n elementer Ønsker en løsning der både enqueue og dequeue er O(1)

Eksempel: Kø implementert med array Etter enqueue av verdiene A B C D E : rear = A B 0 5 0 C 1 D 2 E 3 5 Etter en dequeue, alle gjenværende verdier må flyttes én indeks mot venstre: rear = B 0 C 1 0 D 2 E 3 5

Kø implementert med sirkulær array Lagrer elementene i køen i en array Holder rede på indeksene til starten (front) og slutten (rear) på køen Lagrer antall elementer i count Innsetting og fjerning blir O(1) fordi: Vi lar køen sirkulere (med wraparound) i arrayen Slipper da å flytte alle elementer et hakk frem eller tilbake ved innsetting/fjerning Gjøres enkelt med modulusaritmetikk 7 0 6 1 2 5 3

Kø og mod-operatoren (%) i Java Operatoren % (mod*) beregner rest ved heltallsdivisjon: 1%5 = 1, 2%5 = 2, 5%5 = 0, 8%5 = 3 Kan brukes til å beregne indeksene front og rear i en kø implementert som sirkulært array Enqueue (rear er første ledige indeks): rear = (rear + 1) % queue.length; Dequeue (front er indeks til start av køen): front = (front + 1) % queue.length; *: Beregning av rest ved heltallsdivisjon kalles modulo operation på engesk:

Eksempel: Kø med sirkulær array count = 1 front = 0 rear = 1 0 //Java Code Queue q = new Queue(); q.enqueue(6); 6 0 1 2 3 5 Setter inn på indeks rear = 0: rear = (rear + 1) % q.length rear = (0 + 1) % 6 = 1

Eksempel: Kø med sirkulær array forts. count = 5 front = 0 rear = 5 3 2 1 6 0 1 7 2 3 3 //Java Code Queue q = new Queue(); q.enqueue(6); q.enqueue(); q.enqueue(7); q.enqueue(3); q.enqueue(8); 8 5

Eksempel: Kø med sirkulær array forts. count = front = 1 2 0 rear = 0 3 5 6 0 1 7 2 3 3 front = (0 + 1) % 6 = 1 front = (1 + 1) % 6 = 2 rear = (5 + 1) % 6 = 0 8 9 5 //Java Code Queue q = new Queue(); q.enqueue(6); q.enqueue(); q.enqueue(7); q.enqueue(3); q.enqueue(8); q.dequeue();//front = 1 q.dequeue();//front = 2 q.enqueue(9);//rear = 0

Eksempel: Kø med sirkulær array forts. count = 5 front = 2 rear = 1 5 0 1 7 2 3 3 8 rear = (0 + 1) % 6 = 1 9 5 //Java Code Queue q = new Queue(); q.enqueue(6); q.enqueue(); q.enqueue(7); q.enqueue(3); q.enqueue(8); q.dequeue();//front = 1 q.dequeue();//front = 2 q.enqueue(9);//rear = 0 q.enqueue(5); Lærebokas implementasjon: CircularArrayQueue.java

Kø implementert som lenket liste Køen har: Referanser til noden først (front) og sist (rear) i køen En teller (count)som inneholder antall elementer i kø Hver node i køen har: Referanse/peker til noden som står på neste plass i køen Referanse/peker til et objekt som inneholder dataene Alle operasjoner på køen blir O(1) Se avsnitt 5.6 i læreboka Lærebokas Java-kode: LinkedQueue.java

Kø implementert som lenket liste

Etter enqueue(e): Etter dequeue():

Simulering Bruker et system til å etterlige oppførselen til et annet system Nyttig hvis det f.eks. er for dyrt, farlig eller tidkrevende å eksperimentere med det virkelige systemet Bruksområder: Design og dimensjonering Predikere fremtidig oppførsel Forklare historiske data og fysiske fenomen Fysiske, matematiske eller datamaskinbaserte simuleringer

Simulering med datamaskiner Programutførelsen etterligner systemets oppførsel Datastrukturer beskriver systemets objekter Handlinger beskrives med operasjoner på dataene Reglene i systemet beskrives med algoritmer Stor fleksibilitet i forhold til fysiske modeller: Lett å endre modell (kode) og omgivelser (input) Raskt å teste et stort antall ganger Lett å legge inn statistisk usikkerhet (tilfeldige tall)

Et eksempel på tidsdrevet køsimulering: Postkontoret * Simulerer aktiviteten på et postkontor i løpet av et bestemt antall tidsenheter (f.eks. minutter) Det er et fast antall betjente kasser/skranker Alle kunder som ankommer stiller seg i én kø Betjening av første kunde i køen starter med en gang en kasse er ledig Vil observere ventetider, kølengde og effektivitet *: Eksemplet har mye til felles med oblig. 1: Flyplassen

Parametre i simuleringsmodellen Antall tidssteg som simuleringen skal gå Antall kasser som er åpne på postkontoret Lengste betjeningstid: Trekker tilfeldige tider mellom 1 og en gitt maks.tid Hvor ofte kundene ankommer: Maksimalt én kundeankomst per tidsenhet (forenkling) Sannsynligheten PK for at en kunde kommer er gitt Trekker tilfeldig i hvert tidssteg om det kommer eller ikke kommer en kunde og stiller seg i kø

Algoritme for postkontoret 1 Sett alle kasser til å være ledige 2 Sett køen av kunder til å være tom 3 For hvert tidssteg: 3.1 Trekk et tilfeldig (uniformt fordelt) tall r mellom 0 og 1 3.2 Hvis r < Pk, sett ny kunde i kø 3.3 For hver kasse som er ledig: 3.3.1 Ta første kunde ut av køen 3.3.2 Beregn og lagre tidspunkt for når kassen vil bli ledig igjen 3. Lagre statusinformasjon for tidssteget Beregn og skriv ut resultater fra simulering

Implementasjon Egen klasse for kunder, som tar vare på ankomsttiden Egen klasse for kassene, som lagrer tidspunktet når kassen blir ledig Bruker metoder fra java.util.random til å trekke tider og kundeankomster Lagrer og skriver ut informasjon om gjennomsnittlige ventetider for kundene og gjennomsnittlig antall kasser som stod tomme Se Javakoden

Prioritetskøer I vanlige FIFO-køer, setter vi inn elementer i den ene enden av køen, og tar ut elementer fra den andre enden. Av og til ønsker vi å prioritere elementene som ligger i køen. Noen må behandles med en gang, mens andre kan vente litt. En sykehuskø der pasientene blir prioritert etter hvor syke de er, er et eksempel på en prioritetskø.

Eksempel: Timesharing En datamaskin har oftest mange aktive programmer/ prosesser som skal kjøres samtidig En tradisjonell CPU utfører bare én operasjon om gangen Får til samtidighet med timesharing: Prosessene står i en kø og venter på eksekvering Første prosess tas ut av køen, kjører en liten stund (en timeslice, typisk 10-100ms), og legges så tilbake i køen igjen Med rask CPU og korte timeslices ser det ut som om alle jobbene kjører samtidig Men: Korte jobber kan ta urimelig lang tid på grunn av mye venting hvis det er mange aktive prosesser

Timesharing med en prioritetskø Operativsystemer inneholder en scheduler som hele tiden velger ut neste prosess som skal få kjøre i CPU Scheduleren bruker ofte en prioritetskø med prosesser: Prosesser med høy prioritet får mest CPU-tid Scheduler kan f.eks. senke prioriteten til jobber som allerede har kjørt lenge, slik at nye og korte jobber velges oftere og dermed utføres raskere

Operasjoner på prioritetskø Vi må (minst) kunne utføre følgende to operasjoner på en prioritetskø: settinn(x, p) Setter inn nytt element x med gitt prioritet p fjernmin() Fjerner elementet med laveste verdi (eller høyeste prioritet) fra prioritetskøen.

Mulige implementasjoner av prioritetskø settinn fjernmin Lenket liste Setter inn først i liste. Må gå gjennom hele listen for å finne min. O(1) O(n) Sortert lenket liste Må sette inn på riktig plass i liste. Tar ut første element. O(n) O(1) Binært søketre Kapittel 11 i læreboka O(log n) O(log n) Binær heap Kapittel 12 i læreboka O(log n) O(log n)