INF Algoritmer og datastrukturer

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

INF1020 Algoritmer og datastrukturer GRAFER

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

Notater til INF2220 Eksamen

INF Algoritmer og datastrukturer

Alle mot alle. Åttende forelesning. (eller eller Bellman-Ford, eller BFS, alt ettersom) fra alle noder.

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

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

Live life and be merry

INF2220: Time 4 - Heap, Huffmann

45011 Algoritmer og datastrukturer Løsningsforslag eksamen 13. januar 1992

INF Algoritmer og datastrukturer

MAT1030 Diskret matematikk

Innledning. MAT1030 Diskret matematikk. Kapittel 11. Kapittel 11. Forelesning 33: Repetisjon

INF1020 Algoritmer og datastrukturer GRAFER

UNIVERSITETET I OSLO

Forelesning 33. Repetisjon. Dag Normann mai Innledning. Kapittel 11

INF Algoritmer og datastrukturer

Dynamisk programmering

Dagens plan: INF Algoritmer og datastrukturer. Grafer vi har sett allerede. Det første grafteoretiske problem: Broene i Königsberg

INF Algoritmer og datastrukturer

MAT1030 Diskret Matematikk

Korteste vei i en vektet graf uten negative kanter

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

INF Algoritmer og datastrukturer

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

ALGORITMER OG DATASTRUKTURER

Det første grafteoretiske problem: Broene i Königsberg

MAT1030 Diskret Matematikk

UNIVERSITETET I OSLO

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

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

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

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

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

Pensum: fra boken (H-03)+ forelesninger

Live life and be merry

MAT1030 Forelesning 25

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

INF Algoritmer og datastrukturer

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

INF1020 Algoritmer og datastrukturer GRAFER

INF Algoritmer og datastrukturer

Pensum: fra boken (H-03)+ forelesninger

Dynamisk programmering

Øvingsforelesning Korteste vei: Alle til alle

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

Dijkstras algoritme. Her finnes det også (minst) en riktig rekkefølge for Relax, men den må vi oppdage litt etter hvert.

UNIVERSITETET I OSLO

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

Forelesning 25. MAT1030 Diskret Matematikk. Litt repetisjon. Litt repetisjon. Forelesning 25: Trær. Roger Antonsen

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

Longest increasing. subsequence Betingelser. Longest. common subsequence. Knapsack Grådig vs. DP Moro: 2D-Nim Spørsmål. Forside. Repetisjon.

Forelesning 25. MAT1030 Diskret Matematikk. Litt repetisjon. Litt repetisjon. Forelesning 25: Trær. Dag Normann

Definisjon av binært søketre

INF Algoritmer og datastrukturer

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

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

INF Algoritmer og datastrukturer

Rekursiv programmering

Vektede grafer. MAT1030 Diskret matematikk. En kommunegraf. En kommunegraf. Oppgave

INF2810: Funksjonell Programmering. Huffman-koding

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

MAT1030 Diskret matematikk

Oppsummering. MAT1030 Diskret matematikk. Oppsummering. Oppsummering. Forelesning 23: Grafteori

Dijkstras algoritme. Her finnes det også (minst) en riktig rekkefølge for Relax, men den må vi oppdage litt etter hvert.

Vi skal se på grafalgoritmer for:

Forelesningsplan. Grådighet. LF Øving 9. Hva er grådighet? Aktivitetsvelger En grådig strategi Grådig eller dynamisk? Knapsack Huffmankoding

Norsk informatikkolympiade runde

Oppgave 3 a. Antagelser i oppgaveteksten. INF1020 Algoritmer og datastrukturer. Oppgave 3. Eksempelgraf

ALGORITMER OG DATASTRUKTURER

Dynamisk programmering Undervises av Stein Krogdahl

Grafalgoritmer: Korteste vei

GRAFER. Hva er en graf? Det første grafteoretiske problem: Broene i Königsberg. Grafer vi har sett allerede

Dagens stoff er hentet fra kapittel 9 i læreboka, samt kapittel 20.5 (som vi «hoppet over» sist)

Rettede, ikke-sykliske grafer (DAG)

Oppsummering. MAT1030 Diskret matematikk. Oppsummering. Oppsummering. Eksempel

MAT1030 Diskret matematikk

Forelesning 24. Grafer og trær. Dag Normann april Vektede grafer. En kommunegraf

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

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

Longest. increasing. subsequence. Betingelser. Matrise- common. Grådig vs. DP. Forside. Intro. Fibonacci-tall. Memoisering DP

Forelesning 27. MAT1030 Diskret Matematikk. Bevistrær. Bevistrær. Forelesning 27: Trær. Roger Antonsen. 6. mai 2009 (Sist oppdatert: :28)

Innhold. Innledning 1

Live life and be merry

Forelesning 23. Grafteori. Dag Normann april Oppsummering. Oppsummering. Oppsummering. Digresjon: Firefarveproblemet

Forelesning 29: Kompleksitetsteori

MAT1030 Diskret Matematikk

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

INF2810: Funksjonell Programmering. Huffman-koding

