Zevende college algoritmiek. 24 maart Verdeel en Heers

Vergelijkbare documenten
Zevende college algoritmiek. 23/24 maart Verdeel en Heers

Zevende college Algoritmiek. 6 april Verdeel en Heers

Achtste college algoritmiek. 12 april Verdeel en Heers. Dynamisch Programmeren

Zevende college complexiteit. 7 maart Mergesort, Ondergrens sorteren (Quicksort)

Vierde college algoritmiek. 23/24 februari Complexiteit en Brute Force

Zesde college complexiteit. 19 maart Mergesort, Ondergrens sorteren Quicksort, Shellsort

Zevende college complexiteit. 17 maart Ondergrens sorteren, Quicksort

Zesde college algoritmiek. 23 maart Backtracking. Verdeel en Heers

Achtste college algoritmiek. 8 april Dynamisch Programmeren

Vierde college complexiteit. 14 februari Beslissingsbomen

Divide & Conquer: Verdeel en Heers vervolg. Algoritmiek

Vierde college complexiteit. 16 februari Beslissingsbomen en selectie

Programmeermethoden. Recursie. week 11: november kosterswa/pm/

Derde college complexiteit. 7 februari Zoeken

Tweede college algoritmiek. 12 februari Grafen en bomen

Vierde college algoritmiek. 1 maart Toestand-actie-ruimte Brute Force

Programmeermethoden. Recursie. Walter Kosters. week 11: november kosterswa/pm/

Derde college algoritmiek. 23 februari Complexiteit Toestand-actie-ruimte

Vierde college complexiteit. 26 februari Beslissingsbomen en selectie Toernooimethode Adversary argument

Elfde college algoritmiek. 18 mei Algoritme van Dijkstra, Heap, Heapify & Heapsort

Vijfde college complexiteit. 21 februari Selectie Toernooimethode Adversary argument

Algoritmiek. 15 februari Grafen en bomen

Derde college algoritmiek. 22 februari Complexiteit Toestand-actie-ruimte

Uitwerking tentamen Algoritmiek 9 juni :00 17:00

Tiende college algoritmiek. 13/21 april Gretige Algoritmen Algoritme van Dijkstra

Negende college algoritmiek. 15 april Dynamisch Programmeren

Tiende college algoritmiek. 26 april Gretige algoritmen

Tiende college algoritmiek. 14 april Dynamisch Programmeren, Gretige Algoritmen, Kortste Pad met BFS

Uitgebreide uitwerking Tentamen Complexiteit, juni 2017

2 Recurrente betrekkingen

Divide & Conquer: Verdeel en Heers. Algoritmiek

Twaalfde college algoritmiek. 13 mei Branch & Bound Heap, Heapsort & Heapify

Datastructuren en algoritmen voor CKI

Divide & Conquer: Verdeel en Heers. Algoritmiek

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 5 juni 2007, uur

ALGORITMIEK: antwoorden werkcollege 5

Tijd is geen goede maatstaf, want is afhankelijk van computer waarop algoritme wordt gedraaid.

Algoritmiek. 2 februari Introductie

ALGORITMIEK: answers exercise class 7

Datastructuren en Algoritmen

Derde college algoritmiek. 18 februari Toestand-actie-ruimte

Vierde college algoritmiek. 2 maart Toestand-actie-ruimte Exhaustive Search

Recursion. Introductie 37. Leerkern 37. Terugkoppeling 40. Uitwerking van de opgaven 40

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 3 juni 2008, uur

Tiende college algoritmiek. 4 mei Gretige Algoritmen Algoritme van Dijkstra

Vijfde college algoritmiek. 2/3 maart Exhaustive search

Eerste college algoritmiek. 5 februari Introductie

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Opgaven Heaps Datastructuren, 8 juni 2018, Werkgroep.

Datastructuren: stapels, rijen en binaire bomen

Hoofdstuk 3. Week 5: Sorteren. 3.1 Inleiding

Eerste Toets Datastructuren 11 juli 2018, , Educ-α.

