Progra-MEER - Leuven 20 maart 2018 Bart Demoen KU Leuven Veerle Fack UGent Frank Neven/Wim Lamotte UHasselt schooljaar 2017-2018
Vandaag... 2/33 waar staan we i.v.m. 24 april? werkblad met twee thema s en af en toe wat Python uitleiding tussendoor: groepsfoto
De werkbladen 3/33 zie werkbladen
3 munten I 4/33 KKK MMK MMM KKM MKM KMM MKK KMK
3 munten II 5/33 def munten(): done, nog = [], [( k, k, k )] while nog!= []: x = nog.pop() done.append(x) n = buren(x) for y in n: if y not in done: nog.append(y) return(( m, m, m ) in done) def buren(x): (a,b,c) = x return([(a,om(b),om(c)), (om(a),b,om(c)), (om(a),om(b),c)]) def om(a): if a == k : return( m ) return( k )
De boer, de wolf, de geit en de kool I 6/33 een graaf met als knopen: wie zit op de linkeroever verbind twee knopen als die overgang mogelijk is zoek pad van bwgk naar de lege knoop
De boer, de wolf, de geit en de kool I 6/33 een graaf met als knopen: wie zit op de linkeroever verbind twee knopen als die overgang mogelijk is zoek pad van bwgk naar de lege knoop
De boer, de wolf, de geit en de kool II 7/33 def bwgk(): b,w,g,k = "boer","wolf","geit","kool" done = [] nog = [[b,w,g,k]] while nog!= []: x = nog.pop() done.append(x) n = buren(nog) for y in n: if y not in done: nog.append(y) return([] in done)
Gemeenschappelijk aan munten en BWGK 8/33 modelleer als grafenprobleem los daarin op bereikbaarheid één programma - lichte varianten merk op: je hoeft de graaf niet helemaal op te stellen voor hoe vraag: het pad bijhouden / kortste pad zoeken...
De gevaarlijke oversteek van de 4 wandelaars I 9/33 modelleer als grafenprobleem een situatie een knoop de tijd van 1 situatie naar de andere is het gewicht van de boog gewicht van de bogen is nu niet constant zoek een pad niet langer dan 17 systematische aanpak? voor kortste pad?
De gevaarlijke oversteek van de 4 wandelaars II 10/33
De gevaarlijke oversteek van de 4 wandelaars III 11/33
De gevaarlijke oversteek van de 4 wandelaars IV 12/33 a en b met z naar overkant: 2 a met z: 1 c en d en z: 10 b en z: 2 a en b: 2
Systematiek in zoeken kortste pad? 13/33 probeer op het werkblad...
intentioneel leeg... 14/33
Verdeel en heers 15/33 de kracht van opdelen en combineren deelproblemen - deeloplossingen onverwachte toepasssingen soms verkeerde verwachtingen algemene idee: deel probleem in twee (of meer) los elk deelprobleem op combineer resultaten met kleine kost
Verdeel en heers 15/33 de kracht van opdelen en combineren deelproblemen - deeloplossingen onverwachte toepasssingen soms verkeerde verwachtingen algemene idee: deel probleem in twee (of meer) los elk deelprobleem op combineer resultaten met kleine kost
Verdeel en heers 16/33 deel probleem in twee (of meer) los elk deelprobleem op combineer resultaten met kleine kost totale kost(n) = 2 totale kost(n/2) + kleine combinatie kost(n) kleine combinatie kost(n) = constant: totale kost(n) = O(log(N)) N: totale kost(n) = O(Nlog(N)) ook mogelijk: totale kost(n) = totale kost(n/2) + kleine combinatie kost(n)
Verdeel en heers 16/33 deel probleem in twee (of meer) los elk deelprobleem op combineer resultaten met kleine kost totale kost(n) = 2 totale kost(n/2) + kleine combinatie kost(n) kleine combinatie kost(n) = constant: totale kost(n) = O(log(N)) N: totale kost(n) = O(Nlog(N)) ook mogelijk: totale kost(n) = totale kost(n/2) + kleine combinatie kost(n)
Verdeel en heers: machten berekenen I 17/33 5 13... met 12 vermenigvuldigingen of minder... de gelijkheden: of a 2n = a n a n a 2n+1 = a a 2n indien n even is: a n = a n/2 a n/2 indien n oneven is: a n = a a n 1 aantal vermenigvuldigingen daalt van n 1 naar log(n)
Verdeel en heers: machten berekenen I 17/33 5 13... met 12 vermenigvuldigingen of minder... de gelijkheden: of a 2n = a n a n a 2n+1 = a a 2n indien n even is: a n = a n/2 a n/2 indien n oneven is: a n = a a n 1 aantal vermenigvuldigingen daalt van n 1 naar log(n)
Verdeel en heers: machten berekenen II 18/33 indien n even is: a n = a n/2 a n/2 indien n oneven is: a n = a a n 1 in Python: nog een basisgeval erbij! def macht(a,n): if n == 1: return(a) if n % 2 == 0: # even n x = macht(a,n//2) return(x*x) else: # oneven n return(a*macht(a,n-1))
Verdeel en heers: machten berekenen III 19/33 nog niet optimaal, maar wel al heel efficiënt optimaliteit vereist dat je een NP-compleet probleem oplost :-( zie https://en.wikipedia.org/wiki/addition_chain
Verdeel en heers: vermenigvuldigen I 20/33 Een voorbeeld: (10a + b) (10c + d) = 100a b + 10(a d + b c) + b d 4 vermenigvuldigingen als de getallen 2 lang zijn voor getallen van n lang, n 2 vermenigvuldigingen plus wat optellingen (kosten weinig) 100 en 10 zijn shifts (kosten weinig) de kost zit in de vermenigvuldigingen kan het met essentieel minder dan n 2 vermenigvuldigingen? Andrey Kolmogorov beweerde van niet zijn student Anatoly Karatsuba verbaasde de wereld
Verdeel en heers: vermenigvuldigen I 20/33 Een voorbeeld: (10a + b) (10c + d) = 100a b + 10(a d + b c) + b d 4 vermenigvuldigingen als de getallen 2 lang zijn voor getallen van n lang, n 2 vermenigvuldigingen plus wat optellingen (kosten weinig) 100 en 10 zijn shifts (kosten weinig) de kost zit in de vermenigvuldigingen kan het met essentieel minder dan n 2 vermenigvuldigingen? Andrey Kolmogorov beweerde van niet zijn student Anatoly Karatsuba verbaasde de wereld
Verdeel en heers: vermenigvuldigen I 20/33 Een voorbeeld: (10a + b) (10c + d) = 100a b + 10(a d + b c) + b d 4 vermenigvuldigingen als de getallen 2 lang zijn voor getallen van n lang, n 2 vermenigvuldigingen plus wat optellingen (kosten weinig) 100 en 10 zijn shifts (kosten weinig) de kost zit in de vermenigvuldigingen kan het met essentieel minder dan n 2 vermenigvuldigingen? Andrey Kolmogorov beweerde van niet zijn student Anatoly Karatsuba verbaasde de wereld
Verdeel en heers: vermenigvuldigen II 21/33 (10a + b) (10c + d) = 100a c + 10(a d + b c) + b d = 100A + 10B + C A = a*c C = b*d B = (a+b)*(c+d) - A - C 3 vermenigvuldigingen ipv 4! iets meer optellingen niet meer n 2 maar n log 2(3) of ongeveer n 1.585 voor getallen van 1000 cijfers, van 1.000.000 naar 60.000
Verdeel en heers: vermenigvuldigen II 21/33 (10a + b) (10c + d) = 100a c + 10(a d + b c) + b d = 100A + 10B + C A = a*c C = b*d B = (a+b)*(c+d) - A - C 3 vermenigvuldigingen ipv 4! iets meer optellingen niet meer n 2 maar n log 2(3) of ongeveer n 1.585 voor getallen van 1000 cijfers, van 1.000.000 naar 60.000
Verdeel en heers: kortste afstand tussen welke twee punten? I 22/33 N punten in het vlak naief algo voor elke paar punten, bereken (euclidische) afstand onthoud de kortste er zijn N (N 1)/2 paren, dus een O(N 2 ) algoritme kan het beter?
Verdeel en heers: kortste afstand tussen welke twee punten? II 23/33 A B verdeel de punten in twee verzamelingen A en B - ongeveer even groot (je wil daarvoor eerst sorteren volgens de x-coordinaat) los (recursief) het probleem op voor A en B neem daarvan het paar met de kortste afstand: lijm nu alles aan elkaar...
Verdeel en heers: kortste afstand tussen welke twee punten? III 24/33 A B enkel nodig om punten binnen de zone te beschouwen: telkens eentje in A en eentje in B binnen die zone liggen bewijsbaar weinig punten resulteert in O(Nlog(N)) ipv O(N 2 )
Verdeel en heers: kortste afstand tussen welke twee punten? III 24/33 A B enkel nodig om punten binnen de zone te beschouwen: telkens eentje in A en eentje in B binnen die zone liggen bewijsbaar weinig punten resulteert in O(Nlog(N)) ipv O(N 2 )
Verdeel en heers: kortste afstand tussen welke twee punten? III 24/33 A B enkel nodig om punten binnen de zone te beschouwen: telkens eentje in A en eentje in B binnen die zone liggen bewijsbaar weinig punten resulteert in O(Nlog(N)) ipv O(N 2 )
Verdeel en heers: zoeken in een geordende rij 25/33 bepaal of een getal in een rij getallen zit als de rij geordend is de rij heeft lengte N dat kunnen jullie? lineair zoeken: O(N) binair zoeken: O(log(N))
Verdeel en heers: zoeken in een geordende rij 25/33 bepaal of een getal in een rij getallen zit als de rij geordend is de rij heeft lengte N dat kunnen jullie? lineair zoeken: O(N) binair zoeken: O(log(N))
Verdeel en heers: een rij van lengte N ordenen van klein naar groot I 26/33 merge-sort def mergesort(l): hulp = l.copy() msort(hulp,l,0,len(l)) def msort(l,hulp,begin,einde): if begin - einde < 2: return midden = (einde - begin)//2 msort(hulp,l,begin,midden) msort(hulp,l,midden+1,einde) merge(l,begin,midden,einde,hulp) altijd Nlog(N)
Verdeel en heers: een rij van lengte N ordenen van klein naar groot I 26/33 merge-sort def mergesort(l): hulp = l.copy() msort(hulp,l,0,len(l)) def msort(l,hulp,begin,einde): if begin - einde < 2: return midden = (einde - begin)//2 msort(hulp,l,begin,midden) msort(hulp,l,midden+1,einde) merge(l,begin,midden,einde,hulp) altijd Nlog(N)
Verdeel en heers: een rij ordenen van lengte N van klein naar groot II 27/33 quick-sort def qsort(l): if len(l) < 2: return split(l,l[0],kleiner,groter) qsort(kleiner) # onvolledig! qsort(groter) # onvolledig! soms O(N 2 ), maar gemiddeld ook Nlog(N)
Verdeel en heers: een rij ordenen van lengte N van klein naar groot II 27/33 quick-sort def qsort(l): if len(l) < 2: return split(l,l[0],kleiner,groter) qsort(kleiner) # onvolledig! qsort(groter) # onvolledig! soms O(N 2 ), maar gemiddeld ook Nlog(N)
Welke is beter? 28/33 quicksort: in-place (uitdaging!) niet stabiel soms slechte O(N 2 ) mergesort: kan niet in-place stabiel altijd O(Nlog(N))
Belangrijk: hoeveel data wordt verplaatst? 29/33 bij sorteren van grote items, beter hun indexen sorteren dan hun waarden [gc, ga, gb] niet aanpassen vertrek van rij indexen [1, 2, 3] gesorteerde rij is bv [2, 3, 1]
Uitleiding I: wat hebben jullie geleerd? hopelijk... 30/33 programmeren = algoritme ontwerpen + coderen coderen is het minste maar bevredigt meest J agis, et puis je réfléchis 1 werkt niet principe van gulzigheid en vb n waar het (niet) werkt dynamisch programmeren een vergelijking vat alle essentie een efficiënte implementatie gebruikt memoing veel problemen modelleren als een probleem van grafen wat verdeel-en-heers voorbeelden bewijzen van correctheid en eindigheid iets over efficiëntie en complexiteit en niet elk probleem heeft een algoritmische oplossing 1 Achilles Van Acker
Uitleiding II: wat nu nog? 31/33 24 april: afsluitende sessie Progra-MEER doe een bijdrage: timing volgt per email poster werkbundel aanwezigheid/interactie schrijf in en breng geïnteresseerden mee vul ook de afsluitende vragenlijst van Google in (zie onze website)
24 april: gevangenis van Hasselt 32/33 samen met jullie collegas die in Gent/Hasselt iets meededen 10.30: onthaal met koffie en koeken Welkomstwoord Kennismaking met de Microbit Moodle platform voor computationeel denken Dodona platform voor Python Dwenguino programmeren 13u00: Walking lunch & Postersessie Robots komen in vrede: een overzicht van artificiële intelligentie Internet of Things: iedereen programmeur Meer Big Data minder storende reclame 15.30: koffie en limburgse taart
Mijn vraag aan jullie... 33/33 Suggesties voor de toekomst?