Algoritmer, datastrukturer och komplexitet

Relevanta dokument
Dynamisk programmering

i=1 c i = B och c i = a i eller c i = b i för 1 i n. Beskriv och analysera en algoritm som löser detta problem med hjälp av dynamisk programmering.

Dynamisk programmering

Algoritmer, datastrukturer och komplexitet

Dekomposition och dynamisk programmering

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Tommy Färnqvist, IDA, Linköpings universitet

Algoritmer, datastrukturer och komplexitet

Föreläsning 5: Dynamisk programmering

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Tommy Färnqvist, IDA, Linköpings universitet

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Föreläsning 5: Giriga algoritmer. Kruskals och Prims algoritmer

Föreläsning 5: Giriga algoritmer. Kruskals och Prims algoritmer

Programkonstruktion och Datastrukturer

Föreläsningsanteckningar F6

Föreläsning 11. Giriga algoritmer

Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

Rekursion och induktion för algoritmkonstruktion

Övningsmästarprov 2 + några NP-reduktioner. Algoritmer, datastrukturer och komplexitet

Komplexitetsklasser och repetition

Föreläsning 13. Dynamisk programmering

Föreläsning 1: Dekomposition, giriga algoritmer och dynamisk programmering

Algoritmer, datastrukturer och komplexitet

Exempel: Förel Rekursion III Nr 14. Uno Holmer, Chalmers,

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Föreläsning 11. Giriga algoritmer

Föreläsning 12. Söndra och härska

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Tillämpad Programmering (ID1218) :00-13:00

Föreläsning 5: Grafer Del 1

ORDINARIE TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

Lösningar Datastrukturer TDA

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

Magnus Nielsen, IDA, Linköpings universitet

Föreläsning 12+13: Approximationsalgoritmer

Programmering II (ID1019) :00-11:00

Sökning och sortering

Asymptotisk komplexitetsanalys

Uppgift 1 (grundläggande konstruktioner)

Föreläsning 12. Söndra och härska

Föreläsning 4: Giriga algoritmer. Giriga algoritmer

Övningshäfte 2: Induktion och rekursion

ORDINARIE TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

Rekursion och induktion för algoritmkonstruktion

Föreläsning 7: Syntaxanalys

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

OMTENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:15 19:15

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 4 Om rekursion. PK1&PM1 HT-06 moment 4 Sida 1 Uppdaterad

Algoritmer, datastrukturer och komplexitet

Föreläsning 9: NP-fullständighet

Programmering för språkteknologer II, HT2014. Rum

kl Tentaupplägg

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 8 Datastrukturer (DAT037)

Optimering Kruskal s algoritm Prim-Jarník s algoritm

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Föreläsning 8 Datastrukturer (DAT037)

Tentamen Datastrukturer D DAT 035/INN960

Tentamen, Algoritmer och datastrukturer

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Summera godtyckligt antal tal. Programkonstruktion. Moment 4 Om rekursion. Fullständigt resonemang för summeringen. Analys av summeringsproblemet

Föreläsning 8 Innehåll

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 13. Dynamisk programmering

Tentamen i Grundläggande Programvaruutveckling, TDA548

Föreläsning 1. Introduktion. Vad är en algoritm?

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

n (log n) Division Analysera skolboksalgoritmen för division (trappdivision). Använd bitkostnad.

Tentamen Datastrukturer D DAT 035/INN960

Datastrukturer och algoritmer. Föreläsning 4 Test, Stack och Kö

Optimala koder. Övre gräns för optimala koder. Gränser. Övre gräns för optimala koder, forts.

Optimala koder. Det existerar förstås flera koder som har samma kodordsmedellängd. Enklaste fallet är att bara byta 0:or mot 1:or.

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

Dynamisk programmering. Dynamisk programmering. Dynamisk programmering. Dynamisk programmering

Tommy Färnqvist, IDA, Linköpings universitet. 2 Rekursion i C Implementation av rekursion Svansrekursion En till övning...

