INF2220: Time 4 - Heap, Huffmann

Like dokumenter
INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

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

INF2220: Time 12 - Sortering

Notater til INF2220 Eksamen

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

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

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

INF2220: Forelesning 2

Definisjon av binært søketre

Definisjon: Et sortert tre

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

INF1020 Algoritmer og datastrukturer. Dagens plan

Lars Vidar Magnusson

... Dagens plan. Prioritetskø ADT

INF Algoritmer og datastrukturer

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

UNIVERSITETET I OSLO

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

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

INF2220: Forelesning 2

Balanserte binære søketrær

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

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

INF1020 Algoritmer og datastrukturer GRAFER

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

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

Et eksempel: Åtterspillet

Logaritmiske sorteringsalgoritmer

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

Dagens plan. INF Algoritmer og datastrukturer. Koding av tegn. Huffman-koding

INF2220: Time 8 og 9 - Kompleksitet, beregnbarhet og kombinatorisk søk

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

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

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

Selv-balanserende søketrær

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

Kap.12. Flervegssøketre. Studerer 2-3 og 2-4 trær. Sist oppdatert

Grådige algoritmer. Lars Vidar Magnusson Kapittel 16. Aktivitetvelgingsproblemet Huffmankoder

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

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID:

Binære trær: Noen algoritmer og anvendelser

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

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.

Et eksempel: Åtterspillet

Innhold. Innledning 1

Datastrukturer for rask søking

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

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

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

Liste som abstrakt konsept/datatype

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

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

Sekventkalkyle for utsagnslogikk

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

Algoritmer og datastrukturer Pensumsammendrag i INF2220. Mathias Lohne, Kris an Monsen Haug, Vegard S kbakke

PG4200 Algoritmer og datastrukturer Forelesning 7

Korteste vei i en vektet graf uten negative kanter

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

INF2810: Funksjonell Programmering. Huffman-koding

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

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

INF Algoritmer og datastrukturer

EKSAMEN med løsningsforslag

Dijkstras algoritme Spørsmål

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

INF2220: Forelesning 1

INF1010 siste begreper før oblig 2

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

Minimum Spenntrær - Kruskal & Prim

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

Trær. En datastruktur (og abstrakt datatype ADT)

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

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

INF 1040 Løsningsforslag til kapittel

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

KONTINUASJONSEKSAMEN

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

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

Pensum: fra boken (H-03)+ forelesninger

Transkript:

INF0: Time 4 - Heap, Huffmann Mathias Lohne mathialo Heap (prioritetskø) En heap (også kalt prioritetskø) er en type binært tre med noen spesielle struktur- og ordningskrav. Vi har to typer heap: min- og maksheap. Vi vil beskrive minheap i dette kapitlet, men maksheap fremgår helt analogt. Definisjon. En minheap er et binært tre der følgende krav er oppfylt:. Treet er komplett. En node har alltid (sorterings)verdi mindre enn, eller lik sine barn. En maksheap defineres nesten likt, eneste forskjell er at pt. i definisjonen blir En node alltid er større enn, eller lik sine barn. Hver node i en heap inneholder to ting: et element, og en verdi vi sorterer etter. I motsetning til i et binært søketre der vi sorterer på elementet selv, vil vi med en heap tilordne en sorteringsverdi til hvert element som ikke trenger å ha noe med elementet å gjøre. Figur : En (min)heap. For oversiktens skyld er kun sorteringsverdiene tatt med. 3 6 9 5 6 8 8. Innse ng Når vi skal sette inn et element i en heap setter vi den på første ledige plassen. Deretter sammenligner vi nodens verdi med forelderens verdi. Hvis forelderen har større verdi enn noden vi setter inn bytter vi plass. Så sammenligner vi med den nye forelderen, bytter plass om nødvendig, og fortsetter slik til enten forelderen er mindre enn noden, eller at noden er rot. Foreleser og lærebok kaller denne prosessen percolate up

