Algdat - øvingsforelesning

Like dokumenter
Algdat Eksamensforelesning. Nils Barlaug

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

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

Algdat - øvingsforelesning

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

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

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

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

Live life and be merry

Øvingsforelesning Korteste vei: Alle til alle

ALGORITMER OG DATASTRUKTURER

INF Algoritmer og datastrukturer

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

IN Algoritmer og datastrukturer

ALGORITMER OG DATASTRUKTURER

Live life and be merry

Dynamisk programmering Undervises av Stein Krogdahl

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

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

Dynamisk programmering

Dynamisk programmering

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

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

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Divide-and-Conquer. Lars Vidar Magnusson

All good things. Fjortende forelesning

Øvingsforelesning 12 Maks flyt

Algdat - Øvingsforelesning. Maks flyt

INF Algoritmer og datastrukturer

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Eksamen i tdt4120 Algoritmer og datastrukturer

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

Teoriøving 7 + litt om Ford-Fulkerson. Magnus Lie Hetland

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

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

Introduksjon til Algoritmeanalyse

Side om side. Trettende forelesning

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

Live life and be merry

Øvingsforelesning i Python (TDT4110)

LO118D Forelesning 2 (DM)

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

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

SIF8010 ALGORITMER OG DATASTRUKTURER

Øvingsforelesning 3: Splitt og hersk. Daniel Solberg

Kondisjonstest. Algoritmer og datastrukturer. Python-oppgaver - LF. Onsdag 6. oktober Her er noen repetisjonsoppgaver i Python.

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Algdat Oppsummering, eksamen-ting. Jim Frode Hoff

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

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Agenda. 1 Sortering, heap og select. 2 Binære trær. 3 Grafer, BFS og DFS. 4 Spenntrær og Korteste vei. 5 Maks flyt. 6 Dynamisk programmering

Om Kurset og Analyse av Algoritmer

ALGORITMER OG DATASTRUKTURER

ALGORITMER OG DATASTRUKTURER

Grunnleggende Grafteori

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

KONTINUASJONSEKSAMEN I FAG ALGORITMER OG DATASTRUKTURER

ALGORITMER OG DATASTRUKTURER

LO118D Forelesning 12 (DM)

Rundt og rundt og. Trettende forelesning

Spenntrær, oppsummert: Kruskal: Traverserer ikke. Plukker kanter i hytt og vær Prim: Legger alltid til den noden som er nærmest treet

A new study has found that cockroaches are morons in the morning and geniuses in the evening in terms of their learning capacity.

Alg. Dat. Øvingsforelesning 3. Grafer, BFS, DFS og hashing. Børge Rødsjø

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2016

INF1020 Algoritmer og datastrukturer GRAFER

Øvingsforelesning 4. Topologisk sortering, Strongly Connected Components og Minimale spenntrær. Magnus Botnan

Øvingsforelesning 1 Python (TDT4110)

INF 4130 Oppgavesett 3, 20/ m/løsningsforslag

Obligatorisk oppgave 1 i INF 4130, høsten 2008

Fra A til B. Syvende forelesning

Hash-funksjoner. Introduksjon. Steg 1: Strekkoder. Eksempel. Skrevet av: Martin Strand

Finne ut om en løsning er helt riktig og korrigere ved behov

Rekursiv programmering

Repetisjon og mer motivasjon. MAT1030 Diskret matematikk. Repetisjon og mer motivasjon

