... Dagens plan. Prioritetskø ADT

Like dokumenter
INF1020 Algoritmer og datastrukturer. Dagens plan

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

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:

IN Algoritmer og datastrukturer

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

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. Binære heaper Venstrevridde heaper (Leftist) Binomialheaper Fibonacciheaper

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

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

INF2220: Time 4 - Heap, Huffmann

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

Oppgave 1 LØSNINGSFORSLAG. Eksamen i INF desember Betrakt følgende vektede, urettede graf:

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

UNIVERSITETET I OSLO

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

Dagens plan: INF Algoritmer og datastrukturer. Eksempel. Binære Relasjoner

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

UNIVERSITETET I OSLO

INF Algoritmer og datastrukturer

Uke 5 Disjunkte mengder

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

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

Notater til INF2220 Eksamen

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

Lars Vidar Magnusson

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

INF2220: Time 12 - Sortering

Definisjon av binært søketre

Disjunkte mengder ADT

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

Algoritmer og datastrukturer Løsningsforslag

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

Definisjon: Et sortert tre

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

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

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

EKSAMEN med løsningsforslag

Grunnleggende Datastrukturer

INF2220: Forelesning 2

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

PG4200 Algoritmer og datastrukturer Forelesning 7

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

Eksamen i IN 110, 18. mai 1993 Side 2 Del 1 (15%) Vi skal se på prioritetskøer av heltall, der vi hele tiden er interessert i å få ut den minste verdi

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

Liste som abstrakt konsept/datatype

EKSAMEN. Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

Lars Vidar Magnusson

Kap 9 Tre Sist oppdatert 15.03

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

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

Algoritmer og Datastrukturer IAI 21899

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

Generelle Tips. INF Algoritmer og datastrukturer. Åpen og Lukket Hashing. Hashfunksjoner. Du blir bedømt etter hva du viser at du kan

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

Algoritmer og datastrukturer Løsningsforslag

Løsnings forslag i java In115, Våren 1996

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

Løsnings forslag i java In115, Våren 1999

INF2220: Forelesning 1

INF1010 notat: Binærsøking og quicksort

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

GRAFER. Noen grafdefinisjoner. Korteste vei i en uvektet graf V 2 V 1 V 5 V 3 V 4 V 6

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

Binære trær: Noen algoritmer og anvendelser

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

Hva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema

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

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

Løsnings forslag i java In115, Våren 1998

INF Algoritmer og datastrukturer

EKSAMENSOPPGAVE. INF-1101 Datastrukturer og algoritmer. Adm.bygget, rom K1.04 og B154 Ingen

Inf 1020 Algoritmer og datastrukturer

GRAFER. Korteste vei i en vektet graf uten negative kanter. Korteste vei, en-til-alle, for: Minimale spenntrær

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

INF1020 Algoritmer og datastrukturer GRAFER

INF Algoritmer og datastrukturer

Algoritmer og Datastrukturer

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

Dagens tema INF1010 INF1010 INF1010 INF1010

INF2220: Forelesning 1

Algoritmer og Datastrukturer

Selv-balanserende søketrær

Øvingsforelesning 6. Sorteringsalgoritmer. Kristian Veøy

INF1020 Algoritmer og datastrukturer GRAFER

INF2220: Forelesning 2. Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7)

INF2220: Forelesning 2

Datastrukturer for rask søking

UNIVERSITETET I OSLO

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

Først litt praktisk info. Sorteringsmetoder. Nordisk mesterskap i programmering (NCPC) Agenda

Oppgave 1. Oppgave 2. Høgskolen i Østfold Avdeling for informasjonsteknologi

Transkript:

