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

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

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

INF1020 Algoritmer og datastrukturer. Dagens plan

Notater til INF2220 Eksamen

Obligatorisk oppgave 2 i INF 4130, høsten 2009

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

... Dagens plan. Prioritetskø ADT

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

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

INF2220: Time 4 - Heap, Huffmann

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

Lars Vidar Magnusson

UNIVERSITETET I OSLO

Minimum Spenntrær - Kruskal & Prim

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

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

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

Definisjon av binært søketre

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

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

Kap 9 Tre Sist oppdatert 15.03

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

Øvingsforelesning 7. Dijkstras algoritme. Foiler: Fredrik Ludvigsen Foreleser: Jon Marius Venstad 10/4/09 1

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

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

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: Forelesning 2

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

Balanserte binære søketrær

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

Ekstra ark kan legges ved om nødvendig, men det er meningen at svarene skal få plass i rutene på oppgavearkene. Lange svar teller ikke positivt.

UNIVERSITETET I OSLO

INF Algoritmer og datastrukturer

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

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

ALGORITMER OG DATASTRUKTURER

Definisjon: Et sortert tre

Selv-balanserende søketrær

Datastrukturer for rask søking

Grunnleggende Datastrukturer

Binære trær: Noen algoritmer og anvendelser

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

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

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

Et eksempel: Åtterspillet

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

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Dijkstras algoritme Spørsmål

PG4200 Algoritmer og datastrukturer Forelesning 10

IN Algoritmer og datastrukturer

INF2220: Time 12 - Sortering

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

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

INF2220: Forelesning 2

Oppgave 1. Sekvenser (20%)

INF Algoritmer og datastrukturer

Algoritmer og Datastrukturer

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

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

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

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

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

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

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

Korteste vei i en vektet graf uten negative kanter

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

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

EKSAMEN med løsningsforslag

KORTESTE STI. Vektede Grafer. Korteste Sti. Dijkstra s Algoritme. Vektet Urettet Graf

Eksamen i fag SIF8010 Algoritmer og Datastrukturer Tirsdag 14. Desember 1999, kl

PG4200 Algoritmer og datastrukturer Forelesning 7

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

Øvingsforelesning 4. Martin Aasen

Øvingsforelesning 6. Sorteringsalgoritmer. Kristian Veøy

Kontinuasjonseksamen i fag SIF8010 Algoritmer og Datastrukturer Torsdag 9. August 2001, kl

EKSAMENSOPPGAVE. NB! Det er ikke tillatt å levere inn kladd sammen med besvarelsen

ALGORITMER OG DATASTRUKTURER

Lars Vidar Magnusson

INF Algoritmer og datastrukturer

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

Løsningsforslag for eksamen i fag SIF8010 Algoritmer og datastrukturer Lørdag 9. august 2003, kl

INF Algoritmer og datastrukturer

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

Innhold. Innledning 1

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

Balanserte søketrær. AVL-trær. AVL-trær. AVL-trær høyde AVL AVL. AVL-trær (Adelson-Velskii og Landis, 1962) Splay-trær (Sleator og Tarjan, 1985)

Sist forelesning snakket vi i hovedsak om trær med rot, og om praktisk bruk av slike. rot. barn

MAT1030 Diskret matematikk

Oppsummering. MAT1030 Diskret matematikk. Oppsummering. Oppsummering. Eksempel

Løsningsforslag til eksamen i fag SIF8010 Algoritmer og Datastrukturer Tirsdag 14. Desember 1999, kl

INF3/4130 PRØVE-EKSAMEN MED SVARFORSLAG Gjennomgås 1/ , (lille aud.)

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

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

Transkript:

Prioritetskøer Binære heaper Venstrevridde heaper (Leftist) Binomialheaper Fibonacciheaper Prioritetskøer er viktige i bla. operativsystemer (prosesstyring i multitaskingssystemer), og søkealgoritmer (A, A*, D*, etc.), og i simulering.

Prioritetskøer Prioritetskøer er datastukturer som holder elementer med en prioritet (key) i en kø-aktig struktur, og som implementerer følgende operasjoner: insert() Legge et element inn i køen deletemin() Ta ut elementet med høyest prioritet Og kanskje også: b ild () L k d l t buildheap() Lage en kø av en mengde elementer increasekey()/decreasekey() Endre prioritet delete() Slette et element merge() Slå sammen to prioritetskøer

