Giriga algoritmer och dynamisk programmering

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

Grundläggande datalogi - Övning 3

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

Föreläsning 5: Dynamisk programmering

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

Tommy Färnqvist, IDA, Linköpings universitet

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

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

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

Föreläsning 11. Giriga algoritmer

Källkodning. Egenskaper hos koder. Några exempel

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

Föreläsning 11. Giriga algoritmer

Tommy Färnqvist, IDA, Linköpings universitet

Magnus Nielsen, IDA, Linköpings universitet

Föreläsning 11 Datastrukturer (DAT037)

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 13. Dynamisk programmering

Reguljära uttryck Grammatiker Rekursiv nedåkning Allmänna kontextfria grammatiker. Syntaxanalys. Douglas Wikström KTH Stockholm

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

Algoritmer, datastrukturer och komplexitet

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

Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Datastrukturer och algoritmer

Algoritmer, datastrukturer och komplexitet

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

Shannon-Fano-Elias-kodning

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.

SF2715 Tillämpad kombinatorik, 6hp

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 4: Kombinatorisk sökning

Träd och koder. Anders Björner KTH

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

Tentamen TEN1 HI

Dugga Datastrukturer (DAT036)

GOTO och lägen. Några saker till och lite om snabbare sortering. GOTO och lägen (3) GOTO och lägen (2)

Algoritmer, datastrukturer och komplexitet

Några saker till och lite om snabbare sortering

Föreläsning 13. Rekursion

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Föreläsning 7: Syntaxanalys

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?

Föreläsning 8 Innehåll

Föreläsning 13. Dynamisk programmering

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

Problemlösning och funktioner Grundkurs i programmering med Python

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Föreläsning 11: Beräkningsgeometri

Föreläsning Datastrukturer (DAT036)

Föreläsningsanteckningar F6

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.

Skurlängdskodning. aaaabbbbbbbccbbbbaaaa. Man beskriver alltså sekvensen med ett annat alfabet än det ursprungliga.

Lösningar Datastrukturer TDA

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

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?

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 6 Jonas Lindgren, Institutionen för Datavetenskap, LiU

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

Kapitel 7: Analys av sorteringsalgoritmer

Ekvivalensrelationer

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 7 Jonas Lindgren, Institutionen för Datavetenskap, LiU

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

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

Sökning och sortering

Föreläsning Datastrukturer (DAT037)

Föreläsning 12+13: Approximationsalgoritmer

Programkonstruktion och Datastrukturer

Föreläsning 12: Exempel och problemlösning

Föreläsning 11: Rekursion

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Algoritmer, datastrukturer och komplexitet

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Tentamen EDAF30 Programmering i C++

Föreläsning 5. Rekursion

Introduktion till programmering SMD180. Föreläsning 9: Tupler

, S(6, 2). = = = =

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

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

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

Algoritmer, datastrukturer och komplexitet

Area och volym Punktposition Konvexa höljet. Geometri. Douglas Wikström KTH Stockholm

Algoritmer, datastrukturer och komplexitet

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.

Övning 6 - Tillämpad datalogi 2012

Föreläsning 5: Kardinalitet. Funktioners tillväxt

Uppgift 1 (grundläggande konstruktioner)

Föreläsning 1, vecka 7: Rekursion

Prov i DAT 312: Algoritmer och datastrukturer för systemvetare

Algoritmer och datastrukturer TDA Fredrik Johansson

Tentamen kl Uppgift 4. Uppgift 5

Lösning av några vanliga rekurrensekvationer

Krafts olikhet. En momentant avkodbar kod (prefixkod) med kodordslängderna l 1,...,l N existerar om och endast om. 2 l i. 1 i=1

Föreläsning 5: Grafer Del 1

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

Tommy Färnqvist, IDA, Linköpings universitet. 1 Prioritetsköer Heapar Tillämpning... 3

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

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

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

Transkript:

Föreläsning 1 Giriga algoritmer och dynamisk programmering Douglas Wikström KTH Stockholm popup-help@csc.kth.se

Dagens citat Using the wrong algorithm to solve a problem is like trying to cut a steak with a screwdriver: you may eventually get a digestable result, but you will expend considerably more effort than necessary, and the result is unlikely to be aesthetically pleasing. Cormen, Leiserson and Rivest