UNIVERSITETET I OSLO

MAT1030 Diskret Matematikk

Transkript:

INF2220 - Algoritmer og datastrukturer Institutt for informatikk, Universitetet i Oslo INF2220, forelesning 11: Huffman-koding & Dynamisk programmering (Ifi, UiO) INF2220 H2015, forelesning 11 1 / 32

Dagens plan Grådige algoritmer Huffman-koding Dynamisk programmering Floyds algoritme for korteste vei alle-til-alle Paradigmer for algoritmedesign (Ifi, UiO) INF2220 H2015, forelesning 11 2 / 32

Huffman-koding Koding av tegn Det finnes mange standarder for koding av tegn: Hollerith 12-bits hullkortkode Brukt på mekaniske datamaskiner før de elektroniske var oppfunnet BCD (Binary Coded Decimal) 4-bits kode brukt av IBM til koding av desimale sifre (BCD ble også brukt om 6-bits tegn på noen tidlige datamaskiner) EBCDIC (Extended Binary Coded Decimal Interchange Code) IBMs 8-bits utvidelse av BCD til fullt tegnsett ASCII (American (National) Standard Code for Information Interchange) 7-bits (senere 8-bits) tegn Unicode 8-bits tegn (Egentlig variabelt 8 32 bit) ISO-standard for alle tegn i alle språk (Ifi, UiO) INF2220 H2015, forelesning 11 3 / 32

Huffman-koding Huffman-koding Motivasjon Store tekstfiler tar stor plass, og tar lang tid å overføre over nettet Tidligere var ASCII og EBCDIC de rådende standardene Begge brukte 8-bits tegnkoder (ASCII brukte 7-bits kode + paritetsbit) Dette ble ansett som sløsing med plass Unicode bruker (stort sett) 8-bits koder, men 32-bits koder blir også brukt Unicode har 17 2 16 = 1 114 112 mulige tegn Selv i store tekstfiler blir bare noen få av disse brukt Unicode gir minst dobbelt så store filer som ASCII Konklusjon Det er behov for datakompresjon! (Ifi, UiO) INF2220 H2015, forelesning 11 4 / 32

Huffman-koding Huffman-koding Motivasjon Store tekstfiler tar stor plass, og tar lang tid å overføre over nettet Tidligere var ASCII og EBCDIC de rådende standardene Begge brukte 8-bits tegnkoder (ASCII brukte 7-bits kode + paritetsbit) Dette ble ansett som sløsing med plass Unicode bruker (stort sett) 8-bits koder, men 32-bits koder blir også brukt Unicode har 17 2 16 = 1 114 112 mulige tegn Selv i store tekstfiler blir bare noen få av disse brukt Unicode gir minst dobbelt så store filer som ASCII Konklusjon Det er behov for datakompresjon! (Ifi, UiO) INF2220 H2015, forelesning 11 4 / 32

Huffman-koding Huffman-koding Motivasjon Store tekstfiler tar stor plass, og tar lang tid å overføre over nettet Tidligere var ASCII og EBCDIC de rådende standardene Begge brukte 8-bits tegnkoder (ASCII brukte 7-bits kode + paritetsbit) Dette ble ansett som sløsing med plass Unicode bruker (stort sett) 8-bits koder, men 32-bits koder blir også brukt Unicode har 17 2 16 = 1 114 112 mulige tegn Selv i store tekstfiler blir bare noen få av disse brukt Unicode gir minst dobbelt så store filer som ASCII Konklusjon Det er behov for datakompresjon! (Ifi, UiO) INF2220 H2015, forelesning 11 4 / 32

Huffman-koding Idé og regler Hovedidé: Husk Morse Tegn som forekommer ofte korte koder, sjeldne tegn lange koder Regel 1: Hvert tegn som forekommer i filen, skal ha sin egen entydige kode Regel 2: Ingen kode er prefiks i en annen kode Eksempel på regel 2: Dersom 011001 er (binær)kode for et tegn, kan hverken 0, 01, 011, 0110 eller 01100 være kode for noe tegn (Ifi, UiO) INF2220 H2015, forelesning 11 5 / 32

Huffman-koding Idé og regler Hovedidé: Husk Morse Tegn som forekommer ofte korte koder, sjeldne tegn lange koder Regel 1: Hvert tegn som forekommer i filen, skal ha sin egen entydige kode Regel 2: Ingen kode er prefiks i en annen kode Eksempel på regel 2: Dersom 011001 er (binær)kode for et tegn, kan hverken 0, 01, 011, 0110 eller 01100 være kode for noe tegn (Ifi, UiO) INF2220 H2015, forelesning 11 5 / 32

Huffman-koding Idé og regler Hovedidé: Husk Morse Tegn som forekommer ofte korte koder, sjeldne tegn lange koder Regel 1: Hvert tegn som forekommer i filen, skal ha sin egen entydige kode Regel 2: Ingen kode er prefiks i en annen kode Eksempel på regel 2: Dersom 011001 er (binær)kode for et tegn, kan hverken 0, 01, 011, 0110 eller 01100 være kode for noe tegn (Ifi, UiO) INF2220 H2015, forelesning 11 5 / 32

