diff --git a/verslag/verslag.tex b/verslag/verslag.tex index 28e2762..475ec92 100644 --- a/verslag/verslag.tex +++ b/verslag/verslag.tex @@ -85,7 +85,7 @@ \subsection{Doorlooplijnalgoritme $O((N+S)log_2(N))$} - Het derde en laatst beschouwde algoritme is een variant op algoritme \ref{algo2}, maar dan met efficiƫntere gegevensstructuren. Het concept hierbij is hetzelfde, maar in plaats van het nagaan van de snijpunten met alle andere actieve cirkels, worden de actieve cirkels gesorteerd in een binaire boom-structuur op basis van de volgorde waarin ze de doorlooplijn snijden. Dit werkt omdat vlak voor de snijding van twee cirkels, deze opeenvolgende cirkels zijn. De binaire boom-structuur garandeert een complexiteit van $log_2(N)$ voor het zoeken in de boom. Aangezien er $N$ cirkels zijn en er voor deze $N$ telkens de voorganger en opvolger gezocht dient te worden, vinden we een complexiteit van $2Nlog_2(N)$. Dit is $O(Nlog_2(N))$ en dus zeker ook $O((N+S)log_2(N))$. + Het derde en laatst beschouwde algoritme is een variant op algoritme \ref{algo2}, maar dan met efficiƫntere gegevensstructuren. Het concept hierbij is hetzelfde, maar in plaats van het nagaan van de snijpunten met alle andere actieve cirkels, worden de actieve cirkels gesorteerd in een binaire boom-structuur op basis van de volgorde waarin ze de doorlooplijn snijden. Dit werkt omdat vlak voor de snijding van twee cirkels, deze opeenvolgende cirkels zijn. De binaire boom-structuur garandeert een complexiteit van $log_2(N)$ voor het zoeken in de boom. Aangezien er $N$ cirkels zijn en er voor deze $N$ telkens de voorganger en opvolger gezocht dient te worden, waarna we de snijpunten ook toevoegen en de buren ervan zoeken, vinden we een complexiteit van ongeveer $(2N + 2S)log_2(N)$. Dit is $O((N + S)log_2(N))$. \begin{algorithm}[H] \{$cirkels$: lijst van cirkels met een middelpunt en een straal\}\\ @@ -125,7 +125,7 @@ \section{Beschrijving experimenten}\label{exp} - Om de complexiteit van de algoritmen na te gaan, voeren we experimenten op een toenemend aantal cirkels uit. We starten met $2$ cirkels en verdubbelen steeds het aantal. Bij elk aantal voeren we voor elk algoritme $100$ testen uit, meten de tijd die het algoritme erover doet en nemen het gemiddelde. Dit herhalen we tot $32.768$ cirkels voor het simpele algoritme en tot $262.144$ cirkels voor de andere algoritmes, aangezien we dan voldoende informatie hebben om de complexiteit aan te tonen, zonder onnodig langdurige experimenten uit te moeten voeren. Deze gemiddelde tijd kunnen we dan plotten in functie van het aantal cirkels en deze vergelijken met de grafiek van de complexiteit die we verwachten. + Om de complexiteit van de algoritmen na te gaan, voeren we experimenten op een toenemend aantal cirkels uit. We proberen het aantal snijpunten constant te houden door de straal te nemen als $1/N$. We starten met $2$ cirkels en verdubbelen steeds het aantal. Bij elk aantal voeren we voor elk algoritme $100$ testen uit, meten de tijd die het algoritme erover doet en nemen het gemiddelde. Dit herhalen we tot $32.768$ cirkels voor het simpele algoritme en tot $262.144$ cirkels voor de andere algoritmes, aangezien we dan voldoende informatie hebben om de complexiteit aan te tonen, zonder onnodig langdurige experimenten uit te moeten voeren. Deze gemiddelde tijd kunnen we dan plotten in functie van het aantal cirkels en deze vergelijken met de grafiek van de complexiteit die we verwachten. \subsection{Alternatieve benadering} Het enige probleem met het vergelijken van de voorgenoemde plots is dat we ze moeilijk op eenzelfde grafiek kunnen plaatsen omdat de grootte-orde van tijden ten opzichte van aantallen sterk verschillen. Om geen schaalfactor in te moeten voeren, kiezen we daarom voor een andere manier om het verloop van de tijd te bepalen, namelijk het doubling ratio experiment. Hierbij verdubbelen we steeds de invoerwaarde - in dit geval het aantal cirkels - en berekenen de verhouding waarmee de gemeten tijd elke keer toeneemt. Deze verhouding is de doubling ratio. We doen daarna hetzelfde voor de functie die de tijdscomplexiteit voorstelt, bijvoorbeeld $Nlog_2(N)$. Wanneer we van al deze verhoudingen het gemiddelde nemen, hebben we dan twee getallen om met elkaar te vergelijken, in plaats van grafieken.\\ @@ -175,7 +175,7 @@ \end{figure} \subsection{Doorlooplijnalgoritme $O((N+S)log_2(N))$} - Om de rekentijd van het derde algoritme na te gaan, maken we opnieuw gebruik van een doubling ratio experiment. We gaan na wat de doubling ratio van de verwachte complexiteit is en wat de doubling ratio van de testwaarden is. In dit geval zien we in de derde kolom van tabel \ref{tab3} de doubling ratio van onze testwaarden en in de vijde kolom de doubling ratio van $Nlog_2(N)$. Het gemiddelde van de ratio's van onze testwaarden is $2.33$ en dat van $Nlog_2(N)$ is $3.06$, wat op een tragere stijging van onze testwaarden dan de $Nlog_2(N)$-functie wijst. + Om de rekentijd van het derde algoritme na te gaan, maken we opnieuw gebruik van een doubling ratio experiment. We gaan na wat de doubling ratio van de verwachte complexiteit is en wat de doubling ratio van de testwaarden is. In dit geval zien we in de derde kolom van tabel \ref{tab3} de doubling ratio van onze testwaarden en in de vijde kolom de doubling ratio van $Nlog_2(N)$. Het gemiddelde van de ratio's van onze testwaarden is $2.33$ en dat van $Nlog_2(N)$ is $3.06$, wat op een tragere stijging van onze testwaarden dan de $Nlog_2(N)$-functie wijst. Dit kunnen we verklaren doordat het aantal snijpunten constant wordt gehouden. \begin{figure}[H] \centering