. Fjerning (deletemin) I en heap er vi egentlig bare interessert i å ta ut det minste elementet fra en heap (hvorfor blir diskutert i avsnittet om anvendelser). På grunn av krav i definisjonen vet vi at rota er det minste elementet i heapen. Derfor fjerner vi rota. For å skaffe en ny rot tar vi det siste elementet i heapen og setter som rot. Deretter sammenligner vi verdien av den nye rota med verdien av barna. Hvis et (eller begge) av barna har mindre verdi enn den nye rota bytter rota plass med det minste barnet. Vi fortsetter slik til ordningskravet er oppfylt (noden har mindre verdi enn barna)..3 Implementasjon Vi kan implementere en heap som et tre (dvs, lage nodeobjekter med pekere til barn etc), men som oftest implementerer vi en heap ved hjelp av en array. Vi lar rota være på index. På grunn av kompletthetskravet kan vi legge nodene radvis bak rota. Vi finner da barna til en node på index i ved å til index i (venstre barn) og i + (høyre barn), og forelder ved å gå til index i/. Når vi implementerer en heap som en array kan vi risikere å gå tom for plass i arrayen. Da må vi lage en ny array, og flytte over alle elementene til den nye arrayen. Vanligvis legger vi til en og en rad i slengen (eventuelt to og to, tre og tre, etc..). Å gjøre dette tar åpenbart O(n) tid, men vi må gjøre det sjeldnere og sjeldnere jo større heapen blir. Figur : Heapen i fig representert som array index 0 3 4 5 6 7 8 9 0 3 4 5 verdi null 3 6 9 5 6 8 8 null null null I Java har vi en ferdig heap: java.util.priorityqueue<e>. Java krever at E er sammenlignbar med seg selv (E implementerer comparable<e>) og vil bruke den sammenligningen som grunnlag for sortering. Javas heap er implementert som array..4 Tidsanalyse Vi ser på kjøretiden til de to omtalte operajonene: Teorem. Kjøretid for heapoperasjoner. Innsetting i en heap tar O(log n) tid. Fjerne minste element tar O(log n) tid Beviset følger av strukturkravet i definisjon : Bevis. Teorem.4, del i: Når vi setter inn et element i en heap må vi først sette elementet på slutten av heapen. Siden vi vet hvor siste element er vil dette ta O() tid. Deretter må vi justere plassen til elementet ved å la elementet sive oppover. Siden treet er komplett vil høyden på treet være log (n + ), og vi kan maksimalt foreta log (n + ) byttinger. Total tid blir derfor være O(log n) Argumentet for teo..4, del ii er helt analogt. percolate down

.5 Anvendelser I dette kurset ser vi på tre anvendelser av en heap: Prioritetskø, sortering og Huffmankoding. Når vi bruker en (min)heap som en prioritetskø lar vi viktige jobber ha lav verdi, og mindre viktige jobber ha høy verdi. Når vi setter jobbene våre inn i en heap og tar dem ut vil de viktigste jobbene komme først. Fordelen med dette mot å bare sortere lista med jobber er at vi dynamisk kan legge til flere jobber underveis. Vi kan også bruke en heap til å sortere ei liste. Måten å gjøre det på er enkel: vi setter alle elementene i lista inn i en heap, og tar dem ut igjen. Når vi tar ut et element fra en (min)heap er det alltid det minste elementet som kommer først, og vi kan sette elementet først i den sorterte utgaven av lista. Kompleksitetsmessig er dette en ganske rask måte å sortere på, vi må gjøre n innsettinger og n slettinger, begge på O(log n) tid. Kjøretid for heapsort er dermed: n O(log n) = O(n log n) som er veldig bra. En siste anvendelse av heaps er i huffmankoding. Mer detaljer om det etterpå. Venstreorientert (le ist) heap En venstreorientert heap er en en heap med et annet strukturkrav enn vanlig heap. Motivasjonen bak venstreorienterte heaper er at å flette (merge) to heaper av samme størrelse tar O(n) tid, vi ønsker å forbedre det. Før vi kan definere en venstreorientert heap må vi definere null path length (herfra: npl). Definisjon. Npl til en node n er lengden av den korteste veien fra n til en etterkommer uten to barn (0 hvis n har < barn). Figur 3: Et tre med npl(n) skrevet inn 0 0 0 0 Vi er nå klare til definisjonen av venstreorientert heap: Definisjon. En venstreorientert heap er et binært tre der følgende krav er oppfylt:. For hver node n i treet er npl(l) npl(r), der l er venstre og r er høyre barn til n.. En node har alltid (sorterings)verdi mindre enn, eller lik sine barn. Merk: En venstreorientert heap forsøker å være ute av balanse (for å gjøre fletting enklere). 3