Huffman-koding Algoritme Lag en frekvenstabell for alle tegn som forekommer i datafilen Betrakt hvert tegn som en node, og legg dem inn i en prioritetskø P med frekvensen som vekt Mens P har mer enn ett element Ta ut de to minste nodene fra P Gi dem en felles foreldrenode med vekt lik summen av de to nodenes vekter Legg foreldrenoden inn i P Huffmankoden til et tegn (bladnode) får vi ved å gå fra roten og gi en 0 når vi går til venstre og 1 når vi går til høyre Resultatfilen består av to deler: En tabell over Huffmankoder med tilhørende tegn Den Huffmankodede datafilen (Ifi, UiO) INF2220 H2015, forelesning 11 6 / 32

Huffman-koding Algoritme Lag en frekvenstabell for alle tegn som forekommer i datafilen Betrakt hvert tegn som en node, og legg dem inn i en prioritetskø P med frekvensen som vekt Mens P har mer enn ett element Ta ut de to minste nodene fra P Gi dem en felles foreldrenode med vekt lik summen av de to nodenes vekter Legg foreldrenoden inn i P Huffmankoden til et tegn (bladnode) får vi ved å gå fra roten og gi en 0 når vi går til venstre og 1 når vi går til høyre Resultatfilen består av to deler: En tabell over Huffmankoder med tilhørende tegn Den Huffmankodede datafilen (Ifi, UiO) INF2220 H2015, forelesning 11 6 / 32

Huffman-koding Algoritme Lag en frekvenstabell for alle tegn som forekommer i datafilen Betrakt hvert tegn som en node, og legg dem inn i en prioritetskø P med frekvensen som vekt Mens P har mer enn ett element Ta ut de to minste nodene fra P Gi dem en felles foreldrenode med vekt lik summen av de to nodenes vekter Legg foreldrenoden inn i P Huffmankoden til et tegn (bladnode) får vi ved å gå fra roten og gi en 0 når vi går til venstre og 1 når vi går til høyre Resultatfilen består av to deler: En tabell over Huffmankoder med tilhørende tegn Den Huffmankodede datafilen (Ifi, UiO) INF2220 H2015, forelesning 11 6 / 32

Huffman-koding Algoritme Lag en frekvenstabell for alle tegn som forekommer i datafilen Betrakt hvert tegn som en node, og legg dem inn i en prioritetskø P med frekvensen som vekt Mens P har mer enn ett element Ta ut de to minste nodene fra P Gi dem en felles foreldrenode med vekt lik summen av de to nodenes vekter Legg foreldrenoden inn i P Huffmankoden til et tegn (bladnode) får vi ved å gå fra roten og gi en 0 når vi går til venstre og 1 når vi går til høyre Resultatfilen består av to deler: En tabell over Huffmankoder med tilhørende tegn Den Huffmankodede datafilen (Ifi, UiO) INF2220 H2015, forelesning 11 6 / 32

Huffman-koding Eksempel Initiell prioritetskø: a 10 b 15 c 3 d 32 e 15 f 10 g 23 h 13 i 5 sp 23 (Ifi, UiO) INF2220 H2015, forelesning 11 7 / 32

Huffman-koding Bygging av treet De 2 minste (sjeldnest forekommende) nodene er c og i. Disse taes ut og erstattes med T 1 (vekt 8): a 10 b 15 d 32 e 15 T1 8 T 1 f 10 g 23 h 13 sp 23 c i Dernest erstattes T 1 og a med T 2 (vekt 18): b 15 d 32 e 15 T2 18 T 2 f 10 g 23 h 13 sp 23 T 1 a (Ifi, UiO) INF2220 H2015, forelesning 11 8 / 32

Huffman-koding Bygging av treet De 2 minste (sjeldnest forekommende) nodene er c og i. Disse taes ut og erstattes med T 1 (vekt 8): a 10 b 15 d 32 e 15 T1 8 T 1 f 10 g 23 h 13 sp 23 c i Dernest erstattes T 1 og a med T 2 (vekt 18): b 15 d 32 e 15 T2 18 T 2 f 10 g 23 h 13 sp 23 T 1 a (Ifi, UiO) INF2220 H2015, forelesning 11 8 / 32

Huffman-koding Så går f og h ut. De erstattes av T 3 (vekt 23): b 15 d 32 e 15 T2 18 T 3 g 23 sp 23 T3 23 f h Så erstattes b og e med T 4 (vekt 30): d 32 T2 18 T4 30 T 4 g 23 sp 23 T3 23 b e (Ifi, UiO) INF2220 H2015, forelesning 11 9 / 32

Huffman-koding Så går f og h ut. De erstattes av T 3 (vekt 23): b 15 d 32 e 15 T2 18 T 3 g 23 sp 23 T3 23 f h Så erstattes b og e med T 4 (vekt 30): d 32 T2 18 T4 30 T 4 g 23 sp 23 T3 23 b e (Ifi, UiO) INF2220 H2015, forelesning 11 9 / 32