Skrevet av: Oversatt fra microbit-micropython.readthedocs.io (

AlgDat - Øvingsforelesning 1 Introduksjon til Python, lenkede lister og øving 1

Øvingsforelesning 5 Python (TDT4110)

Innhold. Innledning 1

Norsk informatikkolympiade runde

Magnus Moan (Undertegnede) Enkle datastrukturer, trær, traversering og rekursjon

MAT Oblig 1. Halvard Sutterud. 22. september 2016

INF2810: Funksjonell programmering: Mer om Scheme. Rekursjon og iterasjon.

Vi skal se på grafalgoritmer for:

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering

Øvingsforelesning 2 - TDT4120. Grafer og hashing. Benjamin Bjørnseth

Pensum: fra boken (H-03)+ forelesninger

Pensum: 3. utg av Cormen et al. Øvingstime: I morgen, 14:15

Først må vi få datamaskinen til å velge et tilfeldig ord, så la oss begynne. Lagre programmet ditt og kjør det. Hvilket ord skrives ut?

Søking i strenger. Prefiks-søking Naiv algoritme Knuth-Morris-Pratt-algoritmen Suffiks-søking Boyer-Moore-algoritmen Hash-basert Karp-Rabin-algoritmen

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

Norsk informatikkolympiade runde

Øvingsforelesning 5 Python (TDT4110)

Pensum: fra boken (H-03)+ forelesninger

Kanter, kanter, mange mangekanter. Introduksjon: Steg 1: Enkle firkanter. Sjekkliste. Skrevet av: Sigmund Hansen

I dag skal vi ved hjelp av ganske enkel Python-kode finne ut om det er mulig å tjene penger på å selge og kjøpe en aksje.

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Finne ut om en løsning er helt riktig og korrigere ved behov

All good things. Fjortende forelesning

Transkript:

Algdat - øvingsforelesning Dynamisk programmering Nils Barlaug

Dagens plan 1. 2. 3. 4. Praktisk og dagens plan LF øving 8 a. Teori b. Praksis Dynamisk programmering a. Introduksjon b. Rod Cutting c. Matrise-multiplikasjon d. LIS e. LCS Tips til øving 10 Det blir Kahoot!, så følg med og ha klar en enhet du kan delta med! For presentasjoner med mer tekst og forklaringer se tidligere års utmerkede presentasjoner

Teori 8 - Floyd Warshall

Praksis 8 - Mumien

Dynamisk Programmering - motivasjon Fibonacci-tall 0 1 1 2 3 5 8 13 21 34...

Fibonacci def fib(n): if n == 0: return 0 elif n == 1: return 1 else: return fib(n-1) + fib(n-2) La oss prøve å kjøre den på noen n er! Det er jo kjempetregt! po s k E ell i t n ne! d i t e kjør fib(5)

Forbedre Fibonacci Vi må utnytte de overlappende delproblemene 3 i <! d et r ø j k r æ e n i L La oss prøvekjøre vidunderet! fib(5)

Enda bedre? 0 1 1 2 3 5 8 13 Også lineær kjøretid <3 La oss prøvekjøre denne

Dynamisk programmering Naiv (dum) løsning: Lett, men eksponentiell tid Memoisering Lineær tid Bottom up Lineær tid Problemer som består av delproblemer Delproblemene overlapper (brukes flere ganger) Som regel er vi interessert i optimaliseringsproblemer La oss se på et

Rod Cutting 9 + 10 + 1 = 20 Optimal substruktur 1 $1 2 $5 3 $8 4 $9 5 $10 6 $17 7 $17 8 $20 9 $24 10 $30

Rod Cutting rn: maks avkastning for stang av lengde n pn: prisen for en stang av lengde n rn = max(pn, r1+rn-1, r2+rn-2,, rn-2+r2, rn-1+r1) 1 $1 2 $5 3 $8 4 $9 5 $10 6 $17 7 $17 8 $20 9 $24 10 $30

Rod Cutting 1 $1 2 $5 3 $8 4 $9 5 $10 6 $17 7 $17 Eksponentiell kjøretid :-( 8 $20 Men vi kan memoisere :-) 9 $24 Hva blir kjøretiden da? 10 $30 rn: maks avkastning for stang av lengde n pn: prisen for en stang av lengde n CUT-ROD(p,n) if n == 0 return 0 q = - for i = 1 to n q = max(q, p[i] + CUT-ROD(p, n-i)) return q

Rod Cutting rn: maks avkastning for stang av lengde n pn: prisen for en stang av lengde n Hva hvis vi skal bygge løsningen nedenfra og opp? La oss prøve å gjøre det 1 $1 2 $5 3 $8 4 $9 5 $10 6 $17 7 $17 8 $20 i 0 1 2 3 4 5 6 7 8 9 10 9 $24 r[i] 0 1 5 8 10 13 17 18 22 25 30 10 $30

Rod Cutting 1 $1 2 $5 3 $8 4 $9 5 $10 6 $17 Hva blir kjøretiden? 7 $17 Θ(n2) Akkurat som memoisering 8 $20 9 $24 10 $30 rn: maks avkastning for stang av lengde n pn: prisen for en stang av lengde n BOTTOM-UP-CUT-ROD(p, n) let r[0..n] be a new array r[0] = 0 for j = 1 to n q = - for i = 1 to j q = max(q, p[i] + r[j - i]) r[j] = q return r[n]

Hva skjedde nå? Delproblem-grafen Problemet vårt hadde optimal substruktur Problemet hadde overlappende delproblemer Vi sørget for å løse et delproblem kun én gang, og effektivt byttet lagringsplass mot bedre kjøretid Vi behandlet problemene i omvendt topologisk rekkefølge

Abstraksjon Vi må ha: Optimal substruktur Overlappende delproblemer

DP-algoritmer dere kjenner fra før DAG Shortest Path Floyd-Warshall Bellman-Ford

Obs! For å ha optimal delstruktur må delproblemene være uavhengige! Lengste enkle sti q r t For å ha optimal delstruktur må q r og r t være lengste stier også Det er de ikke! Delproblemene er ikke uavhengige

Så hvordan går vi fram? 1. 2. 3. 4. Beskriv/karakteriser strukturen til en optimal løsning (definer problem-parametere og finn delproblem-dag en) Definer rekursivt verdien til en optimal løsning Regn ut verdien til en optimal løsning (og husk valgene du gjør) Bygg opp en optimal løsning basert på beregnet informasjon

Kahoot!

Matrise-multiplikasjon A1A2...An-1An Å multiplisere en a*b-matrise med en b*c-matrise krever a*b*c antall multiplikasjoner. Ai er en pi-1*pi-matrise. Hvordan kan vi sette parenteser på uttrykket slik at vi ender opp med færrest mulig multiplikasjoner totalt? Det blir for mye å sjekke alle muligheter!

Matrise-multiplikasjon - strukturen Hvilke delproblemer skal vi velge? La Ai..j være AiAi+1...Aj. Delproblemet er hvordan vi skal sette parenteser på Ai..j. Når du har en sekvens Ai..j må du velge en k for å splitte opp parenteser slik at du får: (Ai..k)(Ak+1..j) Da har vi delt opp delproblemet i to subdelproblemer av samme type! For å få den optimale oppdelingen av Ai..j må vi dele opp subproblemene optimalt også. Hvorfor det? Cut and paste. Houston, vi har et problem med optimal substruktur! Har vi overlappende delproblemer også? Ja :-)

