Divide & Conquer: Verdeel en Heers Algoritmiek
Algoritmische technieken Trucs; methoden; paradigma s voor het ontwerp van algoritmen Gezien: Dynamisch Programmeren Hierna: Greedy Vandaag: Divide & Conquer 2
Divide & Conquer Los probleem op in 3 stappen: 1. Divide: splits in deelproblemen 2. Conquer: los deelproblemen recursief op 3. Combine: voeg deeloplossingen samen tot oplossing hele probleem (Vgl. dynamisch programmeren: topkeuze verschillende deelproblemen) 3
Divide et impera 4
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 5
MergeSort Combineren Opl. geheel Opl. deelproblemen Basisgeval 6
MergeSort 1. Divide: hak lijst doormidden 2. Conquer: sorteer helften 3. Combine: voeg gesorteerde lijsten samen tot 1 gesorteerde lijst 7
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] 8
Optellen Divide and Conquer 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 Iteratief Sum[int[] X, a, b] accum := 0 for(i:=a; i<b; i++) accum += X[i] return accum Verschillen? 9
Optellen Divide and Conquer 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 Iteratief Sum[int[] X, a, b] accum := 0 for(i:=a; i<b; i++) accum += X[i] return accum Minder afrondfouten Parallelisme (concurrency) Minder overhead 10
Nog een voorbeeld Voorwaarts verschil: 1x kopen, 1x verkopen Week 1 2 3 4 5 6 Prijs 9 2 7 5 1 3 11
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 12
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 2 7 5 1 3 v.v = 5 min = 2 v.v = 2 max = 5 13
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 14
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) 15
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) 16
Voorwaarts Verschil 1. Divide: hak lijst doormidden 2. Conquer: bereken v.v. helften 3. Combine: max van vv s, max right min left 17
Vermenigvuldigen Twee getallen van nn cijfers Motivatie: cryptografie, numerieke wiskunde 1234 2753 x 2702 6170 8638 2468 x 3397202 Soms getal te groot voor 32/64-bits Basisschool-methode: Θ nn 2 18
Vermenigvuldigen Twee getallen AA, BB van nn cijfers Splits: AA = AA 1 10 nn/2 + AA 2 BB = BB 1 10 nn/2 + BB 2 Deelproblemen? 19
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 20
Hoeveelheid werk Stel een recurrente betrekking op TT nn = 4TT nn/2 + OO(nn) Vier vermenigvuldigingen van half zo lange getallen 21
Kan het sneller? AA 1 BB 1 MM 2 + MM AA 1 BB 2 + AA 2 BB 1 + AA 2 BB 2 AA 1 + AA 2 BB 1 + BB 2 = AA 1 BB 2 + AA 2 BB 1 + AA 1 BB 1 + AA 2 BB 2 22
Kan het sneller? AA 1 BB 1 MM 2 + MM AA 1 BB 2 + AA 2 BB 1 + AA 2 BB 2 AA 1 + AA 2 BB 1 + BB 2 = AA 1 BB 2 + AA 2 BB 1 + AA 1 BB 1 + AA 2 BB 2 Ruil 2 verm. voor 1 verm. + 3 optel. 23
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 24
Hoeveelheid werk Nieuwe recurrente betrekking TT nn = 33TT nn/2 + OO(nn) Hoeveel sneller is dit? analyse 25
Master Theorem Zegt iets over: TT nn = aaaa nn/bb + ff(nn) MergeSort: Verm. 1: Verm. 2: Optel: TT nn = 2TT nn/2 + OO(nn) TT nn = 4TT nn/2 + OO nn TT nn = 3TT nn/2 + OO nn TT nn = 2TT nn/2 + OO(1) 26
Snel vermenigvuldigen TT nn = 33TT nn/2 + OO(nn) 2 getallen vermenigvuldigen in OO(nn 1.585 ) (Dit heet: Karatsuba-vermenigvuldiging) Het kan nog sneller, in OO(nn log nn log log nn), dit is moeilijk. Boek hf. 30. 27
Snel Vermenigvuldigen 1. Divide: splits de getallen in 2 helften 2. Conquer: bereken (3/4) producten 3. Combine: optelsom 28
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 cc 29
Consumentengids Best uit de test & beste koop 30
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? 31
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? 32
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) 33
Dominatie Dominatie[product[] X, int a, int b] Sorteer X op kwaliteit Dominatie[X, a, (a+b)/2] Dominatie[X, (a+b)/2, b]? 34
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 35
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 36
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? 37
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? 38
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* 39
Looptijd TT nn = 2TT nn/2 + OO nn log nn 40
Looptijd TT nn = 2TT nn/2 + OO nn log nn TT nn = OO(nn log 2 nn) 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) 41
Dominatie Het kan véél simpeler Kwaliteit 78 76 74 72 71 65 47 31 Prijs 1199 1229 709 1553 801 632 459 599 mmmmmm =632 42
Dominatie Het kan véél simpeler Kwaliteit 78 76 74 72 71 65 47 31 Prijs 1199 1229 709 1553 801 632 459 599 mmmmmm =459 Lineair als lijst voorgesorteerd 43
Dominatie Divide & Conquer-algoritme is bouwsteen: Werkcollege: uitbreiding naar 3D Divide & Conquer is vaak één van de mogelijkheden: Mergesort v.s. Heapsort Dominatie 44
Conclusie Divide & Conquer: techniek om algoritmen te ontwerpen Splits probleem, los deelproblemen op, combineer Analyse: Master Theorem, Substitutie 45