Huffman-koding Dernest T 2 og g med T 5 (vekt 41): d 32 T4 30 T5 41 T 5 sp 23 T3 23 T 2 g Så byttes sp og T 3 ut med T 6 (vekt 46): d 32 T4 30 T5 41 T6 46 T 6 sp T 3 (Ifi, UiO) INF2220 H2015, forelesning 11 10 / 32

Huffman-koding Dernest T 2 og g med T 5 (vekt 41): d 32 T4 30 T5 41 T 5 sp 23 T3 23 T 2 g Så byttes sp og T 3 ut med T 6 (vekt 46): d 32 T4 30 T5 41 T6 46 T 6 sp T 3 (Ifi, UiO) INF2220 H2015, forelesning 11 10 / 32

Huffman-koding Så d og T 4 med T 7 (vekt 62): T5 41 T6 46 T7 62 T 7 d T 4 Så T 5 og T 6 med T 8 (vekt 87): T7 62 T8 87 T 8 T 5 T 6 Endelig taes T 7 og T 8 ut av køen. Disse blir barn av rotnoden T 9 : T9 149 T 9 T 7 T 8 (Ifi, UiO) INF2220 H2015, forelesning 11 11 / 32

Huffman-koding Så d og T 4 med T 7 (vekt 62): T5 41 T6 46 T7 62 T 7 d T 4 Så T 5 og T 6 med T 8 (vekt 87): T7 62 T8 87 T 8 T 5 T 6 Endelig taes T 7 og T 8 ut av køen. Disse blir barn av rotnoden T 9 : T9 149 T 9 T 7 T 8 (Ifi, UiO) INF2220 H2015, forelesning 11 11 / 32

Huffman-koding Så d og T 4 med T 7 (vekt 62): T5 41 T6 46 T7 62 T 7 d T 4 Så T 5 og T 6 med T 8 (vekt 87): T7 62 T8 87 T 8 T 5 T 6 Endelig taes T 7 og T 8 ut av køen. Disse blir barn av rotnoden T 9 : T9 149 T 9 T 7 T 8 (Ifi, UiO) INF2220 H2015, forelesning 11 11 / 32

Huffman-koding Det ferdige kodetreet T 9 T 7 d T 4 ser slik ut: Det gir denne kodetabellen: (venstre 0, høyre 1) a 1011 f 1110 b 010 g 100 c 10100 h 1111 d 00 i 10101 e 011 sp 110 b e T 8 T 5 T 6 g T 2 sp T 3 T 1 c i a f h (Ifi, UiO) INF2220 H2015, forelesning 11 12 / 32

Huffman-koding Det ferdige kodetreet T 9 T 7 d T 4 ser slik ut: Det gir denne kodetabellen: (venstre 0, høyre 1) a 1011 f 1110 b 010 g 100 c 10100 h 1111 d 00 i 10101 e 011 sp 110 b e T 8 T 5 T 6 g T 2 sp T 3 T 1 c i a f h (Ifi, UiO) INF2220 H2015, forelesning 11 12 / 32

Eksempel: har følgende Huffmankode: Huffman-koding caddie hadde bad i hagebed 10100101 10000101 01011110 11111011 00000111 10010101 10011010 10111011 11101110 00110100 1100 Vi brukte altså 84 bits på 26 tegn med dette 10-tegns alfabetet Dekodingstabell 00 d 10101 i 010 b 1011 a 011 e 110 sp 100 g 1110 f 10100 c 1111 h (Ifi, UiO) INF2220 H2015, forelesning 11 13 / 32

Eksempel: har følgende Huffmankode: Huffman-koding caddie hadde bad i hagebed 10100101 10000101 01011110 11111011 00000111 10010101 10011010 10111011 11101110 00110100 1100 Vi brukte altså 84 bits på 26 tegn med dette 10-tegns alfabetet Dekodingstabell 00 d 10101 i 010 b 1011 a 011 e 110 sp 100 g 1110 f 10100 c 1111 h (Ifi, UiO) INF2220 H2015, forelesning 11 13 / 32

Dynamisk programmering Dynamisk Programmering (Ifi, UiO) INF2220 H2015, forelesning 11 14 / 32

Dynamisk programmering F n = F n 1 + F n 2 (Ifi, UiO) INF2220 H2015, forelesning 11 15 / 32

Dynamisk programmering i n t f i b r ( i n t n ) { i f ( n<=1) r e t u r n 1 ; e l s e r e t u r n f i b r ( n 1) + f i b r ( n 2); } F(6) F(5) F(4) F(4) F(3) F(3) F(2) F(3) F(2) F(2) F(1) F(2) F(1) F(1) F(0) F(2) F(1) F(1) F(0) F(1) F(0) F(1) F(0) F(1) F(0) (Ifi, UiO) INF2220 H2015, forelesning 11 16 / 32

Dynamisk programmering Fibonacci Numbers by Dynamic Programming i n t f i b d p ( i n t n ) { i n t i ; i n t [ ] f = new i n t [ n+1] f [ 0 ] = 0 ; f [ 1 ] = 1 ; } f o r ( i n t i = 2 ; i <= n ; i ++) { f [ i ] = f [ i 1] + f [ i 2]; } r e t u r n f [ n ] ; (Ifi, UiO) INF2220 H2015, forelesning 11 17 / 32