Rekursion och induktion för algoritmkonstruktion

Föreläsning Datastrukturer (DAT037)

Grafer MST Top. sortering Starkt samm. komponenter Kortaste avstånd. Grafalgoritmer 1. Douglas Wikström KTH Stockholm

Föreläsning Datastrukturer (DAT036)

Hur man programmerar. Exempel på problemlösning i Python

TDDI16: Datastrukturer och algoritmer

Rekursion. Rekursiv lösningsstrategi. Algoritmkonstruktion. Exempelproblem Hitta största elementet i en sekvens v i där i 1... n.

Föreläsning 5 Datastrukturer (DAT037)

I en matchning ligger varje hörn i högst en kant. I en stig ligger varje hörn i högst två kanter.

Transkript:

Algoritmer, datastrukturer och komplexitet Övning 4 Anton Grensjö grensjo@csc.kth.se 25 september 215 Anton Grensjö ADK Övning 4 25 september 215 1 / 28

Översikt Kursplanering F9: Dynamisk programmering Ö3: Dekomposition och DP F1: Dynamisk programmering F11: Korrekthet F12: Grafer: MST och Dijkstra Ö4: Dynamisk programmering F13: Grafer: Maximalt flöde Anton Grensjö ADK Övning 4 25 september 215 2 / 28

Idag Idag Mer om dynamisk programmering Inlämning och redovisning av labbteori 2 Anton Grensjö ADK Övning 4 25 september 215 3 / 28

Teorigenomgång Dynamisk programmering Vanliga användningsområden: Optimeringsproblem Kombinatorik (räkna antalet av något) Kan användas för problem som: Har optimala delstrukturer (dvs lösningen kan uttyckas rekursivt) Har överlappande delproblem Generell strategi: 1 Beskriv problemets lösning med en matematisk rekursion. För optimeringsproblem: hitta strukturen hos en optimal lösning, och uttryck det i en rekursion. 2 Konstruera basfall till rekursionen. 3 Hitta en lämplig beräkningsordning. Anton Grensjö ADK Övning 4 25 september 215 4 / 28

Uppgift 1: Träskvandring Uppgifter Tina ska gå från vänster till höger genom ett träsk, i form av ett n n-rutmönster. Tina kan ta steg rakt åt höger, eller snett uppåt/nedåt åt höger. Det är olika jobbigt att gå på olika ställen. Att hamna på ruta (i, j) kostar arbetet A[i][j] Z +. Beskriv en algoritm som hittar det minimala arbetet att ta sig igenom träsket, givet att: a) Tina får starta var som helst på vänsterkanten och sluta var som helst på högerkanten. Anton Grensjö ADK Övning 4 25 september 215 5 / 28

Uppgift 1: Träskvandring Uppgifter Kan vi dela in problemet i delproblem? Vad är den optimala vägen till ruta (i, j)? Måste bero av den optimala vägen till (i 1, j 1), (i, j 1) och (i + 1, j 1). Om vi känner till dessa, hur kan vi beräkna den optimala vägen till (i, j)? Varför är det lämpligt att använda DP? Det finns en optimal väg till varje ruta. Vägarna överlappar. Det finns inga cykler = det är möjligt att hitta en lämplig beräkningsordning. Anton Grensjö ADK Övning 4 25 september 215 6 / 28

Uppgift 1: Träskvandring Uppgifter Indata: träskstorleken n och kostnaden A[i, j] för att hamna på ruta (i, j). Låt W[i, j] beteckna det minimala arbetet för att ta sig till ruta (i, j). 1 Basfall W[i, 1] = A[i, 1], 1 i n 2 Rekursion om (i, j) ligger utanför träsket A[i, 1] om j = 1 W[i, j] = min (W[i 1, j 1], W[i, j 1], W[i + 1, j 1]) + A[i, j] annars 3 Beräkningsordning? Kolumnvis! T.ex. uppifrån och ner. Givet W, hur beräknar vi svaret? Anton Grensjö ADK Övning 4 25 september 215 7 / 28

