# Algoritmeanalyse og optimering Algoritmeoptimisering og analyse samt praktiske implementationer ## Clean and run ```sh make clean; make; ./out/main ``` ## Emne / Koncept **Algoritmeoptimering og deres praktiske implementationer.** ## Vinkel Jeg vil undersøge hvilke metoder der almindelig bruges til at optimere algoritmer og hvordan man klassificerer de metoder. Efterfølgende vil jeg undersøge, hvordan matematik bruges til at analysere algoritmers tidskompleksitet med Theta, Omega og Big-Oh notation og spacekompleksitet ift. computerens RAM osv. Efterfølgende vil jeg også undersøge og udforske programmer, der bruges til at benchmarke og sammenligne algoritmer. Til sidst vil jeg undersøge og udforske, hvilke praktiske eksempler der findes på algoritmeoptimering i større softwareprojekter, og hvilke resultater det har givet. ## Problemformulering - Hvad er en algoritme? - Hvordan analyserer man en algoritme? - Hvordan kan man analysere algoritmer for at udvikle optimerede algoritmer til praktiske implementationer for at spare på tid og computerplads? - Hvordan regner man almindeligt ud og sammenligner tids- og space-kompleksiteter i den virkelige verden for algoritmer? - Hvilke praktiske softwareeksempler viser, at algoritmeoptimering har hjulpet projektet? ## Fag Til dette projekt har jeg tænkt mig at bruge **Programmering B** som mit studieretningsfag og **Matematik A** som mit A-fag. Grunden til, at jeg bruger programmering, er for at forklare kode og vise eksempler fra praktiske implementationer i virkeligheden. Jeg bruger Matematik A-faget til at forklare matematikken og analysere algoritmerne i matematisk forstand, og for at kunne sætte teori i brug til analysen af algoritmerne implementeret i Programmering. ## Metodiske overvejelser i forhold til indsamling af empiri For at finde viden vil jeg bruge metoden informationssøgning og bøger. For empiri og teori vil jeg læse *'Introductions to Algorithms'* (third edition), som giver indsigt i programmering og matematik i pseudokode, samt introduktionen til matematikken for at analysere algoritmers tids- og spacekompleksitet i computere. Følgende vil jeg lave informationssøgning på [https://ocw.mit.edu](https://ocw.mit.edu) og [https://google.com](https://google.com). ## Kilder Den eneste kilde, jeg har lige nu, er *'Introductions to Algorithms'*, da jeg har læst det meste af bogen. Ellers synes jeg, at emnet er spændende og vil derfor gerne undersøge mere. ## Spørgsmål - Hvad er de mest almindelige teknikker til algoritmeoptimering, og hvordan kan de klassificeres? - Hvordan påvirker valg af datastruktur effektiviteten af en algoritme? - Hvilke værktøjer og teknikker kan anvendes til at benchmarke og sammenligne forskellige algoritmer? - Hvordan kan parallelisering og caching anvendes til at forbedre ydeevnen af eksisterende algoritmer? - Hvilke praktiske eksempler findes der på algoritmeoptimering i store softwareprojekter, og hvad har været resultaterne?