Dynamisk programmering Dynamisk programmering Brukes først og fremst når vi ønsker optimale løsninger Må kunne dele det globale problemet i delproblemer Disse løses typisk ikke-rekursivt ved å lagre del-løsningene i en tabell En optimal løsning på det globale problemet må være en sammensetning av optimale løsninger på (noen av) delproblemene Vi skal se på ett eksempel: Floyds algoritme for å finne korteste vei alle-til-alle i en rettet graf (Ifi, UiO) INF2220 H2015, forelesning 11 18 / 32

Dynamisk programmering Dynamisk programmering Brukes først og fremst når vi ønsker optimale løsninger Må kunne dele det globale problemet i delproblemer Disse løses typisk ikke-rekursivt ved å lagre del-løsningene i en tabell En optimal løsning på det globale problemet må være en sammensetning av optimale løsninger på (noen av) delproblemene Vi skal se på ett eksempel: Floyds algoritme for å finne korteste vei alle-til-alle i en rettet graf (Ifi, UiO) INF2220 H2015, forelesning 11 18 / 32

Dynamisk programmering Floyds algoritme Korteste vei alle-til-alle (Floyd) Vi ønsker å beregne den korteste veien mellom ethvert par av noder i en rettet, vektet graf Grunnleggende idé Hvis det går en vei fra node i til node k med lengde ik, og en vei fra node k til node j med lengde kj, så går det en vei fra node i til node j med lengde ik + kj Floyds algoritme: Denne betraktningen gjentas systematisk for alle tripler i, k og j: Initielt: Avstanden fra node i til node j settes lik vekten på kanten fra i til j, uendelig hvis det ikke går noen kant fra i til j Trinn 0: Se etter forbedringer ved å velge node 0 som mellomnode Etter trinn k: Avstanden mellom to noder er den korteste veien som bare bruker nodene 0, 1,..., k som mellomnoder (Ifi, UiO) INF2220 H2015, forelesning 11 19 / 32

Dynamisk programmering Floyds algoritme Korteste vei alle-til-alle (Floyd) Vi ønsker å beregne den korteste veien mellom ethvert par av noder i en rettet, vektet graf Grunnleggende idé Hvis det går en vei fra node i til node k med lengde ik, og en vei fra node k til node j med lengde kj, så går det en vei fra node i til node j med lengde ik + kj Floyds algoritme: Denne betraktningen gjentas systematisk for alle tripler i, k og j: Initielt: Avstanden fra node i til node j settes lik vekten på kanten fra i til j, uendelig hvis det ikke går noen kant fra i til j Trinn 0: Se etter forbedringer ved å velge node 0 som mellomnode Etter trinn k: Avstanden mellom to noder er den korteste veien som bare bruker nodene 0, 1,..., k som mellomnoder (Ifi, UiO) INF2220 H2015, forelesning 11 19 / 32

Dynamisk programmering Floyds algoritme Korteste vei alle-til-alle (Floyd) Vi ønsker å beregne den korteste veien mellom ethvert par av noder i en rettet, vektet graf Grunnleggende idé Hvis det går en vei fra node i til node k med lengde ik, og en vei fra node k til node j med lengde kj, så går det en vei fra node i til node j med lengde ik + kj Floyds algoritme: Denne betraktningen gjentas systematisk for alle tripler i, k og j: Initielt: Avstanden fra node i til node j settes lik vekten på kanten fra i til j, uendelig hvis det ikke går noen kant fra i til j Trinn 0: Se etter forbedringer ved å velge node 0 som mellomnode Etter trinn k: Avstanden mellom to noder er den korteste veien som bare bruker nodene 0, 1,..., k som mellomnoder (Ifi, UiO) INF2220 H2015, forelesning 11 19 / 32

Dynamisk programmering Floyds algoritme 2 4 0 5 2 7 2 1 4 1 3 5 3 2 3 4 8 5 0 1 2 3 4 5 0 0 2 5 1 0 7 1 8 2 0 4 3 0 3 4 2 0 3 5 5 2 4 0 (Ifi, UiO) INF2220 H2015, forelesning 11 20 / 32

Dynamisk programmering Floyds algoritme 2 4 0 5 2 7 2 1 4 1 3 5 3 2 3 4 8 5 0 1 2 3 4 5 0 0 2 5 1 0 7 1 8 2 0 4 3 0 3 4 2 0 3 5 5 2 4 0 (Ifi, UiO) INF2220 H2015, forelesning 11 20 / 32

Dynamisk programmering Floyds algoritme 2 4 0 5 2 7 2 1 4 1 3 5 3 2 3 4 8 5 0 1 2 3 4 5 0 0 2 5 3 1 10 1 1 0 7 1 8 2 0 4 3 0 3 4 2 0 3 5 5 12 1 2 4 0 (Ifi, UiO) INF2220 H2015, forelesning 11 20 / 32

