diff --git a/102_Asymptotische_Schranken.tex b/102_Asymptotische_Schranken.tex index 0a12e1a8cc30faca42cf64037300fb04b02001ac..2567637cb0e7b7b3f0ef4e0a88d793a992fca813 100644 --- a/102_Asymptotische_Schranken.tex +++ b/102_Asymptotische_Schranken.tex @@ -8,7 +8,7 @@ Programms als auch der Speicherbedarf $S(n)$ meist durch \emph{asymptotische Sch Wir schließen das Kapitel mit einer formaleren Definition, wie wir die Laufzeit (und Speicherverbrauch) eines Programms in Abhängigkeit von der Inputlänge $n$ beschreiben: \begin{definition}[Laufzeit $T(n)$ und Speicherverbrauch $S(n)$] - Sei $I$ der Input für unseren Algorithmus, $\abs{I} < \infty$ die Größe des Inputs. Sei $T(I) \in \mathbb{R}^+$ die + Sei $I$ der Input für unseren Algorithmus, $\abs{I} < ∞$ die Größe des Inputs. Sei $T(I) \in \mathbb{R}^+$ die Laufzeit, die unser Algorithmus für Input $I$ benötigt. Dann definieren wir \begin{itemize} \item $T_{\text{wc}}(n) = \max\{T(I) : \abs{I} = n\}$ ist die \emph{worst case} Laufzeit. @@ -133,108 +133,21 @@ Man sieht direkt, dass f \in \Theta(g) \Leftrightarrow f \in \mathcal{O}(g) \text{ und } f \in \Omega(g). \] -Wir können nun direkt mit dieser Definition den Asymptotischen Aufwand von $T^{\text{is}}_{\text{avg}}(n)$ +Wir können nun direkt mit dieser Definition den Asymptotischen Aufwand von $T^{\text{is}}_{\text{bc}}(n)$ klassifizieren: -\begin{example}[$T^{\text{is}}_{\text{avg}} \in \Theta(n^2)$] - Zuerst zeigen wir, dass $T^{\text{is}}_{\text{avg}} = a_2 n^2 + a_1 n + a_0 \in \mathcal{O}(n^2)$: - - Gesucht werden $c \in \mathbb{R}^+, n_0 \in \mathbb{N}$ sodass für alle $n > n_0:$ - \[ - a_2 n^2 + a_1 n + a_0 \leq c n^2. - \] - Wähle mit $m = \max(\{a_0, a_1, a_2\})$ die Konstante $c = 3m$. Dann gilt für $n > 1$: - \begin{align*} - c n^2 - &= mn^2 + mn^2 + mn^2 \\ - &\geq a_2 n^2 + a_1 n + a_0, - \end{align*} - da $n^2 \geq n$ und $n^2 \geq 1$ für alle $n > 1$. - - Für $T^{\text{is}}_{\text{avg}} \in \Omega(n^2)$ nehmen wir noch an, dass $a_0, a_1, a_2 > 0$. Dann ist mit $c = a_2$ - klar: +\begin{example}[$T^{\text{is}}_{\text{bc}} \in O(n)$] + Die best-case-Laufzeit von $\texttt{insertionsort}$ ist $T^{\text{is}}_{\text{bc}}(n) = w_0 + w_1 n$. + Es gilt \[ - c n^2 \leq a_2 n^2 + a_1 n + a_0 \text{ für alle } n \geq 0. + w_0 + w_1 n ≤ n + w_1 n = (w_1 + 1) n \text{ für alle } n ≥ w_0. \] - Auch ohne die Einschränkung $a_0, a_1, a_2 > 0$ gilt $T^{\text{is}}_{\text{avg}} \in \Theta(n^2)$, aber es ist eine - für Laufzeitfunktionen sinnvolle Einschränkung. + Setzen wir als $c = w_1 + 1$ und $n_0 = w_0$, so gilt $w_0 + w_1 n ≤ c n$ für alle $n ≥ n_0$ und damit + $T^{\text{is}}_{\text{bc}} \in Θ(n)$. \end{example} +Dieses Beispiel zeigt, das man die Quantorendefinition zwar direkt nutzen kann, aber dabei jedes mal nachdenken muss, +wie $c$ und $n_0$ geschickt zu wählen sind. -\begin{example}[$6n^3 \notin \mathcal{O}(n^2)$] - Als nächstes schauen wir, ob $6n^3$ asymptotisch langsamer wächst als $n^2$. Gehen wir also davon aus, dass es - $c \in \mathbb{R}^+$ und $n_0 \in \mathbb{N}$ gäbe, sodass $6n^3 \leq cn^2$ für alle $n > n_0$. Dann können wir die - Ungleichung aber mit $\frac{1}{6n^2}$ multiplizieren und hätten $n \leq \frac{c}{6}$ für alle $n > n_0$. Da $c$ eine - Konstante ist, ist dies ein Widerspruch. -\end{example} - -Betrachten wir nun ein spannenderes Beispiel: Ist $\ln(n) \in \mathcal{O}(\sqrt{n})$? Mit unserer Quantorendefinition -kommen wir erstmal nicht weiter. Aber gefühlt wächst $\ln$ langsamer! Wir können ja die kontinuierlichen Varianten -$\ln(x)$ und $\sqrt{x}$ betrachten, die die Ableitung $\frac{1}{x}$ respektive $\frac{1}{2\sqrt{x}}$ haben. Anscheinend -wächst der Logarithmus ja wirklich bedeutend langsamer! Das Grenzwertkriterium (und die Regel von L'Hôpital) hilt uns -dabei enorm: - -\subsection{Grenzwertkriterium} -Oftmals ist Nachweis gewissen asymptotischen Verhaltens auf diese direkte Art recht umständlich. Existiert der Grenzwert -$\frac{f(n)}{g(n)}$ im Infinitesimalen, so können wir das Grenzwertverhalten direkt ablesen: -\begin{lemma} - \label{lemma_asymptotic_limit} - Seien $f,g: \mathbb{N} \rightarrow \mathbb{R}^+$ zwei positive Funktionen. Existiert der Grenzwert $\lim_{n - \rightarrow \infty} \frac{f(n)}{g(n)} = K$, so gilt: - \begin{itemize} - \item Ist $0 \le K < \infty$, so folgt $f \in \mathcal{O}(g)$ - \item Ist $0 < K \leq \infty$, so folgt $f \in \Omega(g)$ - \item Ist $0 < K < \infty$, so folgt $f \in \Theta(g)$ - \end{itemize} -\end{lemma} -Damit können wir das Logarithmusbeispiel lösen: -\begin{example}[$\ln(n) \in \mathcal{O}(\sqrt{n})$] - Wir betrachten weiterhin die kontinuierlichen Versionen. Dann gilt: - \[ - \lim_{x \rightarrow \infty} \frac{\ln(x)}{\sqrt{x}} = \frac{\infty}{\infty}, - \] - wir müssen uns also um die Regel von L'Hôpital bemühen. Nach dieser existiert obiger Limes, solange der Limes der - Ableitungen existiert. - \[ - \lim_{x \rightarrow \infty} \frac{\ln(x)}{\sqrt{x}} = - \lim_{x \rightarrow \infty} \frac{\frac{\partial \ln(x)}{\partial x}}{\frac{\partial \sqrt{x}}{\partial x}} = - \lim_{x \rightarrow \infty} \frac{2\sqrt{x}}{x} = - \lim_{x \rightarrow \infty} \frac{2}{\sqrt{x}} = - 0. - \] -\end{example} - -Zu beachten ist, dass die Umkehrung nicht unbedingt gilt, z.B., $f(n) = \sin(\frac{n}{100}) + 1$. Es gilt -$f(n)=\mathcal{O}(1)$, aber der Grenzwert $\lim_{n \to \infty} \frac{f(n)}{1}$ existiert nicht. Das ist -die Motivation für die folgende Alternativdefinition: - -\subsection{Definition der asymptotischen Schranken über den Limes} -Wir erinnern uns an die Definition des Limes superior bzw Limes inferior: -\begin{definition}[Limes superior und Limes inferior] - Sei $f: \mathbb{N} \rightarrow \mathbb{R}^+$ eine positive Funktion. Wir definieren - \[ - \limsup_{n \rightarrow \infty} f(n) := \inf_{n_0 \in \mathbb{N}} \sup_{n \ge n_0} g(n) - \] - und analog - \[ - \liminf_{n \rightarrow \infty} f(n) := \sup_{n_0 \in \mathbb{N}} \inf_{n \ge n_0} g(n) - \] -\end{definition} -Für uns der größte Vorteil ist, dass unter den gegebenen Umständen sowohl der Limes superior als auch der Limes inferior -stets existieren und Werte in $\mathbb{R}^+ \cup \{\infty\}$ annehmen. - -Damit können wir nicht nur Kriterien für asymptotisches Wachstum benennen, sondern sogar Äquivalenzen. -\begin{theorem} - Seien $f,g: \mathbb{N} \rightarrow \mathbb{R}^+$ positive reelle Funktionen. Es gilt - \begin{itemize} - \item $f \in \mathcal{O}(g) \Leftrightarrow \limsup_{n \rightarrow \infty} \frac{f(n)}{g(n)} < \infty$, - \item $f \in \Omega(g) \Leftrightarrow \liminf_{n \rightarrow \infty} \frac{f(n)}{g(n)} > 0$, - \item $f \in \Theta(g) \Leftrightarrow \limsup_{n \rightarrow \infty} \frac{f(n)}{g(n)} < \infty \text{ und } - \liminf_{n \rightarrow \infty} \frac{f(n)}{g(n)} > 0$. - \end{itemize} - \label{theorem:limit_definition} -\end{theorem} - - -\subsection{Rechenregeln für die $\mathcal{O}$-Notation} +Um in Zukunft asymptotische Schranken genauer zu bestimmen, formulieren wir ein paar Rechenregeln: \begin{lemma} Seien $f, f', g, g', h: \mathbb{N} \rightarrow \mathbb{R}^+$. \begin{labeling}{Multiplikation\ \ } @@ -249,7 +162,6 @@ Damit können wir nicht nur Kriterien für asymptotisches Wachstum benennen, son \end{lemma} Anmerkung: Gilt die zusätzliche Bedingung $g ∈ \mathcal{O}(g')$ nicht (und in keine der beiden Richtungen), so gilt immernoch $f+f' ∈ \mathcal{O}(m)$, wobei $m(n) = \text{max}(g(n), g'(n))$ das elementweise Maximum von $g$ und $g'$ ist. - \begin{proof} Wir betrachten zur Veranschaulichung die Transitivität genauer. Nach Voraussetzung gibt es $c, c' \in \mathbb{R}^+$ und $n_0, n'_0 \in \mathbb{N}$, sodass $f \le cg(n)$ für alle @@ -258,6 +170,87 @@ immernoch $f+f' ∈ \mathcal{O}(m)$, wobei $m(n) = \text{max}(g(n), g'(n))$ das Die anderen Rechenregeln verlaufen meist analog und sind eine gute Fingerübung. \end{proof} +Es ist eine gute Übung, sich zu überlegen, welche der obigen Rechenregeln auch für $Θ$-Notation gelten. + +\begin{lemma} + Ist $k ≤ l$, so gilt $\mathcal{O}(n^k) ⊆ \mathcal{O}(n^l)$. + \label{lemma:rechenregel_potenzen} +\end{lemma} +\begin{proof} + Übungsaufgabe. +\end{proof} + +Mit den zwei vorherigen Lemmata können wir nun allgemeine Polynome abschätzen: +\begin{lemma} + Sei $f(n) = a_k n^k + a_{k-1} n^{k-1} + \cdots + a_1 n + a_0$ ein Polynom von Grad~$k$. Dann gilt: + \[ + f(n) ∈ Θ(n^k) + \] + \label{lemma:polynome} +\end{lemma} +\begin{proof} + Es ist $a_i n^i ∈ \mathcal{O}(n^i)$. Das kann man entweder direkt zeigen (wähle $c = a_i$) oder via der + Multiplikationsregel. Desweiteren dominiert $x^k$ als größte Potenz alle anderen Summanden (Lemma~ + \ref{lemma:rechenregel_potenzen}). Nun kann man iterativ die Summenregel anwenden, bis nur noch $n^k$ übrig bleibt. + + Die andere Abschätzungsrichtung geschieht ähnlich. +\end{proof} +\begin{example} + Mit Lemma \ref{lemma:polynome} ist klar: $T_{\text{wc}}^{\text{is}}(n) ∈ \mathcal{O}n^2$. +\end{example} + +\subsection{Grenzwertkriterium} +Betrachten wir nun ein spannenderes Beispiel: Ist $\ln(n) \in \mathcal{O}(\sqrt{n})$? +Mit unserer Quantorendefinition kommen wir erstmal nicht weiter. +Aber hieß es nicht in der Schule, der natürliche Logarithmus $\ln$ wachse langsamer als jede andere Funktion? + +Um diese Frage beantworten zu können, führen wir das Grenzwertkriterium ein: Existiert der Grenzwert +$\frac{f(n)}{g(n)}$ im Infinitesimalen, so können wir das Grenzwertverhalten direkt ablesen: +\begin{lemma} + \label{lemma_asymptotic_limit} + Seien $f,g: \mathbb{N} \rightarrow \mathbb{R}^+$ zwei positive Funktionen. Existiert der Grenzwert $\lim_{n + \rightarrow ∞} \frac{f(n)}{g(n)} = K$, so gilt: + \begin{itemize} + \item Ist $0 \le K < ∞$, so folgt $f \in \mathcal{O}(g)$, + \item Ist $0 < K \leq ∞$, so folgt $f \in Ω(g)$, + \item Ist $0 < K < ∞$, so folgt $f \in Θ(g)$. + \end{itemize} +\end{lemma} +\begin{proof} + Die Beweisidee ist die folgende: + \[ + \lim_{n \rightarrow ∞} \frac{f(n)}{g(n)} = K \text{ impliziert } + \forall ε > 0 \ \exists n_0 ∈ \mathbb{N} \text{ sodass } \frac{f(n)}{g(n)} ∈ B_ε(K). + \] + Wir für gegebenes $c$ wählen wir uns also $ε$ sodass $c = \frac{1}{K+ε}$ und $n_0$ ist dann durch die Definition des + Limes gegeben. +\end{proof} +Zu beachten ist, dass dies keine Äquivalente Formulierung darstellt, siehe Unterkapitel \ref{subsection:limes_superior}. + + +Damit können wir das Logarithmusbeispiel lösen: +\begin{example}[$\ln(n) \in \mathcal{O}(\sqrt{n})$] + Wir berechnen: + \[ + \lim_{n \rightarrow ∞} \frac{\ln(x)}{\sqrt{x}} = \frac{∞}{∞}. + \] + Hier kommen wir erstmal nicht weiter. Wir erinnern uns an die Regel von L'Hôspital: Nach dieser existiert + obiger Limes, solange der Limes der Ableitungen existiert. Wir betrachten also die kontinuerlichen Varianten obiger + Funktionen, $\ln(x)$ und $\sqrt{x}$: + \[ + \lim_{x \rightarrow ∞} \frac{\ln(x)}{\sqrt{x}} = + \lim_{x \rightarrow ∞} \frac{\frac{\partial \ln(x)}{\partial x}}{\frac{\partial \sqrt{x}}{\partial x}} = + \lim_{x \rightarrow ∞} \frac{2\sqrt{x}}{x} = + \lim_{x \rightarrow ∞} \frac{2}{\sqrt{x}} = + 0. + \] + Da der kontinuierliche Limes per Definition bedeutet, das alle möglichen diskreten Teilfolgen konvergieren, + konvergiert insbesondere die Teilfolge $0,1,2, \cdots$ und es unser obiger diskreter Limes ist auch 0. Durch das + Grenzwertkriterium wissen wir nun: $\log n ∈ \mathcal{O}(\sqrt{n})$. +\end{example} + +\subsection{Rechenregeln für die $\mathcal{O}$-Notation} + \begin{lemma} Die Basis des Logarithmus ist für asymptotische Betrachtung nicht interessant. Seien $b, b' \in \mathbb{R}^+$, dann gilt: \[ @@ -277,23 +270,68 @@ immernoch $f+f' ∈ \mathcal{O}(m)$, wobei $m(n) = \text{max}(g(n), g'(n))$ das vernachlässigbar ist. \end{proof} -\subsection{Beispiele} -Wir betrachten nun einige Beispiele, die die Relation gängiger Wachstumskategorien im Beispiel belegen: +\subsection{Die gängigsten Wachstumsklassen} +Auch wenn es vollkommen korrekt sein mag zu sagen, dass dieser oder jender Algorithmus in $\mathcal{O}(n^2 + 2n)$ liegt, +ist es nicht die übliche Notation. Hier ist eine Auflistung der gebräuchlichsten Wachstumsklassen im Kontext der +Informatik. Die Liste ist aufsteigend gestaltet, und alles Teilmengenbeziehungen sind echt, +also mit $0 < c_1 < 1 c_2 $ und $b > 1$: +\[ + \mathcal{O}(1) \subset \mathcal{O}(\log(n)) \subset \mathcal{O}(n^{c_1}) \subset \mathcal{O}(n) \subset + \mathcal{O}(n \log n) \subset \mathcal{O}(n^{c_2}) \subset \mathcal{O}(b^n) \subset \mathcal{O}(n!). +\] + +\vspace{1cm} + +\noindent +\begin{tabular}{|c|c|c|c|} +\hline +Name & $\mathcal{O}$-Notation & Bsp.-Funktion & Bsp.-Algorithmus \\ +\hline +\hline +konstant & $\mathcal{O}(1)$ & 3 & Addition \\ +\hline +logarithmisch & $\mathcal{O}(\log(n))$ & $\log_2(n), \ln(n)$ & Suchen \\ +\hline +Wurzelfunktion & $\mathcal{O}(n^{c}),$$0<c<1$ & $\sqrt{n},n^{\frac{1}{3}}$ & Primzahltest \\ +\hline +linear & $\mathcal{O}(n)$ & $3n+4$ & Maximum finden \\ +\hline +linearlogarithmisch & $\mathcal{O}(n\cdot\log(n))$ & $2n\cdot \ln(n)$ & Sortieren \\ +\hline +polynominal & $\mathcal{O}(n^{c}),c>1$ & $4n^{2}+7n+10$ & Matrizenoperationen \\ +\hline +exponential & $\mathcal{O}(c^{n}),c>1$ & $2^{n},10^{n}$ & NP-vollst\"{a}ndige Alg. \\ +\hline +Fakultät & $\mathcal{O}(n!)$ & $n!$ & \\ +\hline +\end{tabular} + +Im Folgenden wollen wir einige der hier angegebenen Relationen noch Begründen: +\begin{lemma} + $\mathcal{O}(n) \subset \mathcal{O}(n \log n)$. + Es gibt also Funktionen in $\mathcal{O}(n \log n)$, welche nicht bereits in $\mathcal{O}(n)$ liegen. + \label{lemma:linearlogarithmis_echt_größer} +\end{lemma} +\begin{proof} + Übungsaufgabe. +\end{proof} + \begin{example}[Polynomielles versus exponentielles Wachstum] Wir zeigen $n^a \in \mathcal{O}(b^n)$ für $1 < b \in \mathbb{R}$, $a > 0$. Der Einfachheit halber nehmen wir $a \in \mathbb{N}$ an. - Beim Betrachten des Limes des kontinuerlichen Falles $\lim_{x \rightarrow \infty} \frac{x^a}{b^x}$ stellen wir schnell + Beim Betrachten des Limes des kontinuerlichen Falles $\lim_{x \rightarrow ∞} \frac{x^a}{b^x}$ stellen wir schnell fest, dass wir $a$-mal die Regel von L'Hôpital anwenden müssen. Mit $\frac{\partial^a x^a}{\partial x^a} = a!$ und $\frac{\partial^a b^x}{\partial x^a} = b^x \log(b)^a$ sehen wir: \[ - \lim_{x \rightarrow \infty} \frac{x^a}{b^x} = - \lim_{x \rightarrow \infty} \frac{a!}{b^x \log(b)^a} = + \lim_{x \rightarrow ∞} \frac{x^a}{b^x} = + \lim_{x \rightarrow ∞} \frac{a!}{b^x \log(b)^a} = 0. \] Damit gilt auch für die diskrete Variante $n^a \in \mathcal{O}(b^n)$. Exponentielles Wachstum trumpft also polynomielles Wachstum. \end{example} + \begin{example}[Exponentielles Wachstum versus die Fakultätsfunktion] Wir betrachten als Beispiel $2^n \in \mathcal{O}(n!)$. Dies geschieht wieder über die Quantorendefinition: Wir wählen $c=1$ und $n_0 = 4$. Damit haben wir @@ -309,31 +347,38 @@ Wir betrachten nun einige Beispiele, die die Relation gängiger Wachstumskategor \end{example} -\subsection{Die gängigsten Wachstumsklassen} -Hier ist eine Auflistung der gebräuchlichsten Wachstumsklassen im Kontext der Informatik. Die Liste ist aufsteigend gestaltet, -also $\mathcal{O}(1) \subseteq \mathcal{O}(\log(n)) \subseteq \cdots \subseteq \mathcal{O}(n!)$. +\subsection{Definition der asymptotischen Schranken über den Limes*} +\label{subsection:limes_superior}<++> +Das Limeskriterium ist nur das: Ein Kriterium. Betrachten wir z.B., $f(n) = \sin(\frac{n}{100}) + 1$, so gilt +$f(n)=\mathcal{O}(1)$, aber der Grenzwert $\lim_{n \to ∞} \frac{f(n)}{1}$ existiert nicht. + +Das ist die Motivation für die folgende Alternativdefinition: + +Wir erinnern uns an die Definition des Limes superior bzw Limes inferior: +\begin{definition}[Limes superior und Limes inferior] + Sei $f: \mathbb{N} \rightarrow \mathbb{R}^+$ eine positive Funktion. Wir definieren + \[ + \limsup_{n \rightarrow ∞} f(n) := \inf_{n_0 \in \mathbb{N}} \sup_{n \ge n_0} g(n) + \] + und analog + \[ + \liminf_{n \rightarrow ∞} f(n) := \sup_{n_0 \in \mathbb{N}} \inf_{n \ge n_0} g(n) + \] +\end{definition} +Für uns der größte Vorteil ist, dass unter den gegebenen Umständen sowohl der Limes superior als auch der Limes inferior +stets existieren und Werte in $\mathbb{R}^+ \cup \{∞\}$ annehmen. + +Damit können wir nicht nur Kriterien für asymptotisches Wachstum benennen, sondern sogar Äquivalenzen. +\begin{theorem} + Seien $f,g: \mathbb{N} \rightarrow \mathbb{R}^+$ positive reelle Funktionen. Es gilt + \begin{itemize} + \item $f \in \mathcal{O}(g) \Leftrightarrow \limsup_{n \rightarrow ∞} \frac{f(n)}{g(n)} < ∞$, + \item $f \in \Omega(g) \Leftrightarrow \liminf_{n \rightarrow ∞} \frac{f(n)}{g(n)} > 0$, + \item $f \in \Theta(g) \Leftrightarrow \limsup_{n \rightarrow ∞} \frac{f(n)}{g(n)} < ∞ \text{ und } + \liminf_{n \rightarrow ∞} \frac{f(n)}{g(n)} > 0$. + \end{itemize} + \label{theorem:limit_definition} +\end{theorem} -\begin{tabular}{|c|c|c|c|} -\hline -Name & $\mathcal{O}$-Notation & Bsp.-Funktion & Bsp.-Algorithmus \\ -\hline -\hline -konstant & $\mathcal{O}(1)$ & 3 & Addition \\ -\hline -logarithmisch & $\mathcal{O}(\log(n))$ & $\log_2(n), \ln(n)$ & Suchen \\ -\hline -Wurzelfunktion & $\mathcal{O}(n^{c}),$$0<c<1$ & $\sqrt{n},n^{\frac{1}{3}}$ & Primzahltest \\ -\hline -linear & $\mathcal{O}(n)$ & $3n+4$ & Maximum finden \\ -\hline -linearlogarithmisch & $\mathcal{O}(n\cdot\log(n))$ & $2n\cdot \ln(n)$ & Sortieren \\ -\hline -polynominal & $\mathcal{O}(n^{c}),c>1$ & $4n^{2}+7n+10$ & Matrizenoperationen \\ -\hline -exponential & $\mathcal{O}(c^{n}),c>1$ & $2^{n},10^{n}$ & NP-vollst\"{a}ndige Alg. \\ -\hline -Fakultät & $\mathcal{O}(n!)$ & $n!$ & \\ -\hline -\end{tabular}