INF Algoritmer og datastrukturer

Like dokumenter
INF Algoritmer og datastrukturer

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

IN Algoritmer og datastrukturer

INF1020 Algoritmer og datastrukturer GRAFER

INF Algoritmer og datastrukturer

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

Grafalgoritmer: Korteste vei

INF Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

Notater til INF2220 Eksamen

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Live life and be merry

Pensum: fra boken (H-03)+ forelesninger

INF Algoritmer og datastrukturer

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

Vi skal se på grafalgoritmer for:

Løsningsforslag for eksamen i fag SIF8010 Algoritmer og Datastrukturer Tirsdag 18. Desember 2000, kl

Pensum: fra boken (H-03)+ forelesninger

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

INF Algoritmer og datastrukturer

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

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

Korteste vei i en vektet graf uten negative kanter

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:

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

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

INF1020 Algoritmer og datastrukturer GRAFER

Øvingsforelesning Korteste vei: Alle til alle

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

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Dynamisk programmering

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

UNIVERSITETET I OSLO

Live life and be merry

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

MAT1030 Diskret Matematikk

Algdat - øvingsforelesning

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

Rettede, ikke-sykliske grafer (DAG)

UNIVERSITETET I OSLO

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

IN Algoritmer og datastrukturer

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

Grunnleggende Grafteori

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

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

Algdat-ninja på 60 minutter: Et galskapsprosjekt. Magnus Lie Hetland

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

INF1020 Algoritmer og datastrukturer GRAFER

All good things. Fjortende forelesning

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Studentnummer: Side 1 av 1. Løsningsforslag, Eksamen i TDT4120 Algoritmer og datastrukturer August 2005

MAT1030 Forelesning 25

Rekursiv programmering

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

ALGORITMER OG DATASTRUKTURER

ALGORITMER OG DATASTRUKTURER

Eksamen i fag SIF8010 Algoritmer og datastrukturer Lørdag 9. august 2003, kl

Korteste vei problemet (seksjon 15.3)

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF Algoritmer og datastrukturer

UNIVERSITETET I OSLO

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Live life and be merry

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Anvendelser av grafer

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

Oppgave 1. Sekvenser (20%)

Algdat Eksamensforelesning. Nils Barlaug

Choices, choices. Tiende forelesning. Dynamisk programmering: En serie med valg der valgmulighetene er avhengige av hva vi har valgt før.

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

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

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

UNIVERSITETET I OSLO

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

ALGORITMER OG DATASTRUKTURER

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

IN Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Kodegenerering, del 2: Resten av Kap. 8 pluss tilleggsnotat (fra kap. 9 i ASU ) INF5110 V2007

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

Grunnleggende Grafalgoritmer

IN 115 Fasitforslag til Eksamen 1997 Omskrevet til Java. 1. april 2000

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

UNIVERSITETET I OSLO

Dynamisk programmering

LO118D Forelesning 2 (DM)

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

MAT1030 Forelesning 25

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

INF Algoritmer og datastrukturer

MAT1030 Forelesning 28

Eksamen i tdt4120 Algoritmer og datastrukturer

Transkript:

INF2220 - Algoritmer og datastrukturer Institutt for informatikk, Universitetet i Oslo INF2220, forelesning 13: Dynamisk programmering (Ifi, UiO) INF2220 H2017, forelesning 13 1 / 30

Dagens plan Dynamisk programmering Floyds algoritme for korteste vei alle-til-alle Paradigmer for algoritmedesign (Ifi, UiO) INF2220 H2017, forelesning 13 2 / 30

Dynamisk programmering Dynamisk Programmering (Ifi, UiO) INF2220 H2017, forelesning 13 3 / 30

Dynamisk programmering F n = F n 1 + F n 2 (Ifi, UiO) INF2220 H2017, forelesning 13 4 / 30

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 H2017, forelesning 13 5 / 30

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 H2017, forelesning 13 6 / 30

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 H2017, forelesning 13 7 / 30

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 1: Se etter forbedringer ved å velge node 1 som mellomnode Etter trinn k: Avstanden mellom to noder er den korteste veien som bare bruker nodene 1,..., k som mellomnoder (Ifi, UiO) INF2220 H2017, forelesning 13 8 / 30