Dynamisk programmering Floyds algoritme 2 4 0 5 2 7 2 1 4 1 3 5 3 2 3 4 8 5 0 1 2 3 4 5 0 0 2 5 3 1 10 1 1 0 7 1 8 2 0 4 3 0 3 4 2 6 2 0 3 5 5 12 1 2 4 0 (Ifi, UiO) INF2220 H2015, forelesning 11 20 / 32

Dynamisk programmering Floyds algoritme 2 4 0 5 2 7 2 1 4 1 3 5 3 2 3 4 8 5 0 1 2 3 4 5 0 0 2 5 3 1 6 3 10 1 1 0 7 1 4 3 8 2 0 4 7 3 3 0 3 4 2 6 2 0 3 5 5 12 1 2 4 0 (Ifi, UiO) INF2220 H2015, forelesning 11 20 / 32

Dynamisk programmering Floyds algoritme 2 4 0 5 2 7 2 1 4 1 3 5 3 2 3 4 8 5 0 1 2 3 4 5 0 0 2 5 3 1 6 3 9 4 1 0 6 4 1 4 3 7 4 2 0 4 7 3 10 4 3 5 4 0 3 6 4 4 2 6 2 0 3 5 5 6 4 2 4 0 (Ifi, UiO) INF2220 H2015, forelesning 11 20 / 32

Dynamisk programmering Floyds algoritme 2 4 0 5 2 7 2 1 4 1 3 5 3 2 3 4 8 5 0 1 2 3 4 5 0 0 2 5 3 1 6 3 9 4 1 0 6 4 1 4 3 7 4 2 15 5 0 4 7 3 10 4 3 11 5 5 4 0 3 6 4 4 8 5 2 5 5 0 3 5 5 6 4 2 4 0 (Ifi, UiO) INF2220 H2015, forelesning 11 20 / 32

Dynamisk programmering Floyds algoritme Hvorfor virker Floyd? Floyd-invarianten: avstand[i][j] vil være lik lengden av den korteste veien fra node i til node j som har alle sine indre noder behandlet (Ifi, UiO) INF2220 H2015, forelesning 11 21 / 32

