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

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

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

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

Definisjon av binært søketre

Definisjon: Et sortert 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

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

Hvor raskt klarer vi å sortere?

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

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

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

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

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

Datastrukturer for rask søking

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

Et eksempel: Åtterspillet

INF1020 Algoritmer og datastrukturer. Dagens plan

INF Algoritmer og datastrukturer

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

INF Algoritmer og datastrukturer

... Dagens plan. Prioritetskø ADT

INF2220: Time 4 - Heap, Huffmann

Et eksempel: Åtterspillet

Liste som abstrakt konsept/datatype

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

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

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

IN Algoritmer og datastrukturer

Lars Vidar Magnusson

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

INF2220: Time 12 - Sortering

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

Selv-balanserende søketrær

INF2220: Forelesning 2

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

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

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

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

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

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

PG4200 Algoritmer og datastrukturer Forelesning 7

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

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

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

Logaritmiske sorteringsalgoritmer

Algoritmer og datastrukturer Assignment 11 Side 1 av 5

Binære trær: Noen algoritmer og anvendelser

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

Oppgave 1. Sekvenser (20%)

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

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

Notater til INF2220 Eksamen

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

Kap 9 Tre Sist oppdatert 15.03

Stack. En enkel, lineær datastruktur

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

INF2220: Forelesning 2

Minimum Spenntrær - Kruskal & Prim

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

EKSAMEN med løsningsforslag

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

Grunnleggende Datastrukturer

UNIVERSITETET I OSLO

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

Oppgave 1 a. INF1020 Algoritmer og datastrukturer. Oppgave 1 b

Trær. Består av sammenkoblede noder Hver node har 0 eller flere barne-noder. Må være asyklisk. Et tre med n noder har n-1 kanter.

Øvingsforelesning 6. Sorteringsalgoritmer. Kristian Veøy

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

Algoritmer og datastrukturer Løsningsforslag

Balanserte binære søketrær

UNIVERSITETET I OSLO

Øvingsforelesning 6. Sorteringsalgoritmer. Martin Kirkholt Melhus Basert på foiler av Kristian Veøy 30/09/14 1

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

Innhold. Innledning 1

Lars Vidar Magnusson

Obligatorisk oppgave 2 i INF 4130, høsten 2009

EKSAMEN. 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

KONTINUASJONSEKSAMEN

Algoritmer og Datastrukturer

Pensum: fra boken (H-03)+ forelesninger

Vi skal se på grafalgoritmer for:

UNIVERSITETET I OSLO

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

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

8NH )RUHOHVQLQJ 'HSDUWPHQWÃRIÃ,QIRUPDWLFVÃ8QLYHUVLW\ÃRIÃ2VORÃ1RUZD\,1) ± $OJRULWKPVÃÉÃ'DWDÃ6WUXFWXUHV

Algoritmer og Datastrukturer

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

Løsningsforslag til eksamen i PG4200 Algoritmer og datastrukturer 10. desember 2014

Høgskolen i Gjøvik. Avdeling for elektro- og allmennfag K O N T I N U A S J O N S E K S A M E N. EKSAMENSDATO: 11. august 1995 TID:

Pensum: fra boken (H-03)+ forelesninger

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

Algoritmer - definisjon

Disjunkte mengder ADT

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

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

København 20 Stockholm

Transkript:

Heap

Binær heap En heap er et komplett binært tre: Alle nivåene i treet, unntatt (muligens) det nederste, er alltid helt fylt opp med noder Alle noder på nederste nivå ligger så langt til venstre som mulig

Ordningen i en heap Nodene i en heap er ordnet, men ikke sortert Min-heap: Verdien i en node er alltid mindre eller lik verdien i nodens barn Max-heap: Verdien i en node er alltid større eller lik verdien i nodens barn Min-heap Max-heap

To komplette binære trær bare treet til venstre er en heap

Heap: Monotont binært tre Min-heap: Verdiene øker når vi følger en vei fra roten til et blad i treet monoton stigning Minste verdi i en min-heap er alltid i roten av treet Max-heap: Verdiene avtar når vi følger en vei fra roten til et blad Største verdi i en max-heap er alltid i roten av treet Alle subtrær i en heap er også en heap

Verdiene stiger langs alle veier fra roten Alle subtrær er også en heap

