INF1020 Algoritmer og datastrukturer. Dagens plan

Like dokumenter
... Dagens plan. Prioritetskø ADT

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

IN Algoritmer og datastrukturer

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:

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

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

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

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

Prioritetskøer. Prioritetskøer. Binære heaper (vanligst) Prioritetskø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

UNIVERSITETET I OSLO

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

INF Algoritmer og datastrukturer

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

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

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

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

Notater til INF2220 Eksamen

Uke 5 Disjunkte mengder

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

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

Disjunkte mengder ADT

Definisjon av binært søketre

INF2220: Time 12 - Sortering

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

Lars Vidar Magnusson

INF2220: Forelesning 2

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

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

PG4200 Algoritmer og datastrukturer Forelesning 7

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

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

EKSAMEN med løsningsforslag

Liste som abstrakt konsept/datatype

INF2220: Forelesning 1

INF Algoritmer og datastrukturer

Grunnleggende Datastrukturer

EKSAMEN. Algoritmer og datastrukturer

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

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

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

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

Kap 9 Tre Sist oppdatert 15.03

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

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

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

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

INF1010 notat: Binærsøking og quicksort

Algoritmer og Datastrukturer IAI 21899

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

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

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

Algoritmer og datastrukturer Løsningsforslag

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

Lars Vidar Magnusson

Inf 1020 Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Dagens plan: INF Algoritmer og datastrukturer. Repetisjon: Binære søketrær. Repetisjon: Binære søketræ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

INF2220: Forelesning 1

INF Algoritmer og datastrukturer

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

Binære trær: Noen algoritmer og anvendelser

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

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

INF2220: Forelesning 2

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

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

Dagens tema INF1010 INF1010 INF1010 INF1010

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

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

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

INF Algoritmer og datastrukturer

Algoritmer og Datastrukturer

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

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

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

Datastrukturer for rask søking

INF1010 Binære søketrær ++

INF1020 Algoritmer og datastrukturer GRAFER

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

Algoritmer og Datastrukturer

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

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

alternativer til sortering og søking binære trær søketrær Ikke-rekursiv algoritme som løser Hanois tårn med n plater

INF2220: Gruppe me 2. Mathias Lohne Høsten 2017

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 32 Forelesning 13.9.2004

Prioritetskø ADT Motivasjon I en vanlig kø (kapittel 3 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 13.9.2004 Ark 2 av 32

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 vanlig datamaskin i dag er det bare en prosessor (CPU), så bare en jobb kan fysisk kjøre (utføres) på et gitt tidspunkt. Det er helt uakseptabelt å la hver jobb kjøre ferdig før neste jobb får slippe til. Forelesning 13.9.2004 Ark 3 av 32

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. Problemet er at korte jobber tar 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 13.9.2004 Ark 4 av 32

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 priotiet). deletemin som tar ut og returnerer det elementet i køen som har høyest priortet (minst p). Vi skal senere se litt på noen andre operasjoner som en mer avansert prioritetskø kan tenkes å støtte. insert(x,p) Prioritetskø deletemin Forelesning 13.9.2004 Ark 5 av 32

Implementasjoner Det er flere opplagte måter å implementere en prioritetskø på: Enkel pekerkjede A 1 A 2... A n PK setter alltid inn bakerst i pekerkjeden, O (1) må traversere listen for å finne det minste elementet, O (n) Forelesning 13.9.2004 Ark 6 av 32

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. Forelesning 13.9.2004 Ark 7 av 32

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ø. 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 13.9.2004 Ark 8 av 32

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 B C D E F G H I J 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 (1 + 2 + 4 + +2 h =2 h+1 1). Dermed er høyden i treet (uttrykt ved n) lik log n. Forelesning 13.9.2004 Ark 9 av 32

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 en enkelt array for å implementere en heap: A B C D E F G H I J Array H: A B C D E F G H I 0 1 2 3 4 5 6 7 8 9 J 10 11 12 Forelesning 13.9.2004 Ark 10 av 32

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 ). 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). Forelesning 13.9.2004 Ark 11 av 32

Ordningskravet til en heap Heap-ordningskravet: Den minste verdien i treet er i roten. Dette skal også gjelde for alle subtrær. 3 9 4 12 18 21 17 53 41 60 en heap 1 9 4 12 20 2 5 53 41 40 ikke en heap Forelesning 13.9.2004 Ark 12 av 32

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. Hvis man ønsker en max-heap, kan man kreve at det største elementet skal være i roten av treet (og alle subtrær). Forelesning 13.9.2004 Ark 13 av 32

