TuH2 java
Zurück zur Hauptseite Teile und Herrsche 2
Java - Variante zu Teile und Herrsche 2
Um mit den Java Beispielen experimentieren zu können findet ihr folgende vordefinierte Datenstrukturen und Hilfsmethoden:
Betrachten wir nun die iterative Variante der binären Suche:
<eval> System.out.print(5);</eval>
//binSuch(myArray, 4);
Um nun eine Aussage über die Effiziens treffen zu können, betrachten wir das Verhalten der Variablen, welche für die Positionen im zu durchsuchenden Feld verantwortlich sind.
\begin{array}{lcl} \text{Start} & = & 0 \\ \text{Ende} & = & Feldleange - 1 \\ \text{Feldleange zu Begin} & = & \text{start} + \text{Ende} \\ \text{Mitte des Feldes} & = & \dfrac{\text{Start} + \text{Ende}}{2} \\ \end{array}Das Intervall ändert sich wie folgt:
\begin{array}{lcl} \text{Neue Feldlaenge} & = & \text{Ende} - \text{Start} + 1 \\ & = & \text{Ende} - (\text{Mitte} + 1) + 1 \\ & = & \text{Ende} - \text{Mitte des Feldes} \\ & = & \text{Ende} - \dfrac{\text{Start} + \text{Ende}}{2} \\ & = & \dfrac{2 \cdot \text{Ende}}{2} - \dfrac{\text{Start} + \text{Ende}}{2} \\ & = & \dfrac{\text{Ende} - \text{Start}}{2} \end{array}Kurz gefasst ändert sich das Intervall in jedem Durchlauf der Schleife von der Länge n auf \dfrac{n - 1}{2}. Was heist das nun konkret? Wir haben 2 Intervalle zwischen denen es sich jeweils zu entscheiden gilt und dafür brauchen wir k durchläufe. Somit haben 2^k Operationen um n Elemente zu durchsuchen.
2^k = n Das lässt sich mit dem Logarithmus zur Basis 2 errechnen.
\log_{2} n = k \curvearrowright \mathcal{O}(\log_2 n)
Dieses Ergebnis zaubert ein grinsen ins Gesicht,
da ein Algorithmus mit logarithmischer Laufzeit äußerst Effizient arbeitet.Den Unterschied zwischen linearem und logarithmischen Aufwand kann man sich mittels empirischer Analyse vor Augen halten, dazu findet ihr zwei Aufgaben auf der Übungsseite http://www.michael-hielscher.de/wiki/index.php/Aufgaben - TuH2#Aufgaben zur Bin.C3.A4ren Suche. Für den direkten Vergleich haben wir hier die notwendige Funktion für die sequenzielle Suche zu Verfügung gestellt.
Für die Interessierten, hier findet ihr noch die rekursive Variante in Java. Im Wikipedia Artikel zur binären Suche ist ein kleiner Fehler, hier ist die korrigierte Variante!
<eval> System.out.print(binSuchRek(myArray, 20321, 0, myArray.length)); </eval>
Karatsuba in Java
Dies ist eine Mögliche Implementierung in Java:
<eval> </eval>