Høyden h av en heap med n noder n = 1 2 n < 4 4 n < 8 8 n < 16 16 n < 32 h = 0 = log 1 h = 1 = log 2 h = 2 = log 4 h = 3 = log 8 h = 4 = log 16... Generelt: Høyden er lik største heltall mindre eller lik log 2 n

Bruk av heap En heap tilbyr bare to operasjoner: Fjern den minste (eller største) verdien i datastrukturen Sett inn et nytt element i datastrukturen Garanterer O(log n) effektivitet av operasjonene Brukes i problemer der det er viktig å ha rask tilgang til det minste (eller største) av dataelementene Kan også brukes til å lage en svært effektiv in-house sorteringsalgoritme, heapsort, som alltid er O(n log n)

Forenklinger i forhold til læreboken Læreboken implementerer heap med: Generisk ADT som kan lagre 'alt' Både array og pekere For å holde fokus på prinsippene og algoritmene, og ikke på Java, forenkler vi til: Bare implementasjon med array Ingen ADT, bare noder som inneholder enkle data som heltall eller tegn

Arrayimplementasjon av heap Rotnoden lagres på indeks 0 Barna til noden på indeks i lagres alltid på indeksene: 2 i + 1 og 2 i + 2 Forelder til noden på indeks i (unntatt roten) lagres alltid på indeks: (i 1) / 2 (heltallsdivisjon) Arrayimplementasjon er enkelt og svært effektivt, fordi en heap alltid er et komplett binært tre. Trenger bare å holde rede på antall noder i heapen Enkel min-heap med heltall: intheap.java

Arrayimplementasjon, eksempel En heap pakkes effektivt inn i en array, fra venstre mot høyre og fra roten og nedover, uten hull i arrayen

Innsetting av ny verdi i en min-heap 1. Sett inn ny node med ny verdi sist i heap'en, på første ledige plass i nederste nivå 2. Hvis ny verdi er mindre enn verdi i foreldernoden, bytt om ny node og forelder 3. Fortsett bytteprosessen oppover i treet inntil ny node står riktig (>= forelder eller i roten) Den nye verdien vil flyte oppover i treet inntil den står på riktig plass ( percolate upwards, siftup, bubble up )

Innsetting i min-heap lagret i array Samme eksempel som på forrige side: 0 1 2 3 4 5 6 7 8 9 10 13 21 16 24 31 19 68 65 26 32 14 13 21 16 24 14 19 68 65 26 32 31 13 14 16 24 21 19 68 65 26 32 31 13 14 16 24 21 19 68 65 26 32 31

Innsetting: Effektivitet og implementasjon Implementeres med en enkel while-løkke som starter fra siste posisjon i heap og bytter med foreldernode inntil ny verdi står riktig Finner foreldernode ved en enkel indeksberegning, raskt og effektivt Verste tilfelle: Ny node beveger seg helt opp til roten Er alltid O(log n) for heap med n noder Java-kode for min-heap med heltall: intheap.java

Fjerning av minste verdi (roten) i min-heap 1. Ta ut rotnoden 2. Fyll igjen hullet ved å flytte den siste noden i heap'en inn på rotens posisjon 3. Hvis flyttet node er større enn et av barna: Bytt om det minste av barna med flyttet node 4. Fortsett å bytte flyttet node nedover i treet inntil den står riktig (<= begge barn eller blad) Noden som flyttes opp til roten vil flyte nedover i treet inntil den står riktig ( percolate downwards, siftdown )

Fjerning av minste verdi i min-heap Samme eksempel som på forrige side, med array : 0 1 2 3 4 5 6 7 8 9 10 13 14 16 19 21 19 68 65 26 32 31 31 14 16 19 21 19 68 65 26 32 14 31 16 19 21 19 68 65 26 32 14 19 16 31 21 19 68 65 26 32 14 19 16 26 21 19 68 65 31 32 14 19 16 26 21 19 68 65 31 32

Fjerning av minste verdi: Effektivitet og implementasjon Implementeres med en enkel while-løkke som starter med ny rot og bytter med minste barn inntil verdi står riktig Finner barnenodene ved enkel indeksberegning, raskt og effektivt Verste tilfelle: Ny rotnode beveger seg helt ned til et blad Er alltid O(log n) for heap med n noder Java-kode for min-heap med heltall: intheap.java