Divide and Conquer 1. Dela upp huvudproblemet i två eller fler mindre delar. 2. Lös varje delproblem rekursivt. 3. Kombinera lösningarna för delproblemen till en lösning för huvudproblemet.

Merge Sort Input: Lista L = [u 1,u 2,...,u n ]. Output: Elementen i L i sorterad ordning. MergeSort(L) (1) if L = 1 (2) return L (3) else (4) L l MergeSort([u 1,...,u n/2 ]) (5) L r MergeSort([u n/2 +1,...,u n ]) (6) return Merge(L l, L r ) Där Merge kombinerar två sorterade listor till en.

Disjunkta intervall (1/3) Aktiviteter skall utföras i en föreläsningssal. Varje aktivitet har en start- och slut-tid. Schemalägg så många aktiviteter som möjligt. Formellt: Givet är tidsintervall [s 1,f 1 ),...,[s n,f n ), dvs aktiviteter. Välj maximal delmängd av parvis disjunkta intervall.

Disjunkta intervall (2/3) Input: Intervall [s 1,f 1 ),...,[s n,f n ). Output: Maximal delmängd parvis disjunkta intervall. DisjunctInterval([s 1,f 1 ),...,[s n,f n )) (1) Sortera intervallen så att f 1 f 2... f n. (2) S {1}, j 1 (3) for i 2 to n (4) if s i f j (5) S S {i} (6) j i (7) return S

Disjunkta intervall (3/3) Greedy Choice. Intervallet I min med den minsta slutpunkten är med i någon optimal lösning. Optimal Substructure. Optimal lösning till {I 1,...,I n } I min kombinerad med I min är optimal lösning för {I 1,...,I n }.

Intervalltäckning (1/3) I en gammal biltunnel finns ett antal lampor monterade med ojämna mellanrum. Lamporna är olika smutsiga och ger därför olika stora ljuskäglor. Dvs, varje lampa lyser upp ett bestämt avsnitt av vägen. Den miljöorienterade nyanställde funderar över vilka lampor som skall tändas så att hela tunneln är belyst med minimal elförbrukning. Formellt: Givet är ett intervall [s,f ], dvs tunneln, och intervall [s 1,f 1 ],...,[s n,f n ], dvs ljuskäglornas utsträckning. Välj minimal delmängd S {1,...,n} så att [s,f ] i S [s i,f i ], dvs belys hela tunneln.

Intervalltäckning (2/3) Input: Målintervall [s,f ] och intervall [s 1,f 1 ],...,[s n,f n ] så att [s,f ] [s i,f i ]. Output: En minimal delmängd S {1,...,n} så att [s,f ] i S [s i,f i ]. IntervalCover([s 1,f 1 ],...,[s n,f n ]) (1) S, t s (2) while t < f (3) f i max{f j s j t f j } (4) S S {i} (5) t f i (6) return S

Intervalltäckning (3/3) Greedy Choice. Intervallet I max som innehåller s och har maximal slutpunkt f max är med i någon optimal lösning. Optimal Substructure. Optimal lösning till [f max,f ], {I 1,...,I n } I max kombinerad med I max är optimal lösning för {I 1,...,I n }.

Kontinuerliga kappsäcksproblemet (1/2) En tjuv gör inbrott i en gruva och finner separata högar med finkornigt metallspån av olika metaller. Han har med sig en kappsäck som rymmer en viss mängd och vill stjäla till ett så stort värde som möjligt. Hur mycket skall han ta av varje metall? Formellt: Givet är kappsäckens kapacitet och värde/vikt-par [(v 1,w 1 ),...,(v n,w n )]. Välj [a 1,...,a n ] så att a i w i och så att n i=1 a i v i w i maximeras.

Kontinuerliga kappsäcksproblemet (2/2) Input: Kapacitet W och värde/vikt-par [(v 1,w 1 ),...,(v n,w n )]. Output: [a 1,...,a n ], a i w i, så att n i=1 a i v i w i maximeras. ContKnapsack(W, [(v 1,w 1 ),...,(v n,w n )]) (1) Sortera värde/vikt-paren så att v 1 w 1 v 2 w 2... vn w n. (2) for i = 1 to n (3) a i min{w,w i } (4) W W a i (5) return [a 1,...,a n ]

