De O notatie… Limiet van Bachmann-Landau: Paul Gustav Heidrich Bachmann Edmund Landau
De O-notatie Algemene lijn: Broncode analyseren. Herhalingsfrequentie bepalen. O-notatie afleiden. Regels O-notatie respecteren.
Regels O-notatie
De O-notatie…probleempjes 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.
Het Algoritme: voorwaarden Eindigheid: Een algoritme stopt na een eindig aantal instructies. Bepaaldheid: Iedere instructie wordt in een eindige hoeveelheid tijd uitgevoerd. Van iedere instructie is duidelijk wat deze doet.
Het Algoritme: voorwaarden Invoer: Een algoritme heeft een bepaalde invoer. Uitvoer: Een algoritme levert een bepaalde gespecificeerde uitvoer op. Effectiviteit: Iedere instructie in het algoritme dient relevant te zijn.
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 Men neme een ander algoritme: eindig(Foo) oneindig(Foo) Oneindig(Foo) eindig(Foo) Foo() if(eindig(Foo)) {blijf oneindig doorgaan} else{return}
Eindigheid van algoritmen Het algoritme Foo kan niet bestaan, vanwege zijn paradoxale karakter. Derhalve geldt het principe van logische contrapositie:
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;
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 van 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 predikatenlogica:
Recursie en bewijsvoering Predikaat P geldt voor getal b. Voor alle getallen groter dan b geldt: Als Predikaat P geldt voor k-1, dan geldt het ook voor k Predikaat P geldt voor alle Getallen groter of gelijk aan b.
Inductieve bewijsvoering Dit betekent: Bewijs de eigenschap (= het predicaat) voor een getal (b). Toon aan dat daaruit volgt dat 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.
Het kettinkje bouwen…
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); }
Zien dat het zo is….
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:
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 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: O- notatie:
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