Eerste Toets Datastructuren 22 mei 2019, , Educ-β en Megaron.

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 2 juni 2009, uur

Uitgebreide uitwerking Tentamen Complexiteit, juni 2018

Uitwerking tentamen Algoritmiek 9 juli :00 13:00

recursie Hoofdstuk 5 Studeeraanwijzingen De studielast van deze leereenheid bedraagt circa 6 uur. Terminologie

Negende college algoritmiek. 6/7 april Dynamisch Programmeren

Derde college algoritmiek. 23 februari Toestand-actie-ruimte

Derde college algoritmiek. 16/17 februari Toestand-actie-ruimte

Eerste Huiswerk Algoritmiek 18 februari 2015, uitwisselen, WerkCollege.

Tiende college algoritmiek. 3 mei Dynamisch programmeren Gretige Algoritmen Algoritme van Dijkstra

Datastructuren. Analyse van algoritmen. José Lagerberg. FNWI, UvA. José Lagerberg (FNWI, UvA) Datastructuren 1 / 46

Examen Datastructuren en Algoritmen II

Recursie: definitie. De som van de kwadraten van de getallen tussen m en n kan als volgt gedefinieerd worden:

Amorized Analysis en Union-Find Algoritmiek

Uitwerking tentamen Algoritmiek 10 juni :00 13:00

Discrete Structuren. Piter Dykstra Opleidingsinstituut Informatica en Cognitie

Twaalfde college complexiteit. 11 mei Overzicht, MST

Tweede college complexiteit. 12 februari Wiskundige achtergrond

Elke groep van 3 leerlingen heeft een 9 setje speelkaarten nodig: 2 t/m 10, bijvoorbeeld alle schoppen, of alle harten kaarten.

Opgaven Binair Zoeken en Invarianten Datastructuren, 4 mei 2016, Werkgroep.

Elfde college algoritmiek. 10 mei Algoritme van Dijkstra, Gretige Algoritmen

5 Afronden en afkappen

Datastructuren: stapels, rijen en binaire bomen

Tweede Toets Datastructuren 27 juni 2018, , Olympos Hal 2.

Opgaven Zoekbomen Datastructuren, 20 juni 2018, Werkgroep.

Algoritmen, Datastructuren en Complexiteit ( en ) Uitwerkingen

Hoofdstuk 7: Werken met arrays

Greedy algoritmes. Algoritmiek

Discrete Structuren. Piter Dykstra Sietse Achterop Opleidingsinstituut Informatica en Cognitie

Zesde college algoritmiek. 22 maart Backtracking

Datastructuren en algoritmen voor CKI

De doorsnede van twee verzamelingen vinden

Opgaven Zoekbomen Datastructuren, 15 juni 2016, Werkgroep.

Vijfde college algoritmiek. 17 maart Exhaustive search Graafwandelingen Backtracking

Examen Datastructuren en Algoritmen II

Combinatoriek groep 2

Tweede Toets Datastructuren 29 juni 2016, , Educ-Γ.

Discrete Structuren. Piter Dykstra Opleidingsinstituut Informatica en Cognitie

Eerste deeltoets Algoritmiek 4 maart 2015, , Educ-β.

Opgaven Recursie: Analyse en Master Theorem Datastructuren, 6 juni 2018, Werkgroep.

Programmeermethoden. Pointers. Walter Kosters. week 10: november kosterswa/pm/

Programmeermethoden NA. Week 6: Lijsten

public boolean equaldates() post: returns true iff there if the list contains at least two BirthDay objects with the same daynumber

10 Meer over functies

REEKS I. Zaterdag 6 november 2010, 9u

Examen Datastructuren en Algoritmen II

Heuristieken en benaderingsalgoritmen. Algoritmiek

Transcriptie:

Zevende college algoritmiek 24 maart 2016 Verdeel en Heers 1