Huffmankodning (1/2) Givet en tabell över hur vanligt varje tecken är i ett alfabet, hitta den prefixfria binära kod som ger kortast förväntad kodlängd. En kod är prefixfri om inget kodord är ett prefix till något annat kodord. Formellt: Givet är tecken/vikt-par {(a 1,f 1 ),...,(a n,f n )} för ett alfabet A = {a 1,...,a n }. Hitta prefixfri kod τ : A {0,1} som minimerar n i=1 f i τ(a i ), där τ(a i ) är längden av kodordet τ(a i ).

Huffmankodning (2/2) Vi identifierar en binär prefixfri kod τ med ett 0/1-kantmärkt träd. Koden för ett löv ges då av vägen till lövet. Input: Tecken/vikt-par {(a 1,f 1 ),...,(a n,f n )}. Output: 0/1-kantmärkt träd sådant att n i=1 f i τ(a i ) minimeras. Huffman({(a 1,f 1 ),...,(a n,f n )}) (1) S {(a 1,f 1,a 1 ),...,(a n,f n,a n )} (2) while S 2 (3) Hitta (b i,f i,t i ),(b j,f j,t j ) S med minimala f i och f j. (4) (5) S S \ {(b i,f i,t i ),(b j,f j,t j )} S S { ( a i a j,f i + f j,treenode(t i,t j ) ) } (6) return S

Binomialtal och Pascals triangel (1/3) ( n ) k är antalet sätt att välja en k-delmängd från en mängd med n element. Vi summerar antalet sätt att välja k element där första elementet är med respektive inte med. ( ) n = k { 1 ) ( om n = k eller k = 0 + n 1 ) annars ( n 1 k 1 k Pascals triangel: k 1 0 1 1 1 1 2 1 2 1 3 3 1 3 1 4 6 4 1 4 1 5 10 10 5 1 5

Binomialtal och Pascals triangel (2/3) Dynamisk programmering med memoisering. T[i,j] är en tabell där alla element från början är satta till. Tabellen kan återanvändas mellan anrop. Input: Heltal n och k, 0 k n. Output: ( n) k Bin(n, k) (1) if T[n,k] = (2) if n = k k = 0 (3) T[n,k] = 1 (4) else (5) T[n,k] Bin(n 1,k 1)+Bin(n 1,k) (6) return T[n, k]

Binomialtal och Pascals triangel (3/3) Vanlig dynamisk programmering från botten och upp. Input: Heltal n och k, 0 k n. Output: ( n) k Bin(n, k) (1) for i = 0 to n (2) T[i,0] T[i,i] 1 (3) for i = 2 to n (4) for j = 1 to min{i 1,k} (5) T[i,j] T[i 1,j 1] + T[i 1,j] (6) return T[n, k]

Maximal delsumma (1/2) Formellt: Givet heltal x 1,...,x n, finn max s f { f i=s x i}.

Maximal delsumma (2/2) Input: Heltal x 1,...,x n. Output: max s f { f i=s x i}. MaxSubarray(x 1,...,x n ) (1) S[0] 0 (2) for i = 1 to n (3) S[i] max{0,s[i 1]} + x i (4) return max i {S[i]}

Längsta växande delsekvens (1/2) Två kretsar har n kontakter var på rad märkta med talen 1,2,...,n i någon ordning. Vi vill parvis förbinda så många matchande kontakter som möjligt med sladdar utan att korsa några sladdar. Formellt: Givet en n-permutation π, finn storleken på maximal delmängd S {1,2,...,n} så att π(i) < π(j) för alla i < j i mängden S.

Längsta växande delsekvens (2/2) Input: Permutation π. Output: Storleken på maximal delmängd S {1,2,...,n} så att π(i) < π(j) för alla i < j i mängden S. LongIncSubseq(π) (1) T[0] (2) for i = 1 to n (3) T[i] (4) for i = 1 to n (5) Finn j så att T[j 1] < π(i) < T[j]. (6) T[j] π(i) (7) return max{j : T[j] < }