\documentclass{bschlangaul-aufgabe} \bLadePakete{java} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 3}, Thematik = {Unimodale Zahlenfolge}, Referenz = 46115-2015-H.T1-A3, RelativerPfad = Examen/46115/2015/09/Thema-1/Aufgabe-3.tex, ZitatSchluessel = examen:46115:2015:09, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {Teile-und-Herrsche (Divide-and-Conquer), Binäre Suche, Implementierung in Java}, EinzelpruefungsNr = 46115, Jahr = 2015, Monat = 09, ThemaNr = 1, AufgabeNr = 3, } \section{Aufgabe 3 \index{Teile-und-Herrsche (Divide-and-Conquer)} \footcite{examen:46115:2015:09}} Eine Folge von Zahlen $a_1, \dots, a_n$ heiße unimodal, wenn sie bis zu einem bestimmten Punkt echt ansteigt und dann echt fällt. Zum Beispiel ist die Folge $1,3,5,6,5,2,1$ unimodal, die Folgen $1,3,5,4,7,2,1$ und $1,2,3,3,4,3,2,1$ aber nicht. \begin{bExkurs}[Unimodale Abbildung] Eine unimodale Abbildung oder unimodale Funktion ist in der Mathematik eine Funktion mit einem eindeutigen (lokalen und globalen) Maximum wie zum Beispiel $f(x)=-x^{2}$. \bFussnoteUrl{https://de.wikipedia.org/wiki/Unimodale_Abbildung} \end{bExkurs} \begin{enumerate} %% % 1. %% \item Entwerfen Sie einen Algorithmus, der zu (als Array) gegebener unimodaler Folge $a_1, \dots, a_n$ in Zeit $\mathcal{O}(\log n)$ das Maximum $\max a_i$ berechnet. Ist die Folge nicht unimodal, so kann Ihr Algorithmus ein beliebiges Ergebnis liefern. Größenvergleiche, arithmetische Operationen und Arrayzugriffe können wie üblich in konstanter Zeit ($\mathcal{O}(1)$) getätigt werden. Hinweise: binäre Suche, divide-and-conquer. \index{Binäre Suche} \begin{bAntwort} Wir wählen einen Wert in der Mitte der Folge aus. Ist der direkte linke und der direkte rechte Nachbar dieses Wertes kleiner, dann ist das Maximum gefunden. Ist nur linke Nachbar größer, setzen wir die Suche wie oben beschrieben in der linken Hälfte, sonst in der rechten Hälfte fort. \end{bAntwort} %% % 2. %% \item Begründen Sie, dass Ihr Algorithmus tatsächlich in Zeit $\mathcal{O}(\log n)$ läuft. \begin{bAntwort} Da der beschriebene Algorithmus nach jedem Bearbeitungsschritt nur auf der Hälfte der Feld-Element zu arbeiten hat, muss im schlechtesten Fall nicht die gesamte Folge durchsucht werden. Nach dem ersten Teilen der Folge bleiben nur noch $\frac{n}{2}$ Elemente, nach dem zweiten Schritt $\frac{n}{4}$, nach dem dritten $\frac{n}{8}$ usw. Allgemein bedeutet dies, dass im $i$-ten Durchlauf maximal $\frac{n}{2^i}$ Elemente zu durchsuchen sind. Entsprechend werden $\log_2 n$ Schritte benötigt.\footcite[Seite 122]{saake} Somit hat der Algorithmus zum Finden des Maximums in einer unimodalen Folge in der Landau-Notation ausgedrückt die Zeitkomplexität $\mathcal{O}(\log n)$.\footcite{wiki:binaere-suche} \end{bAntwort} %% % 3. %% \item Schreiben Sie Ihren Algorithmus in Pseudocode oder in einer Programmiersprache Ihrer Wahl, \zB Java, auf. Sie dürfen voraussetzen, dass die Eingabe in Form eines Arrays der Größe $n$ vorliegt. \index{Implementierung in Java} \begin{bAntwort} \bPseudoUeberschrift{Rekursiver Ansatz} \bJavaExamen[firstline=23,lastline=39]{46115}{2015}{09}{UnimodalFinder} \bPseudoUeberschrift{Iterativer Ansatz} \bJavaExamen[firstline=53,lastline=69]{46115}{2015}{09}{UnimodalFinder} \end{bAntwort} %% % 4. %% \item Beschreiben Sie in Worten ein Verfahren, welches in Zeit $\mathcal{O}(n)$ feststellt, ob eine vorgelegte Folge unimodal ist oder nicht. \begin{bAntwort} \bJavaExamen[firstline=71,lastline=92]{46115}{2015}{09}{UnimodalFinder} \end{bAntwort} %% % 5. %% \item Begründen Sie, dass es kein solches Verfahren (Test auf Unimodalität) geben kann, welches in Zeit $\mathcal{O}(\log n)$ läuft. \begin{bAntwort} Da die Unimodalität nur durch einen Werte an einer beliebigen Stelle der Folge verletzt werden kann, müssen alle Elemente durchsucht und überprüft werden. \end{bAntwort} \end{enumerate} \begin{bAntwort} \bPseudoUeberschrift{Komplette Klasse} \bJavaExamen[firstline=23,lastline=39]{46115}{2015}{09}{UnimodalFinder} \bPseudoUeberschrift{Test} \bJavaTestDatei{examen/examen_46115/jahr_2015/herbst/UnimodalFinderTest} \end{bAntwort} \end{document}