Uppgift 1: Träskvandring Pseudokod för a) for j 1 to n W[1, j] = A[1, j] Uppgifter for j 2 to n for i 1 to n fromabove = W[i 1, j 1] if i > 1, else fromsame = W[i, j 1] frombelow = W[i + 1, j 1] if i < n, else W[i, j] = min(fromabove, fromsame, frombelow) + A[i, j] opt for i 1 to n if W[i, n] < opt then opt W[i, n] return opt Anton Grensjö ADK Övning 4 25 september 215 8 / 28

Uppgift 1: Träskvandring Uppgifter Beskriv en algoritm som hittar det minimala arbetet att ta sig igenom träsket, givet att: b) Tina startar alltid i rutan (n/2, 1) (men får sluta var som helst på högerkanten). Vad behöver ändras? Ändra basfallen! Låt W[n/2, 1] = A[n/2, 1], men W[i, 1] = för i n/2. Anton Grensjö ADK Övning 4 25 september 215 9 / 28

Uppgift 1: Träskvandring Uppgifter Beskriv en algoritm som hittar det minimala arbetet att ta sig igenom träsket, givet att: c) Tina startar alltid i rutan (n/2, 1) och slutar alltid i rutan (n/2, n). Vad behöver ändras? Tidigare beräknade vi svaret som det minsta av alla värden på högerkanten i W. Nu bryr vi oss bara om W[n/2, n]. Returnera denna. Anton Grensjö ADK Övning 4 25 september 215 1 / 28

Uppgift 1: Träskvandring Uppgifter d) Skriv ut den minst jobbiga väg Tina kan ta i c). Backtracking! Finns i detta fall två olika sätt. Den mest generella: Skapa en till matris med bakåtpekare, som för varje ruta säger vilken ruta man kom dit ifrån. När vi fyller i W[i, j] så kollar vi vilken ruta det är bäst att komma från och väljer den. Spara då samtidigt information om vilken vi valde. För att hitta vägen, börja från slutpositionen och följ pekarna tillbaka till startpositionen! Notera att det kan finnas flera optimala vägar, men det räcker att vi hittar en. Anton Grensjö ADK Övning 4 25 september 215 11 / 28

Uppgift 1: Träskvandring Uppgifter d) Skriv ut den minst jobbiga väg Tina kan ta i c). Backtracking! Finns i detta fall två olika metoder. Alternativt, i detta fall: Denna metod går också ut på att baklänges spåra vilken väg vi valde, men utan explicit lagrade pekare. Antag att vi är i ruta (i, j). Om vi kom från ruta (x, j 1) så måste W[x, j 1] = W[i, j] A[i, j], pga hur vår DP fungerar. Titta på de tre möjliga rutorna vi kan ha kommit från och kolla vilken som stämmer. Gå till den rutan och upprepa. Gör i övrigt samma som i den första metoden. Vi slipper spara explicita bakåtpekare eftersom vi enkelt kan räkna ut vilken ruta vi måste ha kommit från. Anton Grensjö ADK Övning 4 25 september 215 12 / 28

Uppgift 2: Kombinera mynt och sedlar Uppgift: Givet: en uppsättning mynt- och sedelslag med valörerna v 1,..., v k kronor, samt ett maximalt belopp n (allt positiva heltal). Formulera en rekursion som för varje heltal b, p n svarar på frågan På hur många sätt kan man bilda summan b kr med hjälp av denna mynt- och sedeluppsättning? Lösning: Vad ser ni för struktur? Delproblem? Vad ska vår dynprogmatris säga? N[b, j] - antalet sätt att bilda beloppet b med v 1,..., v j. Anton Grensjö ADK Övning 4 25 september 215 13 / 28