. Fle ng, innse ng og sle ng Hovedoperasjonen på venstreorienterte heaper er fletting (engelsk: merging). Fletting er forklart i teorem. For å sette inn en node i en venstreorientert heap kan vi flette en heap bestående av den ene noden vi vil sette inn, med hele heapen vi vil sette noden inn i. For å fjerne minste node kan vi ta vekk rota (som vi vet er minst fra def. pt. ), og flette venstre og høyre subheap. Teorem. La H og H være to venstreorienterte heaper. Vi definerer fletting reukursivt: Sammenlign rota i H og H. Antar videre at H er minst. La høyre subheap til H være heapen som framkommer av å flette høyre subheap av H med H. Fortsett slik til problemet er trivielt. Underveis i oppnøstinga etter rekursjonen kan høyre og venstre supheap swapes for å opprettholde strukturkrav i def 3 Huffmankoding Huffmankoding er en måte å kode informasjon på (her tekst) på en måte der vi ikke mister noe informasjon (lossless). Den forutsetter at vi har tilgang på teksten før vi lager en kode. Huffmankoding går ut på å se på frekvensen til tegnene som forekommer, og gi kort kode til de tegnene som forekommer ofte, og lang kode til de som forekommer sjelden. Når vi velger disse kodene er det viktig at vi beholder det vi kaller prefiksegenskapen: Ingen koder er et prefiks av noen andre. Kodealfabetet {9, 55} har prefiksegenskapen, men {9, 5, 59, 55} har ikke, siden 5 er prefiks i 55 og 59. Måten Huffmankoding beholder denne egenskapen blir fort tydelig når vi ser på algoritmen. Teorem. Algoritme for Huffman-koding. Lag frekvenstabell for alle tegn som forekommer i teksten.. Sett alle frekvensene inn i en heap P 3. Mens P har mer enn ett element: Ta ut de to minste nodene fra P. Slå sammen nodene, og summer frekvensene. Legg den nye noden inn i P. 4. Vi leser koden til et tegn ved å følge stien fra rotnoden ned til tegnets løvnode. Vi får en 0 når vi går til venstre, og en når vi går til høyre. (Dette fungerer selvfølgelig ved å gjøre motsatt, så lenge man er konsekvent.) Merk: En tekst kan ha flere gyldige Huffman-trær, og dermed flere gyldige Huffman-kodinger. Algoritmen burde bli klar når vi ser på et eksempel. 4

Eksempel Anta at vi har en tekst BACADAEAFABBAAAGAH. Vi setter opp en frekvenstabell for bokstavene i koden. Tegn Frekvens A 9 B 3 C D E F G H Vi ser at vi kan parvis slå sammen to og to av nodene som har vekt : Vi slår sammen C og D, E og F, og G og H. Nå har (CD), (EF) og (GH) alle vekt. Vi slår så sammen B og (CD) til en node (B, CD) med vekt 5, og vi slår sammen (EF) og (GH) til en node (EF, GH) med vekt 4. Vi slår så igjen sammen (B, CD) og (EF, GH) slik at de får en foreldrenode med vekt 9. Til slutt slår vi sammen denne med noden A. Det resulterende treet er: 8 9 A/9 4 5 B/3 C/ D/ E/ F/ G/ H/ Hvis vi nå følger regelen fra algoritmen om å skrive 0 når vi går venstre og når vi går høyre får vi kodene: Tegn Frekvens Kode A 9 B 3 0 C 0000 D 000 E 000 F 00 G 000 H 00 Vi kan lett sjekke at prefiksegenskapen er intakt, og teksten BACADAEAFABBAAAGAH får koden 00000000000000000000 som er 4 bits lang. Dette er åpenbart mye kortere enn standard enkoding. Hvis vi for eksempel hadde brukt ASCII-enkoding, der hvert tegn har en 7-bits kode, hadde vi hatt en kode med 7 8 = 6 bits. 5