Dagens plan Prioritetskø ADT Motivasjon Operasjoner Implementasjoner og tidsforbruk Heap-implementasjonen Strukturkravet Heap-ordningskravet Insert DeleteMin Tilleggsoperasjoner Build Heap Anvendelser Finn medianen og sortering Hendelsessimulering (Event simulation) Ark 1 av 2 Prioritetskø ADT Motivasjon I en vanlig kø (kapittel i MAW) setter vi inn elementer i en ende av køen og tar ut elementer i den andre enden (First In First Out FIFO). in back... out front Ofte har vi bruk for å prioritere jobbene som vi legger i køen: Noe må gjøres med en gang, mens andre ting kan vente litt. Forelesning..2007 Forelesning..2007 Ark 2 av 2 Eksempel: Jobbfordeleren (scheduler) i operativsystemer En Unix-server har som oftest mange brukere tilkoblet samtidig, og hver bruker har mange jobber som kjører på en gang (Netscape, Emacs, Java-kompilering, klokke, osv.). På en vanlige datamaskiner har det frem til nylig bare vært en prosessor (CPU), og selv på de mest moderne er det ikke mange, så bare noen få jobber kan fysisk kjøre (utføres) på et gitt tidspunkt. Det er helt uakseptabelt å la hver jobb kjøre ferdig på en prosessor før neste jobb får slippe til. Løsning En mulig løsning er å plassere jobbene i en kø. Når en jobb tas ut av køen, får den lov å kjøre en liten stund (noen millisekunder) før den legges bakerst i køen igjen. På den måten ser det ut som om alle jobbene kjører samtidig. Problemeteratkortejobbertar uforholdsmessig lang tid pga. all ventingen. En god løsning er å senke prioriteten på jobber som allerede har kjørt lenge, slik at nye, korte jobber blir utført raskt. Forelesning..2007 Ark av 2 Forelesning..2007 Ark av 2

Operasjoner En prioritetskø må minst støtte følgende to operasjoner: insert(x,p) som setter element x inn i prioritetskøen med prioritet lik p (lite tall betyr høy prioritet, stort tall betyr liten prioritet). deletemin som tar ut og returnerer det elementet i køen som har høyest prioritet (minst p). Vi skal senere se litt på noen andre operasjoner som en mer avansert prioritetskø kan tenkes å støtte. Implementasjoner Det er flere opplagte måter å implementere en prioritetskø på: Enkel pekerkjede PK A 1 A 2... setter alltid inn bakerst i pekerkjeden, O (1) A n insert(x,p) Prioritetskø deletemin må traversere listen for å finne det minste elementet, O (n) Forelesning..2007 Ark 5 av 2 Forelesning..2007 Ark 6 av 2 Sortert pekerkjede (A 1 < A 2 < < A n ) deletemin tar alltid ut bakerst fra listen, O (1) ved innsetting må vi gå gjennom listen for å finne riktig plass, O (n) Enkel pekerkjede er sannsynligvis bedre enn sortert pekerkjede fordi vi aldri kan ta ut flere elementer enn vi har satt inn. Søketrær I alle søketrær bruker både insert og deletemin isnitto (log n) tid. Balanserte søketrær (f.eks. B-trær) bruker aldri mer enn O (log n) tid, men slike trær er forholdsvis komplekse strukturer. Heap-implementasjonen En heap, også kalt binary heap, er et binært tre med et strukturkrav (hvordan treet ser ut) og et heap-ordningskrav (hvordan nodeverdiene er plassert i forhold til hverandre). Heap-implementasjonen er så populær at mange bruker ordet «heap» som et synonym for «prioritetskø», men vi skal skille mellom dem. Insert tar O (log n) tid i verste tilfelle, men konstant tid i gjennomsnitt. DeleteMin tar O (log n) både i verste tilfelle og i gjennomsnitt. Konstantleddene er små! NB! Datastrukturen heap må ikke forveksles med «heapen» i et run-time system. Forelesning..2007 Ark 7 av 2 Forelesning..2007 Ark av 2

