0 Daumen
742 Aufrufe

Frage:

Analyse von Algorithmen

Ternäre Suche

Wir übertragen die Idee der Binärsuche auf die Suche in einer von drei Teilen.

boolean ternarySearch(int[] a, int low, int high, int v) {
if (low > high) return false;
int mid1 = low + (high - low) / 3;
if (a[mid1] == v) return true;
if (v < a[mid1]) { return ternarySearch(a, low, mid1 - 1, v); }
int mid2 = low + 2 * (high - low) / 3;
if (a[mid2] == v) return true;
if (v < a[mid2]) { return ternarySearch(a, mid1 + 1, mid2 - 1, v);}
return ternarySearch(a, mid2 + 1, high, v);
}



Analysieren Sie die Komplexität (Anzahl an Vergleichen – worst-case!). Gehen Sie wie folgt vor:
• Erstellen Sie die Rekursionsgleichung (analog zur binären Suche)
• Versuchen Sie, eine Lösung zu „erraten“ – Denken Sie an Binärsuche


Code:

Die erste Frage habe ich beantwortet mit der Rekursionsgleichung T(n) = T (n/3) + 4

Ich weiß nicht genau was man bei der zweiten Frage tun soll? Mit der Rekursionsgleichung irgendwie eine Lösung erraten?

Avatar von

1 Antwort

0 Daumen

Antwort mit KI erzeugt

Analyse von Algorithmen - Ternäre Suche

Für die ternäre Suche haben Sie bereits die Rekursionsgleichung \(T(n) = T\left(\frac{n}{3}\right) + 4\) als Ausgangspunkt identifiziert. Diese Gleichung berücksichtigt, dass bei jedem Schritt des Algorithmus das Problem auf ein Drittel seiner ursprünglichen Größe reduziert wird (d.h., wir suchen in nur einem Drittel des Arrays) und 4 Vergleiche durchgeführt werden müssen (ein Vergleich, um zu prüfen, ob \(low > high\), ein Vergleich mit \(a[mid1]\), ein Vergleich mit \(a[mid2]\), und eine Entscheidung, in welchem Segment sich die Suche fortsetzt).

Um die zweite Frage zu beantworten: Indem wir eine Lösung "erraten", versuchen wir, eine geschlossene Form der Rekursionsgleichung zu finden. Das heißt, wir suchen nach einer Formel, die uns die Laufzeit \(T(n)\) direkt gibt, ohne durch die Rekursionsstufen gehen zu müssen. Die Idee ist, das Wachstumsverhalten der Funktion direkt anzugeben, anstatt es durch wiederholte Anwendung der Rekursion zu berechnen.

Vergleich mit der Binären Suche

Bei der Binären Suche, die ein Array bei jedem Schritt halbiert, ist die Rekursionsgleichung \(T(n) = T\left(\frac{n}{2}\right) + C\), wobei \(C\) eine Konstante für die Vergleiche plus der Reduktionslogik darstellt. Die Lösung dieser Rekursion ist bekanntermaßen \(T(n) = O(\log_2{n})\).

Erraten der Lösung

Da die ternäre Suche das Problem in jedem Schritt auf ein Drittel reduziert (im Gegensatz zur Hälfte bei der binären Suche), liegt es nahe zu „erraten“, dass die Laufzeit der ternären Suche ähnlich logaritmisch ist, aber bezogen auf die Basis 3 anstatt 2. Also, anstelle von \(O(\log_2{n})\) für die binäre Suche, „erraten“ wir \(O(\log_3{n})\) als Laufzeit für die ternäre Suche.

Dieser „Erratungsprozess“ basiert auf der Intuition, dass das Wachstumsverhalten der beiden Algorithmen ähnlich ist – sie reduzieren einfach die Größe des Problems in verschiedenen Raten (halbieren vs. dritteln). Die genaue Anzahl der notwendigen Vergleiche (in diesem Fall \(+4\) in Ihrer Rekursionsgleichung) ändert nicht das allgemeine Wachstumsmuster der Zeitkomplexität; es beeinflusst nur die genauen Konstanten, die in der Big-O-Notation normalerweise vernachlässigt werden.

Zusammenfassung

Basierend auf der Rekursionsgleichung \(T(n) = T\left(\frac{n}{3}\right) + 4\) und dem Vergleich mit der binären Suche, erraten wir, dass die Zeitkomplexität der ternären Suche in Big-O-Notation \(O(\log_3{n})\) ist. Dies gibt uns ein Maß für die Effizienz des Algorithmus in Bezug auf die Anzahl der Elemente in der Eingabeliste \(n\), wobei der Algorithmus im schlechtesten Fall logarithmisch mit der Größe der Eingabe wächst.
Avatar von

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community