Prioritetskøer En usortert lenket liste kan brukes. insert() legger inn først i listen (O(1)) og deletemin() søker igjennom listen etter elementet med høyest prioritet (O(n)). En sortert liste kan brukes. (Omvendt kjøretid.) Ikke så veldig effektivt. For å lage en effektiv prioritetskø, holder det at elementene i køen er nogenlunde sorterte.

Binære heaper (vanligst) En binærheap er organisert som et komplett binærtre. (Alle nivåer fulle, med evt. unntak av det siste nivået) I en binærheap skal elementet i roten ha en key som er mindre eller lik key en til barna, i tillegg skal hvert deltre være en binærheap. i / 2 b c d e f g 2i 2i+1 h i j a 1 2 3 4 a b c d e f g h i j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3 4

Binære heaper (vanligst) insert(14) 13 1 21 16 2 24 31 19 68 3 65 26 32 14 4 13 21 16 24 31 19 68 65 26 32 14 0 1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3 4

Binære heaper (vanligst) insert(14) 13 1 14 16 2 23 21 19 68 3 65 26 32 31 4 13 14 16 24 21 19 68 65 26 32 31 0 1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3 4 percolateup()

Binære heaper (vanligst) deletemin() 1 14 16 2 19 21 19 68 3 65 26 32 31 4 14 16 19 21 19 68 65 26 32 31 0 1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3 4

Binære heaper (vanligst) deletemin() 31 1 14 16 2 19 21 19 68 3 65 26 32 4 31 14 16 19 21 19 68 65 26 32 0 1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3 4

Binære heaper (vanligst) deletemin() 14 1 19 16 2 26 21 19 68 3 65 31 32 4 14 19 16 19 21 26 68 65 31 32 0 1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3 4 percolatedown()

Binære heaper (vanligst) worst case gjennomsnitt insert() O(log N) O(1) deletemin() O(log N) O(log N) buildheap() O(N) (Legg elementene inn i tabellen i vilkårlig rekkefølge, og kjør percolatedown() på hver rot i deltrærne i heapen (treet) som oppstår, nedenifra og opp.) (Summen av høydene i et binærtre med N noder er O(N).) merge() O(N) (N = antall elementer)

Venstrevridde heaper For å implementere merge() effektivt, går vi bort fra tabell-metoden, og implementerer såkalte venstrevridde heaper (leftist heaps), som rene trær. Tanken er å gjøre heapen (treet) skeivt, slik at vi kan gjøre det meste av arbeidet på den laveste delen av treet. En venstrevridd heap er et binærtre med heap-struktur (røttene i deltrærne skal ha lavere key enn barna.) og et ekstra skeivhetskrav. For alle noder X i treet, definerer vi nullsti-lengde(x) (null path length) som lengden av korteste sti fra X til en node som ikke har to barn. Kravet er at for alle noder, skal nullsti-lengden til det venstre barnet være minst like lang som nullsti-lengden til det høyre barnet.

Venstrevridde heaper 1 1 0 0 0 0 LEFTIST 1 1 0 0 1 0 0 IKKE LEFTIST

merge() Venstrevridde heaper 3 6 10 8 12 7 21 14 17 18 24 37 18 23 26 33

merge() Venstrevridde heaper 3 6 10 8 12 7 21 14 17 18 24 37 18 23 26 33

merge() Venstrevridde heaper 3 6 10 8 12 7 21 14 17 18 24 37 18 23 26 33 3 10 21 14 12 6 37 7 17 8 18 23 18 24 26 33

merge() Venstrevridde heaper 3 6 10 8 12 7 21 14 17 18 24 37 18 23 26 33 3 10 21 14 12 6 37 7 17 8 18 23 18 24 26 33

merge() Venstrevridde heaper 3 6 10 8 12 7 21 14 17 18 24 37 18 23 26 33 3 10 21 14 12 6 37 7 17 8 18 23 18 24 26 33

merge() Venstrevridde heaper 3 6 10 8 12 7 21 14 17 18 24 37 18 23 26 33 3 10 6 7 37 21 14 12 8 23 18 24 17 18 33 26

merge() Venstrevridde heaper 3 6 10 8 12 7 21 14 17 18 24 37 18 23 26 33 3 12 6 10 7 18 24 33 17 8 18 37 21 14 23 26

Venstrevridde heaper insert(3) merge() 5 3 7 6 10 deletemin() 1 merge() 5 3 7 6 11 10