Dynamisk programmering Floyds algoritme p u b l i c s t a t i c v o i d k o r t e s t e V e i A l l e T i l A l l e ( i n t [ ] [ ] nabo, i n t [ ] [ ] avstand, i n t [ ] [ ] v e i ) { i n t n = a v s t a n d. l e n g t h ; // F o r u t s e t n i n g : a r r a y e n e e r // k v a d r a t i s k e med samme d i m e n s j o n // I n i t i a l i s e r i n g : f o r ( i n t i = 0 ; i < n ; i ++) { f o r ( i n t j = 0 ; j < n ; j ++) { a v s t a n d [ i ] [ j ] = nabo [ i ] [ j ] ; v e i [ i ] [ j ] = 1; // I n g e n v e i f o r e l ø p i g } } f o r ( i n t k = 0 ; k < n ; k++) { f o r ( i n t i = 0 ; i < n ; i ++) { f o r ( i n t j = 0 ; j < n ; j ++) { i f ( a v s t a n d [ i ] [ k ] + a v s t a n d [ k ] [ j ] < a v s t a n d [ i ] [ j ] ) { // K o r t e r e v e i f r a i t i l j f u n n e t v i a k a v s t a n d [ i ] [ j ] = a v s t a n d [ i ] [ k ] + a v s t a n d [ k ] [ j ] ; v e i [ i ] [ j ] = k ; }}}}} Tidsforbruket er åpenbart O(n 3 ) (Ifi, UiO) INF2220 H2015, forelesning 11 22 / 32

Dynamisk programmering Floyds algoritme p u b l i c s t a t i c v o i d k o r t e s t e V e i A l l e T i l A l l e ( i n t [ ] [ ] nabo, i n t [ ] [ ] avstand, i n t [ ] [ ] v e i ) { i n t n = a v s t a n d. l e n g t h ; // F o r u t s e t n i n g : a r r a y e n e e r // k v a d r a t i s k e med samme d i m e n s j o n // I n i t i a l i s e r i n g : f o r ( i n t i = 0 ; i < n ; i ++) { f o r ( i n t j = 0 ; j < n ; j ++) { a v s t a n d [ i ] [ j ] = nabo [ i ] [ j ] ; v e i [ i ] [ j ] = 1; // I n g e n v e i f o r e l ø p i g } } f o r ( i n t k = 0 ; k < n ; k++) { f o r ( i n t i = 0 ; i < n ; i ++) { f o r ( i n t j = 0 ; j < n ; j ++) { i f ( a v s t a n d [ i ] [ k ] + a v s t a n d [ k ] [ j ] < a v s t a n d [ i ] [ j ] ) { // K o r t e r e v e i f r a i t i l j f u n n e t v i a k a v s t a n d [ i ] [ j ] = a v s t a n d [ i ] [ k ] + a v s t a n d [ k ] [ j ] ; v e i [ i ] [ j ] = k ; }}}}} Tidsforbruket er åpenbart O(n 3 ) (Ifi, UiO) INF2220 H2015, forelesning 11 22 / 32

Dynamisk programmering Floyds algoritme Hvordan tolke resultatet av Floyd Ved start inneholder nabo[i][j] lengden av kanten fra i til j, hvis det ikke er noen kant Floyd lar nabo være uendret og legger resultatet i avstand og vei avstand[i][j] er lengden av korteste vei fra i til j, hvis det ikke er noen vei Når vi oppdager at den korteste veien fra i til j passerer gjennom en mellomnode k, setter vi vei[i][j] = k vei sier hva som er den korteste veien k 1 = vei[i][j] er den største verdi av k slik at k ligger på den korteste veien fra i til j k2 = vei[i][k 1 ] er den største verdi av k slik at k ligger på den korteste veien fra i til k 1 osv. Når vei[i][km ] = 1, er (i, k m ) den første kanten i korteste vei fra i til j (Ifi, UiO) INF2220 H2015, forelesning 11 23 / 32

Dynamisk programmering Floyds algoritme Hvordan tolke resultatet av Floyd Ved start inneholder nabo[i][j] lengden av kanten fra i til j, hvis det ikke er noen kant Floyd lar nabo være uendret og legger resultatet i avstand og vei avstand[i][j] er lengden av korteste vei fra i til j, hvis det ikke er noen vei Når vi oppdager at den korteste veien fra i til j passerer gjennom en mellomnode k, setter vi vei[i][j] = k vei sier hva som er den korteste veien k 1 = vei[i][j] er den største verdi av k slik at k ligger på den korteste veien fra i til j k2 = vei[i][k 1 ] er den største verdi av k slik at k ligger på den korteste veien fra i til k 1 osv. Når vei[i][km ] = 1, er (i, k m ) den første kanten i korteste vei fra i til j (Ifi, UiO) INF2220 H2015, forelesning 11 23 / 32

Dynamisk programmering Floyds algoritme Hvordan tolke resultatet av Floyd Ved start inneholder nabo[i][j] lengden av kanten fra i til j, hvis det ikke er noen kant Floyd lar nabo være uendret og legger resultatet i avstand og vei avstand[i][j] er lengden av korteste vei fra i til j, hvis det ikke er noen vei Når vi oppdager at den korteste veien fra i til j passerer gjennom en mellomnode k, setter vi vei[i][j] = k vei sier hva som er den korteste veien k 1 = vei[i][j] er den største verdi av k slik at k ligger på den korteste veien fra i til j k2 = vei[i][k 1 ] er den største verdi av k slik at k ligger på den korteste veien fra i til k 1 osv. Når vei[i][km ] = 1, er (i, k m ) den første kanten i korteste vei fra i til j (Ifi, UiO) INF2220 H2015, forelesning 11 23 / 32

Dynamisk programmering Floyds algoritme Den korteste veien fra i til j Hvis vei[i][j] = 1, passerer ikke den korteste veien gjennom noen mellomnoder og den korteste veien er (i, j) Ellers, vi rekursivt beregne den korteste veien fra i til vei[i][j] og den korteste veien fra vei[i][j] til j K o r t e s t e v e i ( i, j ){ i f ( v e i [ i ] [ j ] = 1) // en kant o u t p u t ( i, j ) ; e l s e { k o r t e s t e v e i ( i, v e i [ i ] [ j ] ) ; k o r t e s t e v e i ( v e i [ i ] [ j ], j ) ; } } (Ifi, UiO) INF2220 H2015, forelesning 11 24 / 32

Dynamisk programmering Floyds algoritme Hva gjør Floyd dynamisk? Hovedløkken i Floyd ser slik ut: f o r ( i n t k = 0 ; k < n ; k++) { f o r ( i n t i = 0 ; i < n ; i ++) { f o r ( i n t j = 0 ; j < n ; j ++) { i f ( a v s t a n d [ i ] [ k ] + a v s t a n d [ k ] [ j ] < a v s t a n d [ i ] [ j ] ) { // K o r t e r e v e i f r a i t i l j f u n n e t v i a k a v s t a n d [ i ] [ j ] = a v s t a n d [ i ] [ k ] + a v s t a n d [ k ] [ j ] ; v e i [ i ] [ j ] = k ; }}}} Algoritmeinvarianten forutsetter at i og j løkken fullføres før k verdien økes If-testen sikrer at for en gitt k kan hverken avstand[i][k] eller avstand[k][j] bli endret i i og j løkken Dermed er i og j løkkene uavhengige av hverandre og kan parallelliseres (de er uavhengige delproblemer) Dette er definisjonen på dynamisk programmering (Ifi, UiO) INF2220 H2015, forelesning 11 25 / 32

Dynamisk programmering Floyds algoritme Hva gjør Floyd dynamisk? Hovedløkken i Floyd ser slik ut: f o r ( i n t k = 0 ; k < n ; k++) { f o r ( i n t i = 0 ; i < n ; i ++) { f o r ( i n t j = 0 ; j < n ; j ++) { i f ( a v s t a n d [ i ] [ k ] + a v s t a n d [ k ] [ j ] < a v s t a n d [ i ] [ j ] ) { // K o r t e r e v e i f r a i t i l j f u n n e t v i a k a v s t a n d [ i ] [ j ] = a v s t a n d [ i ] [ k ] + a v s t a n d [ k ] [ j ] ; v e i [ i ] [ j ] = k ; }}}} Algoritmeinvarianten forutsetter at i og j løkken fullføres før k verdien økes If-testen sikrer at for en gitt k kan hverken avstand[i][k] eller avstand[k][j] bli endret i i og j løkken Dermed er i og j løkkene uavhengige av hverandre og kan parallelliseres (de er uavhengige delproblemer) Dette er definisjonen på dynamisk programmering (Ifi, UiO) INF2220 H2015, forelesning 11 25 / 32

Dynamisk programmering Floyds algoritme Hva gjør Floyd dynamisk? Hovedløkken i Floyd ser slik ut: f o r ( i n t k = 0 ; k < n ; k++) { f o r ( i n t i = 0 ; i < n ; i ++) { f o r ( i n t j = 0 ; j < n ; j ++) { i f ( a v s t a n d [ i ] [ k ] + a v s t a n d [ k ] [ j ] < a v s t a n d [ i ] [ j ] ) { // K o r t e r e v e i f r a i t i l j f u n n e t v i a k a v s t a n d [ i ] [ j ] = a v s t a n d [ i ] [ k ] + a v s t a n d [ k ] [ j ] ; v e i [ i ] [ j ] = k ; }}}} Algoritmeinvarianten forutsetter at i og j løkken fullføres før k verdien økes If-testen sikrer at for en gitt k kan hverken avstand[i][k] eller avstand[k][j] bli endret i i og j løkken Dermed er i og j løkkene uavhengige av hverandre og kan parallelliseres (de er uavhengige delproblemer) Dette er definisjonen på dynamisk programmering (Ifi, UiO) INF2220 H2015, forelesning 11 25 / 32

Paradigmer for algoritmedesign Paradigmer for algoritmedesign (Ifi, UiO) INF2220 H2015, forelesning 11 26 / 32

Paradigmer for algoritmedesign Paradigmer for algoritmedesign Her følger en oppsummering av tre viktige paradigmer for algoritmedesign som vi gjør bruk av i dette kurset: Splitt og hersk Grådige algoritmer Dynamisk programmering (Ifi, UiO) INF2220 H2015, forelesning 11 27 / 32

Paradigmer for algoritmedesign Splitt og hersk Dette er en generell metode som bruker rekursjon til å designe effektive algoritmer Den går ut på å dele et gitt problem opp i mindre delproblemer, og så rekursivt løse hvert delproblem Rekursjonen stoppes når problemet er så lite at løsningen er triviell Til slutt settes løsningen av delproblemene sammen til en løsning av det opprinnelige problemet Eksempler: Binærsøking Quick-sort Merge-sort (Ifi, UiO) INF2220 H2015, forelesning 11 28 / 32

Paradigmer for algoritmedesign Grådige algoritmer Dette er en metode som brukes på optimaliseringsproblemer Den går ut på å løse problemet ved å foreta en rekke valg I hvert trinn gjør vi det valget som i øyeblikket ser ut til å bringe oss nærmest mulig løsningen Merk: Metoden virker ikke alltid Vi sier at problemer metoden virker på, har grådighetsegenskapen : En rekke lokale optimaliseringer vil føre til et globalt optimum Eksempler: Dijkstras algoritme Prims algoritme Kruskals algoritme Huffman-koding (Ifi, UiO) INF2220 H2015, forelesning 11 29 / 32

Paradigmer for algoritmedesign Dynamisk programmering Dette er en annen metode som brukes på optimaliseringsproblemer Metoden er noe vanskeligere å forstå enn Splitt og hersk og Grådige algoritmer Metoden bør brukes på problemer som ser ut til å trenge eksponensiell eksekveringstid Dynamisk programmering gir alltid algoritmer som er polynomiske i tid, og disse algoritmene er vanligvis enkle å programmere For at metoden skal virke, må problemet ha en viss struktur som vi kan utnytte for å oppnå denne enkle løsningen (Ifi, UiO) INF2220 H2015, forelesning 11 30 / 32

Paradigmer for algoritmedesign Litt terminologi knyttet til dynamisk programmering: Enkle delproblemer: Det må finnes en måte å dele problemet opp i delproblemer som er enkle å beskrive Delproblem-optimalisering: En optimal løsning på det globale problemet må kunne settes sammen av optimale løsninger på delproblemene Overlapp av delproblemer: Optimale løsninger av urelaterte problemer kan inneholde felles delproblemer Eksempler: Floyds algoritme Beregning av lange matriseprodukter Lengste felles delsekvens (Ifi, UiO) INF2220 H2015, forelesning 11 31 / 32

Paradigmer for algoritmedesign Neste forelesning: 5. november Sortering (Ifi, UiO) INF2220 H2015, forelesning 11 32 / 32