Matrise-multiplikasjon - rekursiv definisjon La m[i, j] være multiplikasjonskostnaden for Ai..j.

Matrise-multiplikasjon - finne en optimal verdi

Matrise-multiplikasjon matrise A1 A2 A3 A4 dimensjon 30 x 35 35 x 15 15 x 5 5 x 10 A5 10 x 20 En optimal løsning: (A1(A2A3))((A4A5)A6) Kjøretid? O(n3) A6 20 x 25

Lengste stigende subsekvens Eksempel: Si 1 2 9 3 8 5 7 i 1 2 3 4 5 6 7 Prøve alle muligheter blir eksponentielt Struktur: La Li være lengste stigende subsekvens av S0..i som slutter på Si Substrukturen er optimal

Kjøretid? Θ(n2) Lengste stigende subsekvens Eksempel: Si 1 2 9 3 8 5 7 i 1 2 3 4 5 6 7 La l[i] være lengden på lengste subsekvens av S0..i som slutter på Si. Rekursiv definisjon: La oss prøve å finne verdi på en optimal løsning og bygge opp en optimal løsning på tavla

Lengste felles subsekvens (LCS)

Lengste felles subsekvens (LCS) 1. xm = y n Zk-1 er en LCS av Xm-1 og Yn-1 zk xm Zk er en LCS av Xm-1 og Yn zk yn Zk er en LCS av Xm og Yn-1 zk = xm = yn 2. xm y n To sekvenser X = x1x2...xm Y = y1y2...yn La Z = z1z2...zk være en LCS Xi = x1x2...xi, Yi = y1y2...yi, Zi = z1z2...zi

Lengste felles subsekvens (LCS) Hvordan kan vi bygge opp løsningen? La oss prøve X = ABCBDAB Y = BDCABA To sekvenser X = x1x2...xm Y = y1y2...yn La Z = z1z2...zk være en LCS Xi = x1x2...xi, Yi = y1y2...yi, Zi = z1z2...zi

Lengste felles subsekvens (LCS) To sekvenser X = x1x2...xm Y = y1y2...yn Kjøretid? Θ(nm) La Z = z1z2...zk være en LCS Xi = x1x2...xi, Yi = y1y2...yi, Zi = z1z2...zi

Kahoot!

Eksempel: Praksisøving 10 - MsAlgoFan på ferie from sys import stdin, maxint def korteste_rute(rekkefolge, nabomatrise, byer): # SKRIV DIN KODE HER testcases = int(stdin.readline()) for test in range(testcases): byer = int(stdin.readline()) rekkefolge = [int(by) for by in stdin.readline().split()] nabomatrise = [] for by in range(byer): # SKRIV DIN KODE HER print korteste_rute(rekkefolge, nabomatrise, byer) Input: 2 3 021 012 101 130 2 01 0-1 10 Output: 5 umulig Første testcase byer = 3 rekkefolge = [0, 2, 1] Andre testcase byer = 2 rekkefolge = [0, 1] nabomatrise må du lese inn selv!

Spørsmål?