\documentclass{bschlangaul-aufgabe}
\bLadePakete{java}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Aufgabe 5},
  Thematik = {Schnelle Suche von Schlüsseln: odd-ascending-even-descending-Folge},
  Referenz = 66115-2020-H.T2-TA2-A5,
  RelativerPfad = Examen/66115/2020/09/Thema-2/Teilaufgabe-2/Aufgabe-5.tex,
  ZitatSchluessel = examen:66115:2020:09,
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Binäre Suche},
  EinzelpruefungsNr = 66115,
  Jahr = 2020,
  Monat = 09,
  ThemaNr = 2,
  TeilaufgabeNr = 2,
  AufgabeNr = 5,
}

\let\j=\bJavaCode

Eine Folge von Zahlen ist eine
\emph{odd-ascending-even-descending}-Folge, wenn gilt:
\index{Binäre Suche}
\footcite{examen:66115:2020:09}
\begin{quote}
Zunächst enthält die Folge alle Schlüssel, die \emph{ungerade} Zahlen
sind, und diese Schlüssel sind aufsteigend sortiert angeordnet. Im
Anschluss daran enthält die Folge alle Schlüssel, die \emph{gerade}
Zahlen sind, und diese Schlüssel sind absteigend sortiert angeordnet.
\end{quote}

\begin{enumerate}
\item Geben Sie die Zahlen $10, 3, 11, 20, 8, 4, 9$ als
\emph{odd-ascending-even-descending}-Folge an.

\begin{bAntwort}
$3, 9, 11, 20, 10, 8, 4$
\end{bAntwort}

\item Geben Sie einen Algorithmus (\zB in Pseudocode oder Java) an,
der für eine \emph{odd-ascending-even-descending}-Folge $F$ gegeben als
Feld und einem Schlüsselwert $S$ prüft, ob $S$ in $F$ vorkommt und
\bJavaCode{true} im Erfolgsfall und ansonsten \bJavaCode{false}
liefert. Dabei soll der Algorithmus im Worst-Case eine echt bessere
Laufzeit als Linearzeit (in der Größe der Arrays) haben. Erläutern Sie
Ihren Algorithmus und begründen Sie die Korrektheit.

\begin{bAntwort}
Bei dem Algorithmus handelt es sich um einen leicht abgewandelten Code,
der eine „klassische“ binären Suche implementiert.

\bJavaExamen[firstline=5,lastline=26]{66115}{2020}{09}{UngeradeGerade}
\end{bAntwort}

%%
% c)
%%

\item Erläutern Sie schrittweise den Ablauf Ihres Algorithmus für die
Folge $1, 5, 11, 8, 4, 2$ und
den Suchschlüssel $4$.

\begin{bAntwort}

Die erste Zeile der Methode \j{suche} initialisiert die Variable
\j{links} mit 0 und \j{rechts} mit 5. Da \j{links} kleiner ist als
\j{rechts}, wird die \j{while}-Schleife betreten und die Variable
\j{mitte} auf 2 gesetzt. Da der gesuchte Schlüssel gerade ist und
\j{feld[2]} 11 ist, also größer, wird in den \j{true}-Block der
\j{if}-Bedingung besprungen und die Variable \j{links} aus 3 gesetzt.

Zu Beginn des 2. Durchlaufs der \j{while}-Schleife ergeben sich folgende
Werte: \j{links}: 3 \j{mitte}: 4 \j{rechts}: 5.

In der anschließenden Bedingten Anweisung wird die \j{while}-Schleife
verlassen und \j{true} zurückgegeben, da mit \j{feld[4]} der gewünschte
Schlüssel gefunden wurde.
\end{bAntwort}

%%
% d)
%%

\item Analysieren Sie die Laufzeit Ihres Algorithmus für den Worst-Case,
geben Sie diese in $\mathcal{O}$-Notation an und begründen Sie diese.

\begin{bAntwort}
Die Laufzeit des Algorithmuses ist in der Ordnung $\mathcal{O}(\log_2
n)$.

Im schlechtesten Fall muss 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.
\end{bAntwort}

\bPseudoUeberschrift{Kompletter Code}

\bJavaExamen{66115}{2020}{09}{UngeradeGerade}

\bPseudoUeberschrift{Test-Code}

\bJavaTestDatei{examen/examen_66115/jahr_2020/herbst/UngeradeGeradeTest}

\end{enumerate}
\end{document}
