\documentclass{bschlangaul-aufgabe}
\bLadePakete{mathe}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Vergleich zweier Algorithmen},
  Thematik = {Algorithmen-Vergleich},
  Referenz = AUD.Algorithmische-Komplexitaet.Algorithmen-Vergleich,
  RelativerPfad = Module/30_AUD/50_Algorithmische-Komplexitaet/Aufgabe_Algorithmen-Vergleich.tex,
  ZitatSchluessel = aud:ab:7,
  ZitatBeschreibung = {Seite 1, Aufgabe 1: Komplexität},
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Algorithmische Komplexität (O-Notation)},
}

Seien \textbf{A} und \textbf{B} zwei Algorithmen, die dasselbe Problem
lösen. Zur Lösung von Problemen der Eingabegröße $n$ benötigt
Algorithmus \textbf{A} $500 \cdot n^2 - 16 \cdot n$ Elementoperationen
und \textbf{B} $\frac{1}{2} \cdot n^3 + \frac{11}{2} \cdot n + 7$
Elementoperationen.\index{Algorithmische Komplexität (O-Notation)}
\footcite[Seite 1, Aufgabe 1: Komplexität]{aud:ab:7}

\begin{align*}
A(n) & = 500 \cdot n^2 - 16 \cdot n \\
B(n) & = \frac{1}{2} \cdot n^3 + \frac{11}{2} \cdot n + 7\\
\end{align*}

\begin{enumerate}

%%
% (a)
%%

\item Wenn Sie ein Problem für die Eingabegröße $256$ lösen wollen,
welchen Algorithmus würden Sie dann wählen?

\begin{bAntwort}
Wir können die Aufgabe durch Einsetzen lösen, \dh wir berechnen explizit
die Anzahl benötigter Elementoperationen und vergleichen. Algorithmus
$A$ benötigt $500 \cdot n 2 -16 \cdot n$ Operationen bei einer Eingabe
der Größe $n$, also bei $n = 256$ genau

\begin{align*}
A(256)
&= 500 \cdot 256^2 - 16 \cdot 256 \\
&= 32763904
\end{align*}

In der gleichen Art können wir den Aufwand von Algorithmus B berechnen:

\begin{align*}
B(256)
&= \frac{1}{2} \cdot 256^3 + \frac{11}{2} \cdot 256 + 7 \\
&= 8390023
\end{align*}
In diesem Fall benötigt Algorithmus B also deutlich weniger Elementoperationen.
\end{bAntwort}

%%
% (b)
%%

\item Wenn Sie ein Problem lösen wollen, deren Eingabegröße immer
mindestens $1024$ ist, welchen Algorithmus würden Sie wählen? Begründen
Sie Ihre Antwort.

\begin{bAntwort}
Da in der Aufgabenstellung von Eingaben der Größe mindestens 1024 die
Rede ist, stellen wir uns die Frage, für welche $n$ Algorithmus $A$
schneller als $B$ ist, also für welche $n$

\begin{displaymath}
500 \cdot n^2 - 16 \cdot n < \frac{1}{2} \cdot n^3 + \frac{11}{2} \cdot n + 7
\end{displaymath}

gilt. Dies lässt sich äquivalent umformen zu

\begin{displaymath}
\frac{1}{2} \cdot n^3 - 500 \cdot n^2 + \frac{43}{2} \cdot n + 7 > 0
\end{displaymath}

Diese Ungleichung ist erfüllt, wenn allein $\frac{1}{2} \cdot n^3 - 500
\cdot n^2 > 0$ gilt, denn es gilt $\frac{43}{2} \cdot n + 7 > 0$. Das
Problem reduziert sich also zu

\begin{displaymath}
\frac{1}{2} \cdot n^3 - 500 \cdot n^2 > 0 \Leftrightarrow n > 1000
\end{displaymath}

Auf jeden Fall ist A schneller als B für $n > 1000$ (man erinnere sich,
dass das bei n = 256 noch andersherum war). Wie ist dieses Verhalten zu
erklären?

Obwohl der Aufwand von $A$ im O-Kalkül $\mathcal{O}(n^2)$ und der von
$B$ $\mathcal{O}(n^3)$ ist, man also geneigt sein könnte zu sagen, $A$
ist immer schneller als $B$, stimmt das nicht immer. Im Einzelfall
können es durchaus große Konstanten (wie in diesem Fall die 500) sein,
die dafür sorgen, dass $n$ erst einmal sehr groß werden muss, damit sich
die Laufzeiten tatsächlich so verhalten, wie erwartet. Wenn nur kleine
Eingaben verarbeitet werden sollen, kann es manchmal also durchaus
lohnenswert sein, einen $\mathcal{O}(n^3)$-Algorithmus anstatt eines
$\mathcal{O}(n^3)$-Algorithmus zu verwenden, wenn die im O-Kalkül
unterschlagenen Konstanten zuungunsten des eigentlich langsameren
Algorithmus sprechen.
\end{bAntwort}

\end{enumerate}

\end{document}