Uppgift 2: Kombinera mynt och sedlar Lösning N[b, j] - antalet sätt att bilda beloppet b med v 1,..., v j. Kan intuitivt se delproblem på två sätt: Vad händer för lägre summor (dvs lägre värden på b)? Vad händer om vi har färre valörer (dvs lägre värde på j)? Kan ni hitta en rekursiv tanke? Kom ihåg additionsprincipen från kombinatoriken. Antalet sätt att bilda summan b med de j första valörerna måste vara lika med summan av: Antalet sätt att bilda den med de j 1 första valörerna: N[b, j 1] Antalet sätt att bilda den med med de j 1 första valörerna och v j : b/v j i= N[b i v j, j 1] Anton Grensjö ADK Övning 4 25 september 215 14 / 28

Uppgift 2: Kombinera mynt och sedlar Lösning 1 Basfall: Vi kan bilda summan b = på precis 1 sätt: genom att inte använda några sedlar/mynt alls! N[, j] = 1. Om vi bara har en valör (j = 1) så kan summan b bildas om och endast om b mod v 1 =. 1 om b = 1 om j = 1 och b mod v 1 = N[b, j] = om j = 1 och b mod v 1 b/vj i= N[b i v j, j 1] om < b n Beräkningsordning? Radvis eller kolumnvis. Behöver vi spara hela matrisen? Anton Grensjö ADK Övning 4 25 september 215 15 / 28

Uppgift 2: Kombinera mynt och sedlar Lösning 2 På hur många sätt kan vi bilda beloppet b med hjälp av de j första valörerna? Dela in i två fall! Antingen använder vi inte v j, då är antalet sätt N[b, j 1]......eller så använder vi v j, då är antalet sätt N[b v j, j]. 1 om b = om j = och b > N[b, j] = N[b, j 1] om < b < v j och j > N[b v j, j] + N[b, j 1] om v j b n och j > Beräkningsordning? Kolumnvis. Behöver vi spara hela matrisen? Anton Grensjö ADK Övning 4 25 september 215 16 / 28

Uppgift 3: Längsta gemensamma delsträng Exempel Strängarna ALGORITM och PLÅGORIS har den gemensamma delsträngen GORI. Den längsta gemensamma delsträngen hos dessa strängar har alltså längd 4. Notera! I en delsträng måste tecknen ligga i en sammanhängande följd. Uppgift: Konstruera en effektiv algoritm som givet två strängar a 1 a 2 a m och b 1 b 2 b n beräknar den längden hos den längsta gemensamma delsträngen. Algoritmen ska använda DP och gå i tid O(nm). Anton Grensjö ADK Övning 4 25 september 215 17 / 28

Uppgift 3: Längsta gemensamma delsträng Vad kan vi hitta för delproblemstruktur? Vad ska vår dynprogmatris säga? Låt M[i, j] vara den längsta gemensamma delsträngen som slutar på position i och j i sträng a respektive b. Med andra ord: låt M[i, j] vara antalet bokstaver till vänster om (och inklusive) a i som överensstämmer med lika många bokstäver till vänster om (och inklusive) b j. Den längsta gemensamma delsträngen måste då vara det största talet i matrisen M. Basfall? Hur bör rekursionen se ut? om i = eller j =, M[i, j] = M[i 1, j 1] + 1 om a i = b j, annars Anton Grensjö ADK Övning 4 25 september 215 18 / 28

Uppgift 3: Längsta gemensamma delsträng om i = eller j =, M[i, j] = M[i 1, j 1] + 1 om a i = b j, annars Känns detta igen? Vi löste detta problem under förra övningen! Enda skillnaden är att vi nu vet att vi söker det största talet i M. Anton Grensjö ADK Övning 4 25 september 215 19 / 28

Uppgift 3: Längsta gemensamma delsträng Pseudokod Förra veckan: for j to n M[, j] for i 1 to m M[i, ] for j 1 to n if a i = b j then M[i, j] M[i 1, j 1] + 1 else M[i, j] return M Anton Grensjö ADK Övning 4 25 september 215 2 / 28

Uppgift 3: Längsta gemensamma delsträng Pseudokod Returnera endast det största talet: max for j to n M[, j] for i 1 to m M[i, ] for j 1 to n if a i = b j then M[i, j] M[i 1, j 1] + 1 if M[i, j] > max then max M[i, j] else M[i, j] return max Tidskomplexitet: Θ(nm). Testkör algoritmen på a = HACKER, b = ATTACK. Anton Grensjö ADK Övning 4 25 september 215 21 / 28

Uppgift 4: Proteinvikning Tillämpning inom bioinformatik. Ett protein är en lång kedja av aminosyror. Enligt vår förenklade modell kan en aminosyra vara antingen hydrofil eller hydrofob. Säg att proteinet ligger i någon vattenbaserad lösning. De hydrofoba aminosyrorna kommer då att klumpa ihop sig, för att få så lite kontakt med vattnet som möjligt. Vi vill räkna ut hur proteinet kommer vika sig. Indata: Ett protein i form av en binär sträng. Ettor motsvarar hydrofoba aminosyror, nollor motsvara hydrofila aminosyror. Anton Grensjö ADK Övning 4 25 september 215 22 / 28

Uppgift 4: Proteinvikning Strängen (proteinet) ska vikas i ett tvådimensionellt gitter/rutnät. Mål: maximera antalet ettor som ligger intill varandra i gittret (lodrätt eller vågrätt), utan att vara närliggande i strängen. Problem: Konstruera en optimal dragspelsvikning av en proteinsträng av längd n. Dragspelsvikning: en vikning så att strängen först går en sträcka rakt uppåt, sedan rakt nedåt, osv. 1 1 1 1 1 1 1 1 Anton Grensjö ADK Övning 4 25 september 215 23 / 28

Uppgift 4: Proteinvikning Givet: Antag att strängen lagras i p[1..n]. Följande algoritm beräknar vinstfunktionen för en delsträng p[a..c], om den viks vid p[b]. profit(a,b,c) = shortest min(b-a,c-(b+1)); s ; for i 1 to shortest do if p[b-i]=1 and p[b+1+i]=1 then s s+1; return s; a. c.... b b+1 Anton Grensjö ADK Övning 4 25 september 215 24 / 28

Uppgift 4: Proteinvikning INMATNING: En binär sträng med n tecken. PROBLEM: Hitta den dragspelsvikning av indatasträngen som ger det största värdet på målfunktionen, alltså det största antalet par av ettor som ligger bredvid varandra men inte direkt efter varandra i strängen. 1 Hitta delstrukturer! Vad ska vi låta ett element i vår dynprogmatris vara? 1 1 1 1 1 1 1 Anton Grensjö ADK Övning 4 25 september 215 25 / 28

Uppgift 4: Proteinvikning Låt q a,b vara det maximala värdet på målfunktionen man kan få för en vikning av suffixet p[a..n] av proteinet, givet att den första sträckan slutar i b. Rekursion: q a,b = max b+1<c n (profit(a, b, c) + q b+1,c). Basfall? Om vi inte viker någonstans måste viktfunktionen bli : q a,n = för 1 a < n. Svaret: max 1<b n q 1,b Beräkningsordning? Anton Grensjö ADK Övning 4 25 september 215 26 / 28

Uppgift 4: Pseudokod for a 1 to n-1 do q[a,n] ; for b n-1 downto 2 do for a 1 to b-1 do t -1; for c b+2 to n do v profit(a,b,c)+q[b+1,c]; if v>t then t v; q[a,b] t; max ; for b 2 to n do if q[1,b]>max then max q[1,b]; return max; Tre nästlade for-slingor. Anrop till profit tar O(n) tid. Tidskomplexitet: O(n 4 ). Anton Grensjö ADK Övning 4 25 september 215 27 / 28

Nästa vecka Nästa vecka Grafalgoritmer Minsta spännande träd Maximalt flöde (viktigt inför labb 3) Hitta Eulercykel Bipartit matchning (också bra inför labb 3) Undre gränser Mina slides finns numera att hitta under Kursinnehåll/Övningsanteckningar på kurshemsidan. Anton Grensjö ADK Övning 4 25 september 215 28 / 28