Für Ihre erste Frage ist die Intuition hinter Divide-and-Conquer, dass in vielen Problemen die Menge der Arbeit, die getan werden muss, auf einer kombinatorischen Eigenschaft der Eingabe basiert, die mehr als linear skaliert.
Zum Beispiel wird im Problem mit dem nächsten Punktpaar die Laufzeit der Brute-Force-Antwort dadurch bestimmt, dass Sie alle möglichen Punktepaare betrachten müssen.
Wenn Sie etwas nehmen, das quadratisch wächst und es in zwei Teile schneidet, von denen jedes die halbe Größe wie zuvor hat, dauert es ein Viertel der Anfangszeit, um das Problem in jeder Hälfte zu lösen, also das Problem in beiden zu lösen Hälften brauchen etwa die Hälfte der Zeit, die für die Brute-Force-Lösung benötigt wird. Es in vier Stücke zu schneiden würde ein Viertel der Zeit dauern, es in acht Stücke schneiden ein Achtel der Zeit, etc.
Die rekursive Version endet in diesem Fall schneller, weil bei jedem Schritt vermeiden wir viel tun arbeiten Sie mit dem Umgang mit Elementpaaren, indem Sie sicherstellen, dass nicht zu viele Paare vorhanden sind, die wir tatsächlich überprüfen müssen. Die meisten Algorithmen, die eine Lösung zum Teilen und Überwinden haben, werden aus ähnlichen Gründen schneller.
Für Ihre zweite Frage, Nein, Divide and Conquer-Algorithmen sind nicht unbedingt schneller als Brute-Force-Algorithmen. Berücksichtigen Sie das Problem, den Maximalwert in einem Array zu finden. Der Brute-Force-Algorithmus benötigt O (n) -Zeit und verwendet O (1) -Raum, wie es einen linearen Scan über die Daten macht. Der Divide-and-Conquer-Algorithmus wird hier angegeben:
- Wenn das Array nur ein Element hat, ist das das Maximum.
- Ansonsten:
- Schneiden Sie das Array in zwei Hälften.
- Finden Sie das Maximum in jeder Hälfte.
- Berechnen Sie das Maximum dieser beiden Werte.
Das kostet Zeit O (n) als auch, verwendet aber O (log n) Speicher für den Stapelspeicher. Es ist eigentlich schlimmer als der einfache lineare Algorithmus.
Als ein anderes Beispiel hat die maximum single-sell profit problem eine Lösung zum Teilen und Überwinden, aber die optimierte dynamische Programmierlösung ist schneller in Bezug auf Zeit und Speicher.
Hoffe, das hilft!
Um einen Kuchen in 16 Stücke zu teilen, ist die erste Lösung zu versuchen, 1/16 des Kuchens und so weiter zu schneiden ... schwierig. Eine andere Lösung besteht darin, den Kuchen in 2, dann wieder in 2, dann jeweils 1/4 in 2 und 1/8 in 2 zu schneiden. –