De O-notatie Algemene lijn: Broncode analyseren Herhalingsfrequentie bepalen O-notatie afleiden
De herhalingsfrequentie “het aantal herhalingen in een algoritme.” Voorbeeld: Herhalingsfrequentie: O-notatie: for(int i=0;i<10000;i++) { for(j=0;j<n*n;j++) {schrijf weg;} }
Regels O-notatie
De O-notatie Wat nu? if(iets==1) {schrijf 1 keer weg;} else{ for(int i=0;i<n;i++) { schrijf weg; }
De O-notatie Bij if-else constructies complexiteitsontwikkeling onvoorspelbaar. Derhalve: Worst case gedrag bepalen Best case gedrag bepalen Indien mogelijk: statistiek en kansrekening gebruiken om gemiddelde gedrag te bepalen.
Eindigheid van algoritmen Heeft een probleem een oplossing? Hoe dit te bepalen? Programma? Kan dit?! eindig(algoritme x) if( algoritme x==eindig) return true else return false
Eindigheid van algoritmen Algoritme dat zichzelf analyseert: eindig(algoritme) oneindig(algoritme) Oneindig(algoritme) eindig(algoritme) Algoritme() if(eindig(algoritme) {blijf oneindig doorgaan} else{return}
Eindigheid van algoritmen Conclusie: Algoritme dat eindigheid van een algoritme bepaalt, bestaat niet. Er zijn algoritmen mogelijk, waarvan niet is vast te stellen of ze eindig zijn. Bijv: Foo(int x) while(x!=1) if(x%2==0){x/=2;} else{ x=((3*x)+1;)} return;
Filosoferen? Algoritme dat eindigheid van algoritme bepaalt. Ben je je bewust van je eigen bewustzijn? Ja? Hoeveel complexiteit is daarvoor nodig? Begrijpt een tafel dat ie een tafel is? Begrijpt Wessel zichzelf? Nee!
Soorten problemen Polynomiale problemen: Doenlijke problemen: Sorteren van kleingeld Sorteren van lijsten Algemeen: complexiteitsontwikkeling ≤ Niet polynomiale problemen: Ondoenlijk: Ingestort zandkasteel precies nabouwen. Kraken van 448 bit Blowfish encrypted bestand. Algemeen: complexiteitsontwikkeling:
Soorten problemen Misschien polynomiaal: Niet deterministisch polynomiaal: Misschien te doen…..misschien niet…. Irak Israël / Palestijnen Handelsreizigersprobleem Rugzakprobleem
Recursie en bewijsvoering Uitdaging: zo efficiënt mogelijke software schrijven. Opdracht: Schrijf een programma dat de optelsom alle gehele positieve getallen onder een gegeven n berekent.
Recursie en bewijsvoering Schrijf een programma dat de optelsom van alle gehele positieve getallen onder een gegeven n berekent. Functie(5) levert: =15 Functie(8) levert: =36
Recursie en bewijsvoering Oplossing: Complexiteitsontwikkeling? Wiskundige notatie? Welnu: Functie(int x) { int result=0 for(int i=1;i<=x;i++) {result+=i;} return result; }
Recursie en bewijsvoering Goh…. Misschien geldt: Eens kijken… n
Recursie en bewijsvoering n
Recursie en bewijsvoering Hoe te bewijzen dat: Met predicatenlogica:
Inductieve bewijsvoering Dit betekent: Bewijs de eigenschap (= het predicaat) voor een getal (b). Toon aan dat daaruit volgtdat de eigenschap ook geldt voor het volgende getal… Hoe dit te vertalen naar:
Inductie: Basisstap Gooi de eerste dominosteen om: Vul het getal 1 in, in de vergelijking: Eerste steen omgegooid…
Inductie: inductiestap Neem nu een willekeurig getal x: Doe dit ook voor de opvolger x+1:
Inductie: inductiestap Voor de opvolger geldt: Maar dat kan ook anders: Bouw hem op uit zijn voorganger:
Inductie: inductiestap Uit: Volgt dat:
Inductie: inductiestap We hebben nu 2 vergelijkingen voor de opvolger: En:
Inductie: inductiestap
Opvolger direct uitgeschreven: Opvolger opgebouwd uit zijn voorganger: Beide formules zijn gelijkwaardig: bewijs geleverd
Winst? We weten nu: Hiermee kunnen we ons algoritme herschrijven: Functie(int x) { int result=0 for(int i=1;i<=x;i++) {result+=i;} return result; } Functie(int x) { Return(float)1/2 x*(x+1); }
Winst? Veel winst! Functie(int x) { int result=0 for(int i=1;i<=x;i++) {result+=i;} return result; } Functie(int x) { Return(float)1/2 x*(x+1); }
Voorbeeld: Bresenham Cirkels tekenen op een monitor… Onmogelijk vanwege het discrete karakter van monitoren. Derhalve: genoegen nemen met een benadering.
De cirkel: een definitie Een cirkel = een verzameling punten die allemaal op een gegeven afstand r liggen van een centraal punt. r y x
De cirkel: eigenschappen De relatie tussen een punt op de rand en het centrum: Pythagoras r
Een cirkel tekenen… Loop over de x- as en bereken de bijbehorende y- coördinaat op basis van de straal:
Een cirkel tekenen… Problemen: De cirkel wordt niet mooi gesloten getekend… Ieder punt kost nogal wat rekenkracht. Gebroken getallen zijn niet zo netjes en leiden mogelijk tot afrondingsfouten.
Een cirkel tekenen… Een andere methode: poolcoördinaten. r
Een cirkel tekenen… Poolcoördinaten: problemen: Hoekberekening vormt een gebroken getal. Gebruik van goniometrische functies…
Goniometrie in een computer Goniometrische functies volgens Taylor:
Een cirkel tekenen: Bresenham Een cirkel is symmetrisch… Teken 1/8 deel van de cirkel en construeer de rest volgens herhaald spiegelen.
Een cirkel tekenen: Bresenham Definieer een cirkelfunctie: Punt (x,y) op cirkel met straal r? functiewaarde=0 Punt (x,y) binnen de cirkel? functiewaarde <0 Punt (x,y) buiten de cirkel? functiewaarde >0
Bresenham: recursie… 2 mogelijkheden voor het volgende pixel… evaluatiepunt
Bresenham: recursie… Hebben we getekend: Dan wordt de volgende: OF
Bresenham: recursie… Evalueer de cirkelfunctie op het evaluatiepunt teneinde de y- coördinaat van de opvolger te kunnen berekenen:
Bresenham: recursie… Evaluatiepunt binnen cirkel? Teken: Evaluatiepunt buiten cirkel? Teken:
Bresenham: recursie… Evalueer cirkelfunctie voor “de opvolger van de opvolger”:
Bresenham: recursie… Ofwel:
Bresenham: recursie code int circleMidpoint(int xC,int yC,int radius) { int x=0,y=radius; int p = 1-radius; While(x<y) { x++; if(p<0) { p+=2*x+1; } else { y--; p+=2*(x-y)+1; }
Recursie en de O-notatie De torens van Hanoi
Recursie en de O-notatie De torens van Hanoi Stappen: 0
Recursie en de O-notatie De torens van Hanoi Stappen: 1
Recursie en de O-notatie De torens van Hanoi Stappen: 2
Recursie en de O-notatie De torens van Hanoi Stappen: 3
Recursie en de O-notatie De torens van Hanoi Stappen: 4
Recursie en de O-notatie De torens van Hanoi Stappen: 5
Recursie en de O-notatie De torens van Hanoi Stappen: 6
Recursie en de O-notatie De torens van Hanoi Stappen: 7
Recursie en de O-notatie De torens van Hanoi 0 stappen
Recursie en de O-notatie De torens van Hanoi T(n-1) stappen
Recursie en de O-notatie De torens van Hanoi T(n-1)+1 stappen
Recursie en de O-notatie De torens van Hanoi 2T(n-1)+1 stappen
Recursie en O-notatie Recurrente betrekking: Wat is van deze betrekking de complexiteitsontwikkeling?
Recursie en O-notatie Verband: Dit is te herschrijven middels introductie van een nieuwe functie:
Recursie en O-notatie Substitueren:
Recursie en O-notatie Verdubbeling bij iedere stap; Dit levert:
Recursie en O-notatie Verdubbeling bij iedere stap; Dit levert:
Recursie en de O-notatie De torens van Hanoi Alle schijven moeten via middelste paal.
Recursie en de O-notatie De torens van Hanoi 0 stappen
Recursie en de O-notatie De torens van Hanoi T(n-1) stappen
Recursie en de O-notatie De torens van Hanoi T(n-1) +1 stappen
Recursie en de O-notatie De torens van Hanoi 2T(n-1) +1 stappen
Recursie en de O-notatie De torens van Hanoi 2T(n-1) +2 stappen
Recursie en de O-notatie De torens van Hanoi 3T(n-1) +2 stappen
Sorteren Bubblesort Insertionsort Arraysort Mergesort Quicksort E.v.a.
Sorteren Bubblesort Nogal dom algoritme… Complexiteitsontwikkeling:
Bubblesort Werking: Vergelijk eerste 2 elementen
Bubblesort Werking: Vergelijk eerste 2 elementen A>B? Verwissel A<B? Doe niets
Bubblesort Werking: Vergelijk volgende 2 elementen A>B? Verwissel A<B? Doe niets
Bubblesort Werking: Vergelijk volgende 2 elementen A>B? Verwissel A<B? Doe niets
Bubblesort Werking: Vergelijk volgende 2 elementen A>B? Verwissel A<B? Doe niets
Bubblesort Werking: Vergelijk volgende 2 elementen A>B? Verwissel A<B? Doe niets
Bubblesort Werking: Vergelijk volgende 2 elementen A>B? Verwissel A<B? Doe niets
Bubblesort Werking: Vergelijk volgende 2 elementen A>B? Verwissel A<B? Doe niets
Bubblesort Werking: Vergelijk volgende 2 elementen A>B? Verwissel A<B? Doe niets
Bubblesort Werking: Vergelijk volgende 2 elementen A>B? Verwissel A<B? Doe niets
Bubblesort Werking: Vergelijk volgende 2 elementen A>B? Verwissel A<B? Doe niets
Bubblesort Werking: Vergelijk volgende 2 elementen A>B? Verwissel A<B? Doe niets
Bubblesort Werking: Vergelijk volgende 2 elementen A>B? Verwissel A<B? Doe niets
Bubblesort Werking: Vergelijk volgende 2 elementen A>B? Verwissel A<B? Doe niets
Bubblesort Werking: Vergelijk volgende 2 elementen A>B? Verwissel A<B? Doe niets
Bubblesort En opnieuw….(zucht…) Vergelijk volgende 2 elementen A>B? Verwissel A<B? Doe niets
mergesort Iets slimmer… Werking: Neem 2 reeds gesorteerde arrays:
mergesort Werking: Neem 2 reeds gesorteerde arrays: En een derde… nadeel: geheugen!
mergesort Werking: vergelijk
mergesort Werking: Schrijf de kleinste weg
mergesort Werking: Vergelijk volgende
mergesort Werking: En schrijf kleinste weg…
mergesort Werking: Vergelijk volgende…
mergesort Waar komen die 2 gesorteerde lijsten aan het begin vandaan? Antwoord: roep mergesort recursief aan, totdat je lijsten van grootte 1 hebt verkregen
quicksort Slim algoritme Complexiteitsontwikkeling: Gebaseerd op partitionering m.b.v. Pivot
quicksort Werking: lowerupper Pivotwaarde: 6
quicksort Werking: lowerupper Pivotwaarde: 6 Zoek vanaf lower naar waarde hoger dan pivot
quicksort Werking: lowerupper Pivotwaarde: 6 Gevonden!
quicksort Werking: lowerupper Pivotwaarde: 6 Zoek vanaf upper naar waarde kleiner dan pivot
quicksort Werking: lowerupper Pivotwaarde: 6 Gevonden
quicksort Werking: lowerupper Pivotwaarde: 6 Verwissel beide
quicksort Werking: lowerupper Pivotwaarde: 6 Verwissel beide
quicksort Werking: lowerupper Pivotwaarde: 6 Ga verder: Zoek vanaf lower waarde groter dan pivot
quicksort Werking: lowerupper Pivotwaarde: 6 Ga verder: Zoek vanaf lower waarde groter dan pivot
quicksort Werking: lowerupper Pivotwaarde: 6 Ga verder: Zoek vanaf lower waarde groter dan pivot
quicksort Werking: lowerupper Pivotwaarde: 6 Ga verder: Zoek vanaf lower waarde groter dan pivot
quicksort Werking: lowerupper Pivotwaarde: 6 Ga verder: Zoek vanaf lower waarde groter dan pivot
quicksort Werking: lowerupper Pivotwaarde: 6 Ga verder: Zoek vanaf lower waarde groter dan pivot
quicksort Werking: lowerupper Pivotwaarde: 6 gevonden
quicksort Werking: lowerupper Pivotwaarde: 6 Zoek vanaf upper naar waarde kleiner dan pivot