Venstrevridde heaper worst case merge() O(log N) insert() O(log N) deletemin() O(log N) buildheap() O(N) (N = antall elementer) I venstrevridde heaper med N noder, er høyre sti maksimalt log (N+1) lang.

Binomialheaper Venstrevridde / skeive heaper: merge(), insert() og deletemin() i tid O(log N) w.c. Binære heaper: insert() i tid O(1) i gjennomsnitt. Binomialheaper merge(), insert() og deletemin() i tid O(log N) w.c. insert() i tid O(1) i gjennomsnitt. Binomialheaper er ikke trær, men en skog av trær, hvert tre en heap.

Binomialheaper Binomialtrær B 0

Binomialheaper Binomialtrær B 0 B 1

Binomialheaper Binomialtrær B 0 B 1 B 2

Binomialheaper Binomialtrær B 0 B 1 B 2 B3

Binomialheaper Binomialtrær B 0 B 1 B 2 B3 B 4

Binomialheaper Binomialtrær B 0 B 1 B 2 B3 Et tre av høyde k har: 2 k noder, B 4 k antall noder på nivå d er d

Binomialheaper Binomialheap 16 12 18 21 24 65 Maks ett tre av hver størrelse: 6 elementer: 6bi binært = 011(0 (0+2+4) B X 0 B 1 B 2

Binomialheaper Binomialheap 16 12 18 21 24 65 Maks ett tre av hver størrelse: 6 elementer: 6bi binært = 011(0 (0+2+4) B X 0 B 1 B 2 Lengden av rot-listen for en heap med N elementer er O(log N). (Dobbelt lenket, sirkulær liste.)

Binomialheaper merge() 16 12 13 14 23 18 21 24 26 51 24 65 65

Binomialheaper merge() 16 12 13 14 23 18 21 24 26 51 24 65 65

Binomialheaper merge() 16 12 13 14 23 18 21 24 26 51 24 65 65 13

Binomialheaper merge() 16 12 13 14 23 18 21 24 26 51 24 65 65 13 14 26 16 18

Binomialheaper merge() 16 12 13 14 23 18 21 24 26 51 24 65 65 13 23 12 51 24 21 24 14 65 65 26 16 18 Trærne (rotlisten) holdes sortert etter høyde.

Binomialheaper deletemin() 13 23 12 51 24 21 24 14 65 65 26 16 18

Binomialheaper deletemin() 13 23 12 51 24 21 24 14 65 65 26 16 18 merge() 13 23 21 24 14 51 24 65 26 16 65 18

Binomialheaper worst case gjennomsnitt merge() O(log N) O(log N) insert() O(log N) O(1) deletemin() O(log N) O(log N) buildheap() O(N) O(N) (Kjør N insert() i en tom heap.) (N = antall elementer)

Binomialheaper Implementsjon Dobbeltlenkede, sirkulære lister 13 23 12 51 24 21 24 14 65 65 26 16 18

Binomialheaper Implementsjon Dobbeltlenkede, sirkulære lister 13 23 12 51 24 21 24 14 65 65 26 16 18 23 61 27 88

Binomialheaper Implementsjon Dobbeltlenkede, sirkulære lister 13 23 12 51 24 21 24 14 65 65 26 16 18 23 61 27 88

Fibonacciheaper Meget elegant, og i teorien effektiv, måte å implementere heaper på: De fleste operasjoner har amortisert kjøretid O(1). (Fredman & Tarjan 87) insert(), decreasekey() og merge() deletemin() O(1) amortisert tid O(log N) amortisert tid Kombinerer elementer fra venstrevridde heaper og binomialheaper. I praksis litt komplisert å implementere, og enkelte skjulte konstanter er litt høye. Best egnet når det er få deletemin() i forhold til de andre operasjonene. Datastrukturen utviklet i forbindelse med en korteste sti-algoritme. Også benyttet i spenntre-algoritmer.

Fibonacciheaper Fra venstrevridde heaper tar vi med en smart decreasekey() metode. 2 4 11 9 5 12 17 18 10 8 6 18 31 15 11 21

Fibonacciheaper Fra venstrevridde heaper tar vi med en smart decreasekey() metode. 2 4 11 0 5 12 17 18 10 8 6 18 31 15 11 21

Fibonacciheaper Fra venstrevridde heaper tar vi med en smart decreasekey() metode. 0 2 18 10 4 11 31 5 12 17 Leftist 8 6 18 15 11 21 Ikke leftist

Fibonacciheaper Fra venstrevridde heaper tar vi med en smart decreasekey() metode. 0 2 18 10 4 11 31 5 12 17 Leftist 8 6 18 15 11 21 Ikke leftist

Fibonacciheaper Fra venstrevridde heaper tar vi med en smart decreasekey() metode. 0 2 18 10 11 4 31 12 17 5 Leftist 18 8 6 15 11 21 Leftist

Fibonacciheaper Fra venstrevridde heaper tar vi med en smart decreasekey() metode. 0 2 18 11 4 31 12 17 5 10 18 8 6 15 11 21

Fibonacciheaper Fra venstrevridde heaper tar vi med en smart decreasekey() metode. Metoden må imidlertid modifiseres litt, ettersom vi ønsker å bruke trær som er, eller nesten er, binomialtrær. - Noder merkes første gang de mister ett barn. - Andre gang de mister ett barn blir noden kappet av og blir rot i et eget tre, og merket fjernes. min 38 18 7 41 39 21 23 17 24 52 30 46 26 35

Fibonacciheaper Fra venstrevridde heaper tar vi med en smart decreasekey() metode. Metoden må imidlertid modifiseres litt, ettersom vi ønsker å bruke trær som er, eller nesten er, binomialtrær. - Noder merkes første gang de mister ett barn. - Andre gang de mister ett barn blir noden kappet av og blir rot i et eget tre, og merket fjernes. min 38 18 7 41 39 21 23 17 24 52 30 5 26 35

Fibonacciheaper Fra venstrevridde heaper tar vi med en smart decreasekey() metode. Metoden må imidlertid modifiseres litt, ettersom vi ønsker å bruke trær som er, eller nesten er, binomialtrær. - Noder merkes første gang de mister ett barn. - Andre gang de mister ett barn blir noden kappet av og blir rot i et eget tre, og merket fjernes. min 38 18 7 5 41 39 21 23 17 24 52 30 26 35

Fibonacciheaper Fra venstrevridde heaper tar vi med en smart decreasekey() metode. Metoden må imidlertid modifiseres litt, ettersom vi ønsker å bruke trær som er, eller nesten er, binomialtrær. - Noder merkes første gang de mister ett barn. - Andre gang de mister ett barn blir noden kappet av og blir rot i et eget tre, og merket fjernes. min 38 18 7 5 41 39 21 23 17 24 52 30 13 35

Fibonacciheaper Fra venstrevridde heaper tar vi med en smart decreasekey() metode. Metoden må imidlertid modifiseres litt, ettersom vi ønsker å bruke trær som er, eller nesten er, binomialtrær. - Noder merkes første gang de mister ett barn. - Andre gang de mister ett barn blir noden kappet av og blir rot i et eget tre, og merket fjernes. min 38 18 7 5 13 41 39 21 23 17 24 35 52 30

Fibonacciheaper Fra venstrevridde heaper tar vi med en smart decreasekey() metode. Metoden må imidlertid modifiseres litt, ettersom vi ønsker å bruke trær som er, eller nesten er, binomialtrær. - Noder merkes første gang de mister ett barn. - Andre gang de mister ett barn blir noden kappet av og blir rot i et eget tre, og merket fjernes. min 38 18 7 5 13 24 41 39 21 23 17 35 52 30

Fibonacciheaper Vi bruker lazy merging / lazy binomial queue. 18 7 5 8 4 8 8 6 9 9 6 11 32

Fibonacciheaper Vi bruker lazy merging / lazy binomial queue. 18 7 5 8 4 8 8 6 9 9 6 11 32 18 7 5 8 4 8 8 6 9 9 6 11 32

Fibonacciheaper Problemet med decreasekey()-metoden vår og lazy merging er selvsagt at vi må rydde opp i etterkant. Dette gjøres i deletemin(), som derfor får høy kjøretid (O(log N) amortisert tid). Alle trærne gjennomgåes, de minste først, og slåes sammen, slik at vi får maks ett tre av hver størrelse. Hver rot vet hvor mange barn den har, og det er dette vi bruker som størrelse. (Husk hvordan binomialtrær bygges.) Trærne legges i lister en liste per størrelse og så begynner vi å spleise de Trærne legges i lister, en liste per størrelse, og så begynner vi å spleise, de minste først.

Amortisert tid insert() O(1) decreasekey() O(1) merge() O(1) deletemin() O(log N) Fibonacciheaper buildheap() O(N) (Kjør N insert() i en tom heap.) (N = antall elementer)