Strukturkravet til en heap Strukturkravet: En heap er et komplett binærtre, dvs. et tre hvor hvert nivå i treet er helt fylt opp med noder, med unntak av det nederste nivået som er fylt opp fra venstre mot høyre. A Innsetting og sletting består i å la en verdi henholdsvis flyte opp og synke ned i treet. Siden høyden er logaritmisk, vil operasjonene ikke bruke mer enn logaritmisk tid, dvs. O (log n). Vi skal tegne heaper som trær, men på grunn av strukturkravet, behøver vi bare et enkelt array for å implementere en heap: B C A D E F G B C H I J D E F G Det er lett å se at alle heaper må ha mellom 2 h og 2 h+1 1 noder, der h er høyden til treet (fordi 1 + 2 + + + 2 h = 2 h+1 1). H I Array H: J Dermed er høyden i treet (uttrykt ved n) lik log n. A B C D E F G H I 0 1 2 5 6 7 J 10 Forelesning..2007 Ark av 2 Forelesning..2007 Ark 10 av 2 Ordningskravet til en heap Heap-ordningskravet: Noden i posisjon H(i) har sitt venstre barn i H(2i), sitt høyre barn i H(2i + 1) og forelderen i H( i/2 ). Den minste verdien i treet er i roten. Dette skal også gjelde for alle subtrær. Dermed blir operasjonene som traverserer treet ekstremt hurtige. Vi må bestemme en maksimal størrelse på heapen på forhånd (evt. allokere mer plass når vi trenger det, men det er kostbart). 1 5 1 60 en heap 1 20 2 5 5 1 0 ikke en heap Forelesning..2007 Ark av 2 Forelesning..2007 Ark av 2

Insert Vi må sikre oss at heap-kravene er oppfylt etter at innsettingen er ferdig. Vi antar for enkelhets skyld at det bare er prioritetsverdiene som skal lagres i heapen. Ordningskravet gjør at tilleggsoperasjonen findmin kan utføres i konstant tid. Hvismanønskeren max-heap, kan man kreve at det største elementet skal være i roten av treet (og alle subtrær). NårviskalsetteinnetelementX, må vi lage en «boble» (tom node) i den neste ledige plassen, ellers vil ikke treet være komplett. 1 5 1 60 Vi sjekker om X kan settes inn der boblen står. Hvis det vil ødelegge heap-ordningskravet, lar vi boblen flyte oppover i treet (percolate up) inntil den kommer til et sted hvor X kan settes inn. Forelesning..2007 Ark 1 av 2 Forelesning..2007 Ark 1 av 2 Eksempel: Sett inn et element med prioritet i heapen på forrige lysark. kan ikke settes inn i den nye boblen fordi forelderen i så fall vil ha større verdi enn barnet (1 > ). Vi lar derfor boblen bytte plass med 1: 5 1 60 1 Elementet kan fortsatt ikke settes inn fordi >, så vi lar boblen flyte oppover enda et nivå: 5 1 60 1 Tidsforbruk: I verste fall må vi flytte boblen O (log n) ganger, men i gjennomsnitt flyter boblen opp bare 1,607 nivåer, dvs. at innsetting tar konstant tid i gjennomsnitt. Hvis elementet vi setter inn er den nye minsteverdien i heapen, vil boblen flyte helt opp til roten. For å slippe å teste på om vi er i roten (= plass nr 1 i arrayen) hver gang vi flytter boblen, kan vi bruke en dørvakt (sentinel) i posisjon 0 i arrayen. Dørvakten må ha en verdi som garantert er mindre enn alle lovlige prioritetsverdier: Array H: - 0 1 2... Nå kan settes inn fordi <. Forelesning..2007 Ark 15 av 2 Forelesning..2007 Ark 16 av 2