Heapsort Algoritme for å sortere array med n elementer: 1. Sett alle elementene inn i en heap som initielt er tom 2. Ta ut minste element av heap'en n ganger og sett dem tilbake i arrayen i sortert rekkefølge Enkel heapsort med heltall: heapsortdemo.java

Heapsort: Effektivitet Arbeidsmengde: Gjør først n innsettinger i en heap som initielt er tom: O(n log(n)) fordi heapen alltid er balansert Deretter n fjerninger av minste element i heap, også O(n log(n)) Totalt: O(n log(n)) Fordel: Garantert O(n log(n)), ikke avhengig av data Ulempe: Bruker O(n) ekstra memory til heap

In-place heapsort Bruker ikke en ekstra array til å lagre heap Både innsetting og fjerning i heap gjøres inne i opprinnelig array (in-place) Bruker en max-heap: Forelder er alltid større eller lik barna Største verdi ligger i roten Strategi: Gjør om hele arrayen til en max-heap Fjern første verdi fra heap og legg den på indeksen rett etter heap, inntil heap er tom

Bruker to hjelpefunksjoner siftup(int A[], int i) A[0], A[1],..., A[i 1] er en max-heap Setter verdien A[i] inn i heap ved å bytte den oppover med foreldernode inntil den står riktig siftdown(int A[], int i) A[0], A[1],..., A[i] er en max-heap, muligens med unntak av roten A[0] som kan stå feil Setter verdien A[0]på riktig plass i heap ved å bytte den nedover med største barn inntil den står riktig

Algoritme: In-place heapsort void heapsort(int A[]) { for (int i = 1; i < A.length; i++) siftup(a, i); } for (int i = A.length 1; i > 0; i ) { int tmp = A[i]; A[i] = A[0]; A[0] = tmp; siftdown(a, i 1); }

Eksempel 1. Bygger heap siftup 7 4 7 10 9 5 siftup 10 7 4 10 9 5 siftup 9 10 4 7 9 5 siftup 5 10 9 7 4 5 10 9 7 4 5 2. Tar ut største verdi swap 10 og 5 5 9 7 4 10 siftdown 5 9 5 7 4 10 swap 9 og 4 4 5 7 9 10 siftdown 4 7 5 4 9 10 swap 7 og 4 4 5 7 9 10 siftdown 4 5 4 7 9 10 swap 5 og 4 4 5 7 9 10

Animasjon av in-place heapsort

Effektivitet og implementasjon n siftup + n siftdown = O(n log n) Ikke så rask som Quicksort pga. mye swapping, men: Garantert O(n log n) uansett data Tilnærmet ingen overhead/ekstra ressursbruk Implementasjon: heapsort.java Testprogram med sammenligning med Quicksort og mergesort: testquickmergeheap.java

Prioritetskø En kø som ikke er First-In-First-Out Alle elementene i køen har en verdi som angir en prioritet Det er alltid elementet med størst (evt. minst) prioritet som først skal tas ut av køen dequeue: Ta ut elementet med størst/minst prioritet enqueue: Sett inn et element med en gitt prioritet

Implementasjon av prioritetskø Med sortert array: Fjerning av elementet i køen med størst prioritet, dequeue, blir O(1) Innsetting av nytt element med gitt prioritet, enqueue, blir O(n), for langsomt for store datasett Med binært søketre / AVL-tre: Både dequeue og enqueue blir O(log n) Unødvendig komplisert for en prioritetskø, trenger ikke å ha en full sortering av elementene i køen Beste alternativ: Heap

Prioritetskø og heap En heap implementerer en prioritetskø: insert = enqueue removemin = dequeue Innsetting og fjerning blir begge O(log n) Java-implementasjon: Se koden fra læreboka

Anvendelser av prioritetskøer I operativsystemer: Scheduling av prosesser Køer til delte ressurser som f.eks. printere Simulering av køsystemer: Objektene som skal håndteres står i en prioritetskø Eksempel: Flyplass-simulering der flyene som skal lande prioriteres etter gjenværende mengde drivstoff Handlingsdrevet simulering

Handlingsdrevet simulering Discrete event simulation / Event-driven simulation Handlingene (events) som skal skje i systemet ligger i en prioritetskø, ordnet på tidspunkt for handlingen Simuleringen drives fremover ved at vi i hvert steg tar ut og utfører handlingen som skal utføres først (har lavest tidsstempel ) Utførelse av en handling kan føre til at nye handlinger legges inn i prioritetskøen