Download de presentatie
De presentatie wordt gedownload. Even geduld aub
GepubliceerdFanny de Lange Laatst gewijzigd meer dan 6 jaar geleden
1
Divide & Conquer: Verdeel en Heers
Algoritmiek
2
Algoritmische technieken
Trucs; methoden; paradigma’s voor het ontwerp van algoritmen Gezien: Dynamisch Programmeren Hierna: Greedy Vandaag: Divide & Conquer Algoritmiek: Divide & Conquer
3
Algoritmiek: Divide & Conquer
Los probleem op in 3 stappen: Divide: splits in deelproblemen Conquer: los deelproblemen recursief op Combine: voeg deeloplossingen samen tot oplossing hele probleem (Vgl. dynamisch programmeren: topkeuze verschillende deelproblemen) Algoritmiek: Divide & Conquer
4
Algoritmiek: Divide & Conquer
Divide et impera Algoritmiek: Divide & Conquer
5
Algoritmiek: Divide & Conquer
MergeSort Sorteert deel van array X inclusief ondergrens a, exclusief bovengrens b MergeSort[int[] X, int a, int b] MergeSort[X, a, (a+b)/2] MergeSort[X, (a+b)/2, b] Merge[X, a, (a+b)/2, b] NB: soms laat ik basisgeval weg Algoritmiek: Divide & Conquer
6
Algoritmiek: Divide & Conquer
MergeSort Combineren Basisgeval Opl. geheel Opl. deelproblemen Algoritmiek: Divide & Conquer
7
Algoritmiek: Divide & Conquer
MergeSort Divide: hak lijst doormidden Conquer: sorteer helften Combine: voeg gesorteerde lijsten samen tot 1 gesorteerde lijst Algoritmiek: Divide & Conquer
8
Algoritmiek: Divide & Conquer
Maximum Maximum[int[] X, int a, int b] if(a + 1 == b) return X[a]; L = Maximum[X, a, (a+b)/2] R = Maximum[X, (a+b)/2, b] return max[L, R] Algoritmiek: Divide & Conquer
9
Algoritmiek: Divide & Conquer
Optellen Divide and Conquer Iteratief Sum[int[] X, a, b] if(a + 1 == b) return X[a] s1 := Sum[X, a, (a+b)/2] s2 := Sum[X, (a+b)/2, b] return s1 + s2 Verschillen? Sum[int[] X, a, b] accum := 0 for(i:=a; i<b; i++) accum += X[i] return accum Algoritmiek: Divide & Conquer
10
Algoritmiek: Divide & Conquer
Optellen Divide and Conquer Iteratief Sum[int[] X, a, b] if(a + 1 == b) return X[a] s1 := Sum[X, a, (a+b)/2] s2 := Sum[X, (a+b)/2, b] return s1 + s2 Minder afrondfouten Parallelisme (concurrency) Sum[int[] X, a, b] accum := 0 for(i:=a; i<b; i++) accum += X[i] return accum Minder overhead Algoritmiek: Divide & Conquer
11
Algoritmiek: Divide & Conquer
Nog een voorbeeld Voorwaarts verschil: 1x kopen, 1x verkopen Week 1 2 3 4 5 6 Prijs 9 7 Algoritmiek: Divide & Conquer
12
Algoritmiek: Divide & Conquer
Voorwaarts Verschil Splits het array in twee stukken: links en rechts Drie gevallen: Inkoop en verkoop zitten allebei links Inkoop en verkoop zitten allebei rechts Inkoop zit links en verkoop zit rechts Algoritmiek: Divide & Conquer
13
Algoritmiek: Divide & Conquer
Voorwaarts Verschil Voorwaarts Verschil is maximum van: V.V. links V.V. rechts Max rechts – Min links Week 1 2 3 4 5 6 Prijs 9 7 v.v = 5 min = 2 v.v = 2 max = 5 Algoritmiek: Divide & Conquer
14
Algoritmiek: Divide & Conquer
Drie gevallen Inkoop en verkoop zitten allebei links Recursief op linkerkant Inkoop en verkoop zitten allebei rechts Recursief op rechterkant Inkoop zit links en verkoop zit rechts … Algoritmiek: Divide & Conquer
15
Algoritmiek: Divide & Conquer
Drie gevallen Inkoop en verkoop zitten allebei links Recursief op linkerkant Inkoop en verkoop zitten allebei rechts Recursief op rechterkant Inkoop zit links en verkoop zit rechts Koop links zo goedkoop mogelijk (minimum) Verkoop rechts zo duur mogelijk (maximum) Algoritmiek: Divide & Conquer
16
Algoritmiek: Divide & Conquer
Voorwaarts Verschil Methode die als return-waarde een drietal getallen oplevert: (min, max, maxverschil) Method MaxVerschil[int[] X, a, b] (minL, maxL, vl) = MaxVerschil[a,(a+b)/2]; (minR, maxR, vr) =MaxVerschil[(a+b)/2, b]; antw = max { vl, vr, maxR-minL }; Return (min{minL,minR}, max{minR,maxR}, antw) Algoritmiek: Divide & Conquer
17
Algoritmiek: Divide & Conquer
Voorwaarts Verschil Divide: hak lijst doormidden Conquer: bereken v.v. helften Combine: max van vv’s, max right – min left Algoritmiek: Divide & Conquer
18
Hoeveel tijd? … en verder …
O(n), want: T(n) = 2 T(n/2) + O(1) Of “accounting” Kan het sneller: W(n) Maar misschien wel wat betreft de constante factor Algoritmiek: Divide & Conquer
19
Algoritmiek: Divide & Conquer
Andere strategieën Simplificatie … Divide in n-1 en 1 Kijk naar de eerste twee elementen… Slimme scan Algoritmiek: Divide & Conquer
20
Algoritmiek: Divide & Conquer
Vermenigvuldigen Twee getallen van 𝑛 cijfers Motivatie: cryptografie, numerieke wiskunde Soms getal te groot voor 32/64-bits Basisschool-methode: Θ 𝑛 2 1234__ 2753 x 2702__ 6170___ 8638____ x __ Algoritmiek: Divide & Conquer
21
Algoritmiek: Divide & Conquer
Vermenigvuldigen Twee getallen 𝐴,𝐵 van 𝑛 cijfers Splits: 𝐴= 𝐴 1 ⋅ 10 𝑛/2 + 𝐴 𝐵= 𝐵 1 ⋅ 10 𝑛/2 + 𝐵 2 Deelproblemen? Algoritmiek: Divide & Conquer
22
Algoritmiek: Divide & Conquer
Vermenigvuldigen Multiply[A, B] M := 10^(n/2) A1 := A / M ; A2 := A % M B1 := B / M ; B2 := B % M X1 := Multiply(A1, B1) X2 := Multiply(A1, B2) X3 := Multiply(A2, B1) X4 := Multiply(A2, B2) RETURN X1*M*M + X2*M + X3*M + X4 Algoritmiek: Divide & Conquer
23
Algoritmiek: Divide & Conquer
Hoeveelheid werk Stel een recurrente betrekking op 𝑇 𝑛 =4𝑇 𝑛/2 +𝑂(𝑛) Vier vermenigvuldigingen van half zo lange getallen Algoritmiek: Divide & Conquer
24
Algoritmiek: Divide & Conquer
Kan het sneller? 𝐴 1 𝐵 1 𝑀 2 +𝑀⋅ 𝐴 1 𝐵 2 + 𝐴 2 𝐵 1 + 𝐴 2 𝐵 2 𝐴 1 + 𝐴 2 ⋅ 𝐵 1 + 𝐵 2 = 𝐴 1 𝐵 2 + 𝐴 2 𝐵 1 + 𝐴 1 𝐵 1 + 𝐴 2 𝐵 2 Algoritmiek: Divide & Conquer
25
Algoritmiek: Divide & Conquer
Kan het sneller? 𝐴 1 𝐵 1 𝑀 2 +𝑀⋅ 𝐴 1 𝐵 2 + 𝐴 2 𝐵 1 + 𝐴 2 𝐵 2 𝐴 1 + 𝐴 2 ⋅ 𝐵 1 + 𝐵 2 = 𝐴 1 𝐵 2 + 𝐴 2 𝐵 1 + 𝐴 1 𝐵 1 + 𝐴 2 𝐵 2 Ruil 2 verm. voor 1 verm. + 3 optel. Algoritmiek: Divide & Conquer
26
Algoritmiek: Divide & Conquer
Vermenigvuldigen Multiply[A, B] M := 10^(n/2) A1 := A / M ; A2 := A % M B1 := B / M ; B2 := B % M X1 := Multiply(A1, B1) X2 := Multiply(A2, B2) X3 := Multiply(A1+A2, B1+B2) RETURN X1*M*M + M*(X3-X1-X2) + X2 Algoritmiek: Divide & Conquer
27
Algoritmiek: Divide & Conquer
Hoeveelheid werk Nieuwe recurrente betrekking 𝑇 𝑛 =𝟑𝑇 𝑛/2 +𝑂(𝑛) Hoeveel sneller is dit? analyse… Algoritmiek: Divide & Conquer
28
Algoritmiek: Divide & Conquer
Master Theorem Zegt iets over: 𝑇 𝑛 =𝑎𝑇 𝑛/𝑏 +𝑓(𝑛) MergeSort: 𝑇 𝑛 =2𝑇 𝑛/2 +𝑂(𝑛) Verm. 1: 𝑇 𝑛 =4𝑇 𝑛/2 +𝑂 𝑛 Verm. 2: 𝑇 𝑛 =3𝑇 𝑛/2 +𝑂 𝑛 Optel: 𝑇 𝑛 =2𝑇 𝑛/2 +𝑂(1) Master Theorem (kort): Neem de b-log van a (log met grondtal b van a, log_b a). Vergelijk n^(log_b a) met f(n). De grootste is de looptijd, tenzij ze op log-factoren na hetzelde zijn. Dan is de looptijd f(n)log n. Zie boek voor details en twee randgevallen. Algoritmiek: Divide & Conquer
29
Snel vermenigvuldigen
𝑇 𝑛 =𝟑𝑇 𝑛/2 +𝑂(𝑛) 2 getallen vermenigvuldigen in 𝑂( 𝑛 ) (Dit heet: Karatsuba-vermenigvuldiging) Het kan nog sneller, in 𝑂(𝑛 log 𝑛 log log 𝑛 ), dit is moeilijk. Boek hf. 30. Algoritmiek: Divide & Conquer
30
Snel Vermenigvuldigen
Divide: splits de getallen in 2 helften Conquer: bereken (3/4) producten Combine: optelsom Algoritmiek: Divide & Conquer
31
Algoritmiek: Divide & Conquer
Subtitutie MT kan niet alles aan Subtitutie: formuleer vermoeden, bewijs het Op basis ervaring, experiment of vermoeden Soort inductiebewijs Maak impliciete constante expliciet Je krijgt ondergrens op 𝑐 Complexiteit van Merge Sort: SUBSTITUTIE. Voor de verdeelde Merge-sort instanties geldt: M(n) = M(n/2) + M(n/2) + O(n) Verwar een aanroep niet met de tijd van die aanroep! Op toetsen zie ik nog wel eens zoiets als dit verschijnen. FOUT: M(n) = n/2 + n/2 + O(n). Maar in de fase van het OPSTELLEN van de vergelijking mag je nooit zomaar "een aanroep op n/2 waarden" verwarren met "n/2 tijd". Zelfs niet als er later O(n) uit blijkt te komen. Uit Datastructuren weet je waarschijnlijk nog dat alle goeie sorteeralgoritmen O(n.lgn) zijn, dus deze waarschijnlijk ook. Afronding bij instantiegrootte is niet van belang voor O. Moet je iets weten over atomaire instantie (base case)? Nee, impliciet veronderstellen we altijd: M(1) = O(1), namelijk, een base case is altijd begrensd door de tijd van de duurste base case. We noemen dit een recurrente betrekking omdat de waarde van M(n) wordt uitgedrukt in de waarde voor kleinere instanties. Als je al een idee hebt van wat de oplossing van zo'n vergelijking is, dan kun je proberen dat te bewijzen met de SUBSTITUTIE-methode, in feite een soort inductie. Inductie: je leidt iets af "voor n" waarbij je AANNEEMT cq GEBRUIKT dat het geldt voor kleinere waarden. Wat nu hier de belangrijkste stap is: het EXPLICITEREN van de IMPLICIETE constante. Dwz we gaan niet bewijzen "M(n) is O(n.lgn)", maar we gaan bewijzen "M(n) <= c.n.lgn", alleen zonder te noemen wat c is. Waarom is dit EXPLICITEREN nodig? Je wordt anders namelijk genept door GELDIGE afleidingsregels voor O, bv: O(n) + O(n) = O(n) Waarom is dit op zich geldig? Als ik twee expressies heb, de ene in waarde begrensd door c1.n en de tweede door c2.n, dan is de som begrensd door (c1+c2).n, dus inderdaad EEN constante maal n. Alleen het is een andere constante dan waar ik mee begon. FOUTIEF BEWIJS VAN M(n) = O(n): Stel M(n') = O(n') voor alle n'< n, Dan is M(n) = M(n/2) + M(n/2) + O(n) Rec Betr = O(n/2) + O(n/2) + O(n) Gebruik voor n/2 = O(n) Rekenregel O Probleem is dat de impliciete constante in de laatste O NIET dezelfde is als in de eerdere O. Dus ik ga constantes expliciet maken. Er is een constante d waarbij als gegeven geldt M(n) <= M(n/2) + M(n/2) + d.n Wat ik ga bewijzen is M(n) <= c. n lgn Waarbij ik als inductiehypothese gebruik: M(n') <= c. n'.lgn' voor alle n'< n In de afleiding komen vrijwel altijd dezelfde stappen terug: + Gegeven gebruiken, + Ind Hyp gebruiken, + Vereenvoudigen + Kijken waar je naar toe wilt + Een slimme afschatting maken Het bewijs gaat zo: Dan geldt M(n) <= M(n/2) + M(n/2) + d.n Rec Betr <= c. n/2 lg(n/2) + c. n/2 . lg(n/2) + d.n Ind Hyp = c.n.lg (n/2) + d.n Termen combineren = c.n.(lg n - 1) + d.n Eigenschap lg = c.n.lgn - c.n + d.n Distributie Nu kom ik op een stap die niet voor alle c geldt: <= c.n.lgn MITS c >= d Het is niet vreemd dat ik op een restrictie op c kom; ik probeer immers te bewijzen M(n) <= c.n.lgn en dit zal niet voor kleine c waar zijn. Maar als c groot genoeg is (dus >= d) dan is deze inductiestap GELDIG. Je ziet dat ik voor M(n) DEZELFDE c heb afgeleid als ik heb aangenomen voor M(n'). Algoritmiek: Divide & Conquer
32
Algoritmiek: Divide & Conquer
Consumentengids Best uit de test & beste koop Algoritmiek: Divide & Conquer
33
Algoritmiek: Divide & Conquer
Consumentengids Kwaliteit 78 76 74 72 71 65 47 31 Prijs €1199 €1229 €709 €1553 €801 €632 €459 €599 “Best uit de Test” – gewoon de beste. Wat is “Beste Koop”? Algoritmiek: Divide & Conquer
34
Algoritmiek: Divide & Conquer
Consumentengids Kwaliteit 78 76 74 72 71 65 47 31 Prijs €1199 €1229 €709 €1553 €801 €632 €459 €599 “Best uit de Test” – gewoon de beste. Wat is “Beste Koop”? Algoritmiek: Divide & Conquer
35
Algoritmiek: Divide & Conquer
Dominatie Een product domineert een ander product als zowel: De prijs lager is En de kwaliteit hoger Wil: lijst van niet-gedomineerde producten (Pareto-front) Algoritmiek: Divide & Conquer
36
Algoritmiek: Divide & Conquer
Dominatie Dominatie[product[] X, int a, int b] Sorteer X op kwaliteit Dominatie[X, a, (a+b)/2] Dominatie[X, (a+b)/2, b] …? Algoritmiek: Divide & Conquer
37
Algoritmiek: Divide & Conquer
Consumentengids Kwaliteit 78 76 74 72 71 65 47 31 Prijs €1199 €1229 €709 €1553 €801 €632 €459 €599 78 76 74 72 €1199 €1229 €709 €1553 71 65 47 31 €801 €632 €459 €599 Algoritmiek: Divide & Conquer
38
Algoritmiek: Divide & Conquer
Consumentengids Kwaliteit 78 76 74 72 71 65 47 31 Prijs €1199 €1229 €709 €1553 €801 €632 €459 €599 78 76 74 72 €1199 €1229 €709 €1553 71 65 47 31 €801 €632 €459 €599 Algoritmiek: Divide & Conquer
39
Algoritmiek: Divide & Conquer
Consumentengids Kwaliteit 78 76 74 72 71 65 47 31 Prijs €1199 €1229 €709 €1553 €801 €632 €459 €599 78 76 74 72 €1199 €1229 €709 €1553 71 65 47 31 €801 €632 €459 €599 Rechts domineert nooit links Waneer domineert links rechts? Algoritmiek: Divide & Conquer
40
Algoritmiek: Divide & Conquer
Consumentengids Kwaliteit 78 76 74 72 71 65 47 31 Prijs €1199 €1229 €709 €1553 €801 €632 €459 €599 78 76 74 72 €1199 €1229 €709 €1553 71 65 47 31 €801 €632 €459 €599 801>709 Rechts domineert nooit links Waneer domineert links rechts? Algoritmiek: Divide & Conquer
41
Algoritmiek: Divide & Conquer
Dominatie Dominatie[product[] X, int a, int b] Sorteer X op kwaliteit Dominatie[X, a, (a+b)/2] Dominatie[X, (a+b)/2, b] p* := minimale prijs [a,(a+b)/2) filter uit [(a+b)/2, b) als p>p* Algoritmiek: Divide & Conquer
42
Algoritmiek: Divide & Conquer
Looptijd 𝑇 𝑛 =2𝑇 𝑛/2 +𝑂 𝑛 log 𝑛 Algoritmiek: Divide & Conquer
43
Algoritmiek: Divide & Conquer
Looptijd 𝑇 𝑛 =2𝑇 𝑛/2 +𝑂 𝑛 log 𝑛 𝑇 𝑛 =𝑂(𝑛 log 2 𝑛 ) Dom! Je sorteert te vaak… Let bij D&C op: Geen overbodig werk: sorteren, array kopiëren Bereken in recursie hulpwaarden (v.v; opgave WC) Algoritmiek: Divide & Conquer
44
Algoritmiek: Divide & Conquer
Dominatie Het kan véél simpeler Kwaliteit 78 76 74 72 71 65 47 31 Prijs €1199 €1229 €709 €1553 €801 €632 €459 €599 𝑚𝑖𝑛=632 D&C is niet altijd de beste oplossing. Hier: loopje over de lijst (gesorteerd op kwaliteit, van links naar rechts), voeg label toe als je een kleinere prijs tegenkomt dan dat je eeder hebt gezien. Algoritmiek: Divide & Conquer
45
Algoritmiek: Divide & Conquer
Dominatie Het kan véél simpeler Lineair als lijst voorgesorteerd Kwaliteit 78 76 74 72 71 65 47 31 Prijs €1199 €1229 €709 €1553 €801 €632 €459 €599 𝑚𝑖𝑛=459 D&C is niet altijd de beste oplossing. Hier: loopje over de lijst (gesorteerd op kwaliteit, van links naar rechts), voeg label toe als je een kleinere prijs tegenkomt dan dat je eeder hebt gezien. Algoritmiek: Divide & Conquer
46
Algoritmiek: Divide & Conquer
Dominatie Divide & Conquer-algoritme is bouwsteen: Werkcollege: uitbreiding naar 3D Divide & Conquer is vaak één van de mogelijkheden: Mergesort v.s. Heapsort Dominatie Algoritmiek: Divide & Conquer
47
Algoritmiek: Divide & Conquer
Conclusie Divide & Conquer: techniek om algoritmen te ontwerpen Splits probleem, los deelproblemen op, combineer Analyse: Master Theorem, Substitutie Algoritmiek: Divide & Conquer
Verwante presentaties
© 2024 SlidePlayer.nl Inc.
All rights reserved.