DeleteMin Insert kodet i Java uten dørvakt: (side 207 i MAW) public void insert( AnyType x ) { if( currentsize == array.length - 1 ) enlargearray( array.length * 2 + 1 ); } // Percolate up int hole = ++currentsize; for( ; hole > 1 && x.compareto( array[ hole / 2 ] ) < 0; hole /= 2 ) array[ hole ] = array[ hole / 2 ]; array[ hole ] = x; Med dørvakt hadde vi sluppet testen på hole > 1 i for-løkken. Deterlettåfinnedetminste elementet, men når vi har fjernet det, er det en tom boble i roten. Samtidig er vi nødt til å flytte den «siste» noden X i heapen, siden treet skal krympe med et element og fortsatt være komplett. Hvis X kan plasseres i rotboblen uten å bryte ordningskravet, er vi ferdig. I motsatt fall lar vi boblen synke nedover i treet (percolate down) inntil X kan settes inn i boblen. Når boblen skal synke nedover, lar vi den bytte plass med sitt minste barn: => 10 10 10 Riktig!, Galt! Forelesning..2007 Ark av 2 Forelesning..2007 Ark 1 av 2 Eksempel: Utfør deletemin på heapen nedenfor: 5 1 60 1 5 1 60 1 Først fjerner vi fra rotboblen, og samtidig fjerner vi boblen rundt det siste elementet i heapen: Fortsatt kan ikke 1 settes inn (fordi < 1), så vi lar boblen synke videre nedover. 5 1 60 1 5 1 60 1 1 kan ikke settes inn i roten fordi barna har mindre verdier, så vi lar boblen synke nedover ved at den bytter plass med sitt minste barn: Nå kan 1 settes inn. Forelesning..2007 Ark 1 av 2 Forelesning..2007 Ark 20 av 2