Insert Vi må sikre oss at heap-kravene er oppfylt etter at innsettingen er ferdig. Når vi skal sette inn et element X, må vi lage en boble (tom node) i den neste ledige plassen, ellers vil ikke treet være komplett. 3 9 4 12 18 21 17 53 41 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 13.9.2004 Ark 14 av 32

Eksempel: INF1020 Algoritmer og datastrukturer Sett inn et element med prioritet 8 i heapen på forrige lysark. 8 kan ikke settes inn i den nye boblen fordi forelderen i så fall vil ha større verdi enn barnet (18 > 8). Vi lar derfor boblen bytte plass med 18: 3 9 4 12 21 17 53 41 60 18 Elementet kan fortsatt ikke settes inn fordi 9 > 8, så vi lar boblen flyte oppover enda et nivå: 3 4 12 9 21 17 53 41 60 18 Nå kan 8 settes inn fordi 3 < 8. Forelesning 13.9.2004 Ark 15 av 32

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: -99 3 9 4 0 1 2 3... Forelesning 13.9.2004 Ark 16 av 32

Insert kodet i Java uten dørvakt: (side 189 i MAW) public void insert( Comparable x ) throws Overflow { if( isfull( ) ) throw new Overflow( ); } // 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. Forelesning 13.9.2004 Ark 17 av 32

DeleteMin Det er lett å finne det minste 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: => 8 10 8 10 10 8 Riktig!, Galt! Forelesning 13.9.2004 Ark 18 av 32

Eksempel: INF1020 Algoritmer og datastrukturer Utfør deletemin på heapen nedenfor: 3 8 4 12 9 21 17 53 41 60 18 Først fjerner vi 3 fra rotboblen, og samtidig fjerner vi boblen rundt det siste elementet i heapen: 8 4 12 9 21 17 53 41 60 18 18 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: Forelesning 13.9.2004 Ark 19 av 32

4 8 12 9 21 17 53 41 60 18 Fortsatt kan ikke 18 settes inn (fordi 17 < 18), så vi lar boblen synke videre nedover. 4 8 17 12 9 21 53 41 60 18 Nå kan 18 settes inn. Forelesning 13.9.2004 Ark 20 av 32

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. Forelesning 13.9.2004 Ark 21 av 32

DeleteMin kodet i Java (side 191 i MAW): public Comparable deletemin( ) { if( isempty( ) ) return null; Comparable 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; Comparable 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 13.9.2004 Ark 22 av 32

Andre heap-operasjoner Selv om findmin er lett, så er heap-ordningskravet ikke til hjelp hvis vi ønsker å implementere tilleggsfunksjonen findmax. Det eneste vi vet om det stø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 kjenner heap-posisjonen, i, til et element, kan følgende operasjoner utføres i O (log n) verstetid: DecreaseKey(i, ), IncreaseKey(i, ) og Delete(i). Forelesning 13.9.2004 Ark 23 av 32

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 13.9.2004 Ark 24 av 32

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år en bruker dreper en prosess (kill), må den fjernes fra prioritetskøen. Forelesning 13.9.2004 Ark 25 av 32

BuildHeap Anta at du har N elementer som du ønsker å sette inn i en tom heap. 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 13.9.2004 Ark 26 av 32

Eksempel 15 8 4 3 1 7 11 10 2 9 6 5 ikke heap 12 14 13 15 8 4 3 1 7 11 10 2 9 6 5 12 14 13 Etter PercolateDown(7) 15 8 4 2 1 5 11 10 3 9 6 7 12 14 13 PercolateDown 6,5 og 4 Forelesning 13.9.2004 Ark 27 av 32

15 1 4 2 6 5 11 10 3 9 8 7 12 14 PercolateDown indeks 3 og 2 13 1 2 4 3 6 5 11 10 15 9 8 7 12 14 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. 13 Forelesning 13.9.2004 Ark 28 av 32

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 3 2 noder med høyde h-3 i 2 noder med høyde h-i S = h + 2(h 1)+2 2 (h 2)+ +2 h 1 1 Forelesning 13.9.2004 Ark 29 av 32

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+4+8+ +2 h 1 +2 h = h+(1+2+4+ +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). Forelesning 13.9.2004 Ark 30 av 32

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). Forelesning 13.9.2004 Ark 31 av 32

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 13.9.2004 Ark 32 av 32