Dynamisk programmering Floyds algoritme Optimal substruktur V = {1, 2,..., n} V (k) = {1, 2,..., k} representerer de første k nodene Fastsette en startnode (source) i V, en destinasjonsnode j V og en k {1, 2,..., n}. P = korteste i j vei der alle indre nodene er i V (k) k begrenser hvilke noder vi kan velge for en gitt sub-problem. (Ifi, UiO) INF2220 H2017, forelesning 13 9 / 30

Dynamisk programmering Floyds algoritme [i = 17, j=10, k=5] Hva er P? (Ifi, UiO) INF2220 H2017, forelesning 13 10 / 30

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 2 4 (Ifi, UiO) 2 INF2220 3 H2017, forelesning 13 11 / 30

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 H2017, forelesning 13 12 / 30

Dynamisk programmering Floyds algoritme Hva vet vi om P? 1. Hvis node k ikke er en indre node i P: P er korteste vei der alle interne noder er i V (k 1). 2. Hvis node k er en indre node i P: P 1 = korteste i k vei der alle interne noder er i V (k 1). P 2 = korteste k j vei der alle interne noder er i V (k 1). Når vi gjør beregninger for k, vet vi at alle beregninger for k 1 er ferdige. Trenger array av 3 dimensjoner (startnode, dest. node, prefix): A[i,j,0] = 0 hvis i=j A[i,j,0] = C ij hvis (i, j) er en kant i grafen A[i,j,0] = ellers A[i,j,k] = min(a[i,j,k-1], A[i,k,k-1]+ A[k,j,k-1]) (Ifi, UiO) INF2220 H2017, forelesning 13 13 / 30

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 H2017, forelesning 13 14 / 30

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 k1 = vei[i ][j] er den største verdi av k slik at k ligger på den korteste veien fra i til j k 2 = 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 H2017, forelesning 13 15 / 30

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 H2017, forelesning 13 16 / 30

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) (Ifi, UiO) INF2220 H2017, forelesning 13 17 / 30

Paradigmer for algoritmedesign Paradigmer for algoritmedesign (Ifi, UiO) INF2220 H2017, forelesning 13 18 / 30

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 H2017, forelesning 13 19 / 30

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 H2017, forelesning 13 20 / 30

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 H2017, forelesning 13 21 / 30

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 H2017, forelesning 13 22 / 30

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 H2017, forelesning 13 23 / 30

Paradigmer for algoritmedesign Gitt en line graph G=(V,E) med vekt på nodene: Problem: Å finne IS med maximal totalvekt. (Ifi, UiO) INF2220 H2017, forelesning 13 24 / 30

Paradigmer for algoritmedesign DP Første steg: Hvordan ser den optimale løsningen ut? Tenk på strukturen av den optimale løsningen (i form av optimale sub-løsninger). (Ifi, UiO) INF2220 H2017, forelesning 13 25 / 30

Paradigmer for algoritmedesign La S være løsningen. Dvs max-wt IS av G og V n er den siste noden i G Case 1: V n / S S er max-wt IS av G, der G er G uten V n Case 2: V n S Vn 1 kan ikke være i S S {Vn } er max-wt IS av G, der G er G uten V n 1 og V n Ide: Prøv begge mulighetene og returnerer den beste Forslag algo. 1: rekursivt beregner S1 = max-wt IS av G S 2 = max-wt IS av G returnerer S 1 eller S 2 {V n } Hmmmm...fornøyd? Tidskompleksitet? (Ifi, UiO) INF2220 H2017, forelesning 13 26 / 30

Paradigmer for algoritmedesign Enda bedre Bruk en array A, der A[ i ] = verdien av max-wt IS av G i A[ 0 ] = 0 A[ 1 ] = w 1 For i = 2, 3,..., n: A[ i ] = max(a[ i-1 ], A[ i-2 ] + w i ) Tidskompleksitet? (Ifi, UiO) INF2220 H2017, forelesning 13 27 / 30

Paradigmer for algoritmedesign Super fast! O(n) (Ifi, UiO) INF2220 H2017, forelesning 13 28 / 30

Paradigmer for algoritmedesign Neste forelesning: 23. november Repetisjon (Ifi, UiO) INF2220 H2017, forelesning 13 29 / 30

Paradigmer for algoritmedesign Lykke til med eksamen! (Ifi, UiO) INF2220 H2017, forelesning 13 30 / 30