DeleteMin kodet i Java 5.0 (side 20 i MAW): Tidsforbruk: Det viser seg at i gjennomsnitt synker boblen nesten helt ned til bladnoden, dvs. at deletemin er O (log n) både i verste tilfelle og i gjennomsnitt. Koding: Vi må passe på det spesialtilfellet at antall elementer i heapen er like, og boblen flyter ned til elementet med bare 1 barn. public AnyType deletemin( ) { if( isempty( ) ) throw new UnderflowException( ); AnyType minitem = findmin( ); array[1] = array[currentsize--]; // Siste element i treet flyttes til den ledige roten // og får så synke ned til rett plass percolatedown(1); return minitem; } private void percolatedown( int hole ) { int child; AnyType tmp = array[hole]; // hole inneholder verdien som skal synke ned (tmp) for( ; hole * 2 <= currentsize; hole = child ) { child = hole * 2; // child er venstre barn av hole if( child!= currentsize && // sjekk at hole har et høyre barn // og velg minste barn å sammenligne med array[child+1].compareto(array[child])<0 ) child++; // flytt evt. opp minste barn og fortsett å synke if( array[child].compareto(tmp) < 0 ) array[hole] = array[child]; else break; } array[ hole ] = tmp; } Forelesning..2007 Ark av 2 Forelesning..2007 Ark 22 av 2 Andre heap-operasjoner Selv om findmin er lett, så er heap-ordningskravet ikke til hjelp hvis vi ønsker å implementere tilleggsfunksjonen findmax. Detenestevivetomdetstørste elementet, er at det befinner seg i en bladnode (hvorfor vet vi det?) Siden cirka halvparten av nodene i et komplett binærtre er bladnoder, er ikke det til noe særlig hjelp. Hvis det er viktig å vite hvor i heapen et gitt element er, må vi bruke en annen datastruktur i tillegg, f.eks. en hash. Hvis vi kjenner heap-posisjonen, i, til et element, kan følgende operasjoner utføres i O (log n) verstetid: DecreaseKey(i, ) IncreaseKey(i, ) Delete(i) DecreaseKey(i, ) DecreaseKey minsker prioriteten til elementet i posisjon i med verdien (H[i] =H[i] i en heltalls-heap). Heap-ordningen kan bli ødelagt, så vi lar elementet flyte oppover i heapen inntil den er kommet til en «lovlig» plass. Eks (OS): En systemadministrator kan øke prioriteten til en viktig jobb. IncreaseKey(i, ) IncreaseKey øker prioriteten til elementet i posisjon i med verdien (H[i] =H[i]+ ). Heap-ordningen kan bli ødelagt, så vi lar elementet synke nedover i heapen inntil det er kommet på riktig plass. Eks (OS): Mange jobbfordelere senker automatisk prioriteten på jobber som har kjørt lenge. Forelesning..2007 Ark 2 av 2 Forelesning..2007 Ark 2 av 2

BuildHeap Anta at du har N elementer som du ønsker å sette inn i en tom heap. Delete Delete fjerner elementet i posisjon i fra heapen. Det kan gjøres ved først åutføredecreasekey(i, ) og deretter DeleteMin. Eks (OS): Nårenbrukerdreperen prosess (kill), må den fjernes fra prioritetskøen. En enkel innsetting tar O (1) tid i gjennomsnitt og O (log n) tid i verste fall. Dermed kan vi bygge heapen i O (n) gjennomsnittlig tid og O (n log n) verstetid ved å utføre Insert N ganger. Er det mulig å klare å få lineær tid også i verste tilfelle? En smart BuildHeap-algoritme: 1. Sett de N elementene inn i et komplett binærtre, men uten å tenke på om heap-ordingskravet er oppfylt. 2. for i= N div 2 downto 1 PercolateDown(i); PercolateDown(i) lar elementet i posisjon i synke ned i treet. Forelesning..2007 Ark 25 av 2 Forelesning..2007 Ark 26 av 2 Eksempel 15 15 1 2 6 5 1 7 10 7 1 1 10 2 6 5 1 1 PercolateDown indeks og 2 ikke heap 1 15 2 6 5 10 10 1 7 2 2 6 5 Etter PercolateDown(7) 1 6 15 PercolateDown 6,5 og 7 5 1 1 1 1 10 15 7 1 PercolateDown(1), nå er treet en heap Vi ønsker å vise at algoritmen har verstetid O (n). Vi observerer at i eksemplet over er arbeidet (antall flyttinger/tester) proporsjonalt med antallet røde kanter. Antall røde kanter kan maksimalt være lik summen av høydene til alle nodene i heapen. 1 Forelesning..2007 Ark 27 av 2 Forelesning..2007 Ark 2 av 2

Hvis vi kan bevise at denne summen alltid er O (n), så er algoritmen også O (n). Teorem 1 I et komplett binætre med høyde h og med 2 h+1 1 noder, er summen av høydene til alle nodene lik 2 h+1 1 (h + 1). Bevis: Altså er summen h S = 2 i (h i) i=0 1 node med høyde h 2 noder med høyde h-1 2 2 noder med høyde h-2 2 noder med høyde h- i 2 noder med høyde h-i Vi bruker et triks: Vi trekker summen fra den dobbelte summen (S = 2S S): 2S = 2h + 2 2 (h 1)+ + 2 h 1 2 + 2 h 1 S = h+2(h 1)+2 2 (h 2)+ + 2 h 1 1 ) 2S S = h + 2 + + + + 2 h 1 + 2 h = h +(1 + 2 + + + 2 h 1 + 2 h ) 1 =(2 h+1 1) (h + 1) som var det vi skulle vise. Dette er en øvre grense. Siden en heap med høyde h har mellom 2 h og 2 h+1 1 noder, så er summen O (n). S = h + 2(h 1)+2 2 (h 2)+ + 2 h 1 1 Forelesning..2007 Ark 2 av 2 Forelesning..2007 Ark 0 av 2 Anvendelser Sortering Anta at vi skal sortere n elementer. Ved først å bruke BuildHeap og deretter deletemin n ganger, har vi en rask O (n + n log n) = O (n log n) sorteringsalgoritme. Å finne medianen Vi kan også finne det k te minste elementet ved å bruke BuildHeap og deretter deletemin k ganger. Vi har dermed en O (n log n)-algoritme for å finne medianen (k = n/2). Hendelsesimulering Ved simulering (f.eks. av kassakøer i et supermarked) deler man tiden inn i diskrete biter kalt ticks. I stedet for for hvert tick å sjekke om det er registrert en hendelse på dette tidspunktet, legger man hendelsene inn i en prioritetskø ordnet etter hendelsestidspunktet. Neste hendelse kan da taes ut fra toppen av heapen. Dette sparer mye prosesseringstid, spesielt ved høy tidsoppløselighet. Forelesning..2007 Ark 1 av 2 Forelesning..2007 Ark 2 av 2