Verdeel en heers 1 Divide and Conquer 1. Verdeel een instantie van het probleem in twee (of meer) kleinere instanties 2. Los de kleinere instanties op: meestal recursief 3. Combineer deze twee (of meer) oplossingen tot een oplossing van de oorspronkelijke (grotere) instantie Opmerking: meestal wordt een probleeminstantie in twee ongeveer gelijke delen verdeeld. 2

Schematisch (1) Verdeel en heers (vaak: verdeel in twee gelijke delen) 3

Verdeel en heers 2 Decrease and Conquer 1. Reduceer een instantie van het probleem tot een kleinere instantie van hetzelfde probleem 2. Los de kleinere instantie op: vaak recursief 3. Breid de oplossing van de kleinere probleeminstantie uit tot een oplossing van de oorspronkelijke instantie In het boek wordt onderscheid gemaakt tussen: Decrease by one Decrease by a constant factor Variable-size decrease 4

Schematisch (2) Decrease by one 5

Schematisch (3) Decrease by a constant factor (decrease by half) 6

Sorteren Verdeel en heers en sorteren: Sorteer(rij):: if ( de rij heeft meer dan één element ) then Verdeel de rij in twee stukken: linkerrij en rechterrij; Sorteer(linkerrij); Sorteer(rechterrij); Combineer linkerrij en rechterrij; fi. 7

Merge, Quick, Insertion Divide and conquer Mergesort 0 n n 1 2 1 n 2 p p p 0 s n 1 Quicksort Decrease and conquer (decrease by one) 0 n 2 Insertion sort 8

Mergesort Mergesort(A[0 n 1]):: // sorteert het array A[0..n 1] recursief // uitvoer: A[0..n 1] oplopend gesorteerd if n > 1 copieer(a[0 n 2 1],B[0 n 2 1]); copieer(a[ n 2 n 1],C[0 n 2 1]); Mergesort(B[0 n 2 1]); Mergesort(C[0 n 2 1]); Merge(B, C, A); fi. 9

Merge Merge(B[0 p 1],C[0 q 1],A[0 p+q 1]) :: // voegt 2 gesorteerde arrays B en C samen tot 1 gesorteerd array A i,j,k := 0; // voeg samen totdat een van de twee op is: ritsen while i < p and j < q do if B[i] C[j] then A[k] := B[i];k := k +1;i := i+1; else A[k] := C[j];k := k +1;j := j +1; od // en de rest if i = p then copieer C[j q 1] naar A[k p+q 1]; else copieer B[i p 1] naar A[k p+q 1]; fi. 10

Quicksort Quicksort(A[l r]):: // sorteert het (sub)array A[l r] recursief // uitvoer: A[l r] oplopend gesorteerd if l < r s :=Partitie(A[l r]); // s het splitspunt Quicksort(A[l s 1]); Quicksort(A[s+1 r]); fi. 11

Partitie Partitie Partitie(A[l r]) :: // partitioneert een (sub)array, met A[l] als spil (pivot) p := A[l]; i := l;j := r +1; repeat repeat i := i+1; until i > r or A[i] p; repeat j := j 1; until A[j] p; if i < j then if until i j; Wissel(A[i],A[j]); Wissel(A[l],A[j]); return j;. p p p 0 s n 1 12

Opgave 5.2.8. Probleem: reorganiseer de elementen van een gegeven array A zodanig dat alle negatieve elementen voorafgaan aan de positieve. Het algoritme moet lineair zijn en in situ. Hint: vergelijk Partitie. i = 0; j = n-1; while (i <= j) { if (A[i] < 0) i = i+1; else { wissel(a[i],a[j]); j = j-1; } } Variant (Dutch National Flag): gegeven een array met R, W en B. Reorganiseer het array zodat v.l.n.r. eerst alle R, dan de W en dan de B staan. Zie Levitin, opgave 5.2.9.a. 13

Decrease by one sorteren DECREASE by one & CONQUER Insertionsort(A[0 m 1]):: if m > 1 Insertionsort(A[0 m 2]); Voeg A[m 1] op de juiste plek in; fi. Invoegen van A[m 1] in het reeds gesorteerde voorstuk A[0] A[m 2] door van rechts naar links A[m 1] te vergelijken met A[i]. Deze recursieve versie komt overeen met de iteratieve versie zoals bij Programmeermethoden behandeld (zie ook Levitin): A[0] A[1]... A[i] A[i+1] A[m 3] A[m 2] A[m 1] kleiner of gelijk A[m 1] groter dan A[m 1] hier invoegen 14

Complexiteit Mergesort: - worst case complexiteit: Θ(n log n) - extra geheugen: O(n) Quicksort: - worst case complexiteit: Θ(n 2 ) voor (o.a.) het reeds gesorteerde rijtje - average case complexiteit: Θ(n log n) - extra geheugen: in situ Insertion sort: - worst case/average case complexiteit: Θ(n 2 ) - extra geheugen: in situ 15

Tromino puzzel 8x8 Nog een leuk voorbeeld van de methode Verdeel en heers is de Tromino puzzel, Levitin 5.1.11. Bedek een 2 n x2 n schaakbord waaruit één vakje mist met tromino s. Het 8x8 geval 16

Tromino puzzel 4x4 Het 4x4 geval: gegeven een 4x4 bord waaruit één vakje mist. Bedek het bord volledig (behalve het missende vakje), dus met 5 tromino s. 17

Tromino puzzel 4x4 Het 4x4 geval: twee probleeminstanties met oplossing (= bedekking) 18

Tromino puzzel 8x8 Het 8x8 geval: hoe vinden we een (de?) bedekking met tromino s? Bijvoorbeeld voor dit bord: 19

Tromino puzzel 8x8 Leg een tromino in het midden, zodat in elk kwart één stuk mist of bedekt is. Het probleem is nu teruggebracht tot vier keer hetzelfde probleem, maar dan voor 4x4 borden. 20

Tromino puzzel Doe weer hetzelfde (recursie!) met de 4x4 borden. Dit divide and conquer algoritme kun je op elk 2 n x2 n bord toepassen. 21

Grote integers Vermenigvuldiging van grote integers: Het voor de hand liggende algoritme gebruikt voor de vermenigvuldiging van twee getallen bestaande uit n-cijfers (digits) n 2 digit-vermenigvuldigingen 22

Grote integers Vermenigvuldiging van grote integers: Het voor de hand liggende algoritme gebruikt voor de vermenigvuldiging van twee getallen bestaande uit n-cijfers (digits) n 2 digit-vermenigvuldigingen Het kan echter op magische wijze beter (althans voor zeer grote getallen) via divide and conquer. Gebruik een generalisatie van de volgende truc (met n = 2): c = a b = (a 1 10 1 +a 0 ) (b 1 10 1 +b 0 ) = c 2 10 2 +c 1 10 1 +c 0 c 2 = a 1 b 1 c 0 = a 0 b 0 c 1 = (a 1 +a 0 ) (b 1 +b 0 ) (c 2 +c 0 ) Voor n = 2 zijn hier dus 3 i.p.v. 4 digit-vermenigvuldigingen gebruikt! 23

Grote integers: n = 2 k Voorbeeld n = 8: 87593264 49367251 = (8759 10 4 +3264) (4936 10 4 +7251) = c 2 10 8 +c 1 10 4 +c 0 c 2 = 8759 4936 c 0 = 3264 7251 c 1 = 8759 7251+3264 4936 = (8759+3264) (4936+7251) (c 2 +c 0 ) Het vermenigvuldigen van twee getallen bestaande uit n = 2 k bits is zo teruggebracht tot 3 keer hetzelfde probleem voor n/2 = 2 k 1. Als M(n) het aantal digitvermenigvuldigingen is voor n = 2 k, dan voldoet M(n) aan: M(n) = 3 M(n/2) als n > 1;M(1) = 1, en vinden we: M(n) = n lg3. 24

Closest Pair: divide Divide and Conquer: Verdeel de verzameling van n punten in twee verzamelingen P l en P r van elk n 2 punten door een geschikte lijn te trekken. Los beide deelproblemen (recursief) op en laat d de kleinst voorkomende afstand zijn tussen punten van P l resp. P r. P l P r 25

Closest Pair: conquer Controleer of er binnen de strip ter breedte 2d rondom de scheidslijn tussen P l en P r puntenparen (p,p ) zijn met p P l en p P r en onderlinge afstand kleiner dan d. Hiervoor blijken slechts O(n) puntenparen bekeken te moeten worden. Dit levert een O(nlgn) algoritme op. 26

Binaire bomen Een binaire boom B wordt recursief gedefinieerd als ofwel leeg, ofwel bestaande uit een knoop (de wortel) en twee disjuncte subbomen B L en B R die beide ook weer een binaire boom zijn: de linkersubboom en de rechtersubboom. B = wortel B L B R Bij (veel) problemen met binaire bomen ligt oplossen via divide & conquer dus voor de hand. 27

Verdeel en heers De hoogte van een binaire boom is het hoogste nivo dat voorkomt, waarbij de wortel per definitie op nivo 0 zit. Voor de hoogte van een binaire boom B geldt dus: hoogte(b) = 1+ max { hoogte(b L ), hoogte(b R ) } Verdeel en heers algoritme in C ++ : int hoogte( knoop * root ) { if ( root == NULL ) // lege boom return -1; else return ( 1 + max( hoogte( root->links ), hoogte( root->rechts ) ) } // hoogte 28

Decrease by one sorteren DECREASE by one & CONQUER Insertionsort(A[0 m 1]):: if m > 1 Insertionsort(A[0 m 2]); Voeg A[m 1] op de juiste plek in; fi. Invoegen van A[m 1] in het reeds gesorteerde voorstuk A[0] A[m 2] door van rechts naar links A[m 1] te vergelijken met A[i]. Deze recursieve versie komt overeen met de iteratieve versie zoals bij Programmeermethoden behandeld (zie ook Levitin): A[0] A[1]... A[i] A[i+1] A[m 3] A[m 2] A[m 1] kleiner of gelijk A[m 1] groter dan A[m 1] hier invoegen 29

Binair zoeken Binair zoeken is een voorbeeld van decrease and conquer, decrease by a constant factor. Hier de iteratieve versie. // invoer: oplopend gesorteerd array A[0..n 1], te zoeken waarde K // uitvoer: positie van K in A (-1 als K niet in A zit) l := 0;r := n 1; while l r do od m := l+r 2 ; if K = A[m] then // gevonden return m; else if K < A[m] then // links verder zoeken r = m 1; else // rechts verder zoeken fi l = m+1; fi l m r return 1; altijd links óf rechts verdergaan 30

Valse munt: probleem Fake coin probleem Gegeven n identiek uitziende munten. Eén ervan is vals. Bekend is dat de valse munt lichter is dan de andere. Tevens is een balans beschikbaar. Bepaal door weging de valse munt. 31

Valse munt: oplossing Decrease by a constant factor: verdeel de munten in twee stapels van n 2 en indien n oneven een losse munt. Als de twee stapels even zwaar zijn (best case) is de losse munt de valse. Zo niet, dan bevindt de valse zich in de lichtste van de twee stapels. Recurrente betrekking voor het aantal wegingen dat nodig is in de worst case om de valse munt te ontdekken: W(n) = W( n 2 )+1 als n > 1, W(1) = 0 Oplossing: W(n) = lgn. Zie Levitin excercise 4.5.10 voor een efficiënter decrease by a constant factor algoritme. 32

(Werk)college Lezen/leren bij dit college: Paragraaf 5 inl., 5.1-5.5 (geen Strassen, convex hull), 4 inl., 4.1, 4.4 Werkcollege: verdeel en heers donderdag 24 maart 2016, 13:45 15:30, in zaal Benoordenhout Opgaven: zie http://www.liacs.leidenuniv.nl/~vlietrvan1/algoritmiek/ Volgend college: donderdag 31 maart 2016 33