Tommy Färnqvist, IDA, Linköpings universitet

Relevanta dokument
Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 5: Dynamisk programmering

Algoritmer, datastrukturer och komplexitet

Tommy Färnqvist, IDA, Linköpings universitet

Dekomposition och dynamisk programmering

Magnus Nielsen, IDA, Linköpings universitet

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

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

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.

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

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

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.

Algoritmer, datastrukturer och komplexitet

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

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

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

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

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

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

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.

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

Föreläsning 13. Dynamisk programmering

Algoritmer, datastrukturer och komplexitet

Föreläsning 11. Giriga algoritmer

Föreläsning 5 Innehåll

FÖRELÄSNING 2, TDDC74, VT2018 BEGREPP PROBLEMLÖSNING MED HJÄLP AV FALLANALYS PROBLEMLÖSNING MED HJÄLP AV REKURSION

Algoritmer, datastrukturer och komplexitet

Föreläsning 4 Datastrukturer (DAT037)

Rekursion och induktion för algoritmkonstruktion

Föreläsning 3: Dekomposition. Dekomposition

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

Dynamisk programmering

Föreläsning 4 Datastrukturer (DAT037)

BEGREPP HITTILLS FÖRELÄSNING 2 SAMMANSATTA UTTRYCK - SCHEME DATORSPRÅK

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

Föreläsning 12+13: Approximationsalgoritmer

Föreläsning 5: Grafer Del 1

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

Föreläsning 5 Innehåll. Val av algoritm och datastruktur. Analys av algoritmer. Tidsåtgång och problemets storlek

Föreläsning 8 Innehåll

Föreläsningsanteckningar F6

Dynamisk programmering

Föreläsning Datastrukturer (DAT036)

Algoritmer, datastrukturer och komplexitet

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

Rekursion och induktion för algoritmkonstruktion

Algoritmer, datastrukturer och komplexitet

Tentamen TEN1 HI

Föreläsning 6: Introduktion av listor

Sökning och sortering

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

Föreläsning Datastrukturer (DAT037)

Tentamen: Programutveckling ht 2015

Giriga algoritmer och dynamisk programmering

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Lösning av några vanliga rekurrensekvationer

Föreläsning Datastrukturer (DAT036)

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

Föreläsning 11 Datastrukturer (DAT037)

Algoritmer, datastrukturer och komplexitet

Föreläsning Datastrukturer (DAT037)

Metodanrop - primitiva typer. Föreläsning 4. Metodanrop - referenstyper. Metodanrop - primitiva typer

Lösningsförslag för tentamen i Datastrukturer (DAT036) från

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python TDDE24 Funktionell och imperativ programmering del 2

Medan ni väntar. 2. Skriv metoden. 3. Skriv metoden. Naturligtvis rekursivt och utan användning av Javas standardmetoder.

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 2 Datastrukturer (DAT037)

Programkonstruktion och Datastrukturer

Föreläsning 6 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

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

Datastrukturer och algoritmer

Föreläsning 11. Giriga algoritmer

Föreläsning 13. Dynamisk programmering

Föreläsning Datastrukturer (DAT037)

Tentamen i Grundläggande Programvaruutveckling, TDA548

Föreläsning 13 Innehåll

Rekursion och induktion för algoritmkonstruktion

F11 - Rekursion. ID1004 Objektorienterad programmering Fredrik Kilander

Datastrukturer och algoritmer

Algoritmer och datastrukturer TDA143

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 7+8: NP-problem. Begreppet effektiv algoritm är alltså synonymt med går i polynomisk tid i den här kursen. Är detta en rimlig uppdelning?

Algoritmer och effektivitet. Föreläsning 5 Innehåll. Analys av algoritmer. Analys av algoritmer Tidskomplexitet. Algoritmer och effektivitet

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

Föreläsning 8 Datastrukturer (DAT037)

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

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

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Föreläsning 8+9: NP-problem. Begreppet effektiv algoritm är alltså synonymt med går i polynomisk tid i den här kursen. Är detta en rimlig uppdelning?

Föreläsning 5 Datastrukturer (DAT037)

Föreläsning 7 Datastrukturer (DAT037)

Datastrukturer. föreläsning 2

Föreläsning 6 Datastrukturer (DAT037)

Procedurer och villkor. Rekursiva procedurer. Exempel: n-fakultet

Rekursion. Koffman & Wolfgang kapitel 5

Transkript:

Föreläsning Metoder för algoritmdesign TDDD86: DALP Utskriftsversion av föreläsning i Datastrukturer, algoritmer och programmeringsparadigm 7 december 015 Tommy Färnqvist, IDA, Linköpings universitet.1 Innehåll Innehåll 1 Dekomposition 1 Totalsökning 3 3 Dynamisk programmering Giriga algoritmer 7. 1 Dekomposition Divide and conquer, söndra och härska Ett allmänt paradigm för algoritmdesign: Dela upp indata S i två eller fler disjunkta delmängder S 1,S,... Lös delproblemen rekursivt Kombinera lösningarna till delproblemen till en lösning till S Basfallen är delproblem av konstant storlek en kan genomföras m.h.a. rekurrensrelationer.3 Exempel: Matrismultiplikation ( C11 C C = AB 1 C 1 C ( A11 A = 1 A 1 A Antag att vi har n n-matriser och att n = k för något k function MUL(A, B, n if n = 1 then return A B C 11 =ADD(MUL(A 11,B 11, n,mul(a 1,B 1, n, n C 1 =ADD(MUL(A 11,B 1, n,mul(a 1,B, n, n C 1 =ADD(MUL(A 1,B 11, n,mul(a,b 1, n, n C =ADD(MUL(A 1,B 1, n,mul(a,b, n, n return C ( B11 B 1 B 1 B T (1 = 1 T (n = 8T ( n + ( n } T (n O(n 3. 1

Exempel: Matrismultiplikation (Strassen ( ( ( c11 c 1 a11 a = 1 b11 b 1 c 1 c a 1 a b 1 b Kan beräknas genom m 1 = (a 1 a (b 1 + b m = (a 1 + a (b 11 + b m 3 = (a 11 a 1 (b 11 + b 1 m = (a 11 + a 1 b m 5 = a 11 (b 1 b m 6 = a (b 1 b 11 m 7 = (a 1 + a b 11 c 11 = m 1 + m m + m 6 c 1 = m + m 5 c 1 = m 6 + m 7 c = m m 3 + m 5 m 7 Sammanlagt 7 multiplikationer och 18 additioner/subtraktioner Multiplikation av två n n-matriser tar tid T (1 = 1 T (n = 7T ( n + 18 ( n } T (n n.81.5 Strassen i praktiken Använd Strassens matrismultiplikationsalgoritm för stora matriser (n > b. Använd vanlig matrismultiplikation för mindre matriser (n b Hur ska brytpunkten väljas? n = 51.6 Exempel: Multiplikation av binära tal Antag att n = k function MULT(x, y, k if k = 1 then return x y [a,b] x [c,d] y p 1 MULT(a,c,k 1 p MULT(b,d,k 1 p 3 MULT(a,d,k 1 p MULT(b,c,k 1 return p 1 n + (p 3 + p n + p x = x n 1 x n...x n x n 1...x 1 x 0 = a n + b a b y = y n 1 y n...y n y n 1...y 1 y 0 = c n + d c d x y = a c n + (a d + b c n + b d T (1 = Θ(1 och ( n T (n = T + Θ(n T (n O(n log.7

Exempel: Smartare multiplikation (Karatsuba A a c B b d C (a + b (c + d D A n + (C A B n + B D = a c n + (a d + b c n + b d = x y function SMARTMULT(x, y, k if k then return x y [a,b] x [c,d] y A SMARTMULT(a,c,k 1 B SMARTMULT(b,d,k 1 C SMARTMULT(a + b,c + d,k 1 return A n + (C A B n + B T ( = Θ(1 T (n = 3 T ( n + Θ(n } T (n O(n log 3 O(n 1,58.8 Totalsökning Exhaustive search, totalsökning Gå igenom alla tänkbara lösningar och kolla om det är den sökta lösningen.detta görs med fördel rekursivt. Ofta är antalet tänkbara lösningar exponentiellt många och då går det bara att använda för små n. Totalsökning är en metod man tar till i sista hand. Det svåraste med totalsökning är normalt att se till att man går igenom varje tänkbar lösning en (och helst inte mer än en gång. Att sedan kolla om det är den sökta (eller optimala lösningen brukar vara lätt. Ibland kan man redan innan en tänkbar lösning är färdigkonstruerad se att den inte är en möjlig lösning. Då kan man strunta i att gå vidare med den och istället gå tillbaka och konstruera nästa möjliga lösning. Detta kallas backtracking..9 TSP handelsresandeproblemet Hitta kortaste turen som passerar alla städer en gång. Olika varianter av problemet: Generell TSPprobleminstans: graf med kantvikter Euklidisk TSP i dimension dprobleminstans: städerna givna som koordinater i R d.10 Exempel: Lösning av generell TSP med totalsökning function TSP(n,d[1...n,1...n] minlen for i 1 to n do visited[i] false for i 1 to n do perm[1] i; visited[i] true CHECKPERM(, 0 visited[i] false return minlen procedure CHECKPERM(k, length if k > n then totallength length + d[perm[n], perm[1]] 3

if totallength < minlength then minlength totallength for i 1 to n do if visited[i] then perm[k] i; visited[i] true CHECKPERM(k + 1,length + d[perm[k 1],i] visited[i] false.11 3 Dynamisk programmering Beräkning av Fibonaccital Fibonaccitalen har en rekursiv definition:f 0 = 0F 1 = 1F i = F i 1 + F i för i > 1 Som rekursiv algoritm (första försöket: function BINARYFIB(k if k < then return k return BINARYFIB(k 1+BINARYFIB(k.1 av Fibonacci med binär rekursion Låt n k beteckna antalet rekursiva anrop gjorda av BinaryFib(k n 0 = n 1 = 1 n = n 1 + n 0 + 1 = 1 + 1 + 1 = 3 n 3 = n + n 1 + 1 = 3 + 1 + 1 = 5 n = n 3 + n + 1 = 5 + 3 + 1 = 9 n 5 = n + n 3 + 1 = 9 + 5 + 1 = 15 n 6 = n 5 + n + 1 = 15 + 9 + 1 = 5 n 7 = n 6 + n 5 + 1 = 5 + 15 + 1 = 1 Värdet åtminstone fördubblas för vartannat värde på n k. D.v.s n k > k/. Antalet anropet växer exponentiellt!.13 En bättre algoritm för Fibonaccital Använd dynamisk programmering istället: function DYNPROGFIB(k int F[0..k] F[0] = 0 F[1] = 1 for i = to k do F[i] = F[i-] + F[i-1] return F[k] Går i tid O(k.1 Dynamisk programmering Tillämpbart på problem som vid första påseende verkar kräva mycket tid (möjligtvis exponentiellt förutsatt att vi har: Enkla delproblem: delproblemen kan definieras i termer av några få variabler Optimalitet hos delproblemen: det globalt optimala värdet kan definieras i termer av optimala delproblem Överlapp hos delproblemen: delproblemen är inte oberoende, istället överlappar de (och borde därför konstrueras botten-upp.15

Dynamisk programmering Bestäm strukturen hos optimal lösning Ställ upp rekursion för optimalvärdet Beräkna delproblemens optimalvärden från små till stora Konstruera optimallösningen (ev. med extra information som lagras i steg 3.16 Exempel: Maximal triangelstig Problem: hitta stigen från toppen till botten som maximerar summan av de ingående talen. 7 3 8 8 0 1 7 5 6 5 n = antalet rader finns n 1 stigar att pröva a i j = element nr j på rad i.17 Dynamisk programmeringslösning Optimala lösningens strukturstig uppbyggd av delstigar RekursionLåt V [i, j] = värdet på bästa stigen från a i j ner till rad n { ai V [i, j] = j om i=n (sista raden a i j + max(v [i + 1, j],v [i + 1, j + 1] annars Beräkning for j = 1 to n do V [n, j] a n j for i = n 1 downto 1 do for j = 1 to i do V [i, j] a i j + max(v [i + 1, j],v [i + 1, j + 1] return V [1,1] Tidskomplexitet: O(n.18 Dkvenser En dkvens av en sträng x 0 x 1 x...x n 1 är en sträng på form x i1 x 1...x ik, där i j < i j+1 Inte samma sak som delsträng! Exempel: ABCDEFGHIJK Delsträng: CDEF Dkvens: ACEGIJK Dkvens: DFGHK Inte dkvens: DAGH.19 Längsta gemensamma dkvensproblemet (LCS Givet två strängar X och Y är längsta gemensamma dkvensproblemet (LCS att hitta den längsta dkvensen gemensam för X och Y Har tillämpningar vid testning av överensstämm mellan DNA-strängar (alfabetet är {A,C,G,T} Exempel ABCDEFG och XZACKDFWGH har ACDFG som en längsta gemensam dkvens.0 5

Ett dåligt sätt att närma sig LCS-problemet En brute-forcelösning Enumerera alla dkvenser av X Testa vilka som också är dkvenser av Y Välj den längsta Om X har längd n innehåller den n dkvenser Det här en algoritm som kräver exponentiell tid!.1 Dynamisk programmering och LCS-problemet Låt L[i, j] vara längden av den längsta gemensamma dkvensen av X[0...i] och Y [0... j] Tillåt 1 som index, så att L[ 1,k] = 0 och L[k, 1] = 0 för att indikera att null-delen av X eller Y inte alls matchar den andra strängen Då kan vi definiera L[i, j] i det allmänna fallet som följer: Om X[i] = Y [ j] är L[i, j] = L[i 1, j 1] + 1 (vi kan lägga till den här träffen Om X[i] Y [ j] är L[i, j] = max{l[i 1, j],l[i, j 1]} (vi har ingen träff här Fall 1: Fall :. En algoritm för LCS function LCS(X,Y, X = n, Y = m for i = 1 to n-1 do L[i, 1] = 0 for j = 0 to m-1 do L[ 1, j] = 0 for i = 0 to n 1 do for j = 0 to m 1 do if X[i] = Y [ j] then L[i, j] = L[i 1, j 1] + 1 L[i, j] = max{l[i 1, j],l[i, j 1]} return array L.3 6

Visualisering av LCS-algoritmen m n. av LCS-algoritmen Vi har två nästlade loopar Den yttre itererar n ggr Den inre itererar m ggr I varje iteration av innerloopen utförs en konstant mängd arbete Alltså är den totala exekveringstiden O(nm Svaret finns i L[n,m] (och dkvensen kan återskapas utifrån tabellen L.5 Giriga algoritmer Giriga algoritmer Algoritmer som löser en bit av problemet i taget. I varje steg görs det som ger bäst utdelning/kostar minst. Den giriga metoden är ett allmänt paradigm för algoritmdesign som bygger på följande: konfigurationer: olika val, samlingar eller värden att hitta målfunktion: konfigurationer tilldelas en poäng som vi vill maximera eller minimera Det fungerar bäst applicerat på problem med greedy-choice-egenskapen: en globalt optimal lösning kan alltid hittas genom en serie lokala förbättringar utgående från en begynnkonfiguration För många problem ger giriga algoritmer inte optimala lösningar utan kanske hyfsade approximativa lösningar..6 Ge växel Du behöver ge x cent i växel, genom att använda mynt med valörerna 1, 5, 10 och 5 cent. Vilket är det minsta antalet mynt som behövs för att ge växeln? Girig approach: Ta så många 5-centsmynt som möjligt, sedan ta så många 10-centmynt som möjligt, sedan ta så många 5-centsmynt som möjligt, sedan ta så många 1-centsmynt som behövs för att bli färdig. Exempel: 99 cent = 3 5 cent + 10 cent + 0 5 cent + 1 cent Är detta optimalt? 1, 5, 10 och 5 cent: girig algoritm ger optimum 1, 6 och 10 cent: girig algoritm ger inte optimum.7 7