Teilen Sie und überwinden Sie Algorithmus

In der Informatik, teilen Sie sich und siegen Sie (D&C) ist ein wichtiges auf mehrverzweigtem recursion gestütztes Algorithmus-Designparadigma. Ein Teilen und überwindet Algorithmus-Arbeiten durch das rekursive Brechen eines Problems in zwei oder mehr Teilprobleme von demselben (oder verbunden) Typ, bis diese einfach genug werden, direkt gelöst zu werden. Die Lösungen der Teilprobleme werden dann verbunden, um eine Lösung des ursprünglichen Problems zu geben.

Diese Technik ist die Basis von effizienten Algorithmen für alle Arten von Problemen, wie das Sortieren (z.B, Schnellsortierung, Verflechtungssorte), große Anzahl multiplizierend (z.B. Karatsuba), syntaktische Analyse (z.B, verfeinernder parsers), und Computerwissenschaft des getrennten Fouriers verwandelt sich (FFTs).

Andererseits die Fähigkeit, zu verstehen und D&C zu entwickeln, sind Algorithmen eine Sachkenntnis, die dem Master Zeit in Anspruch nimmt. Als, wenn man einen Lehrsatz durch die Induktion beweist, ist es häufig notwendig, das ursprüngliche Problem durch ein allgemeineres oder kompliziertes Problem zu ersetzen, um den recursion auf die Beine zu bringen, und es keine systematische Methode gibt, für die richtige Generalisation zu finden.

Der Name "teilt sich und siegt" wird manchmal auch auf Algorithmen angewandt, die jedes Problem auf nur ein Teilproblem wie der binäre Suchalgorithmus reduzieren, für eine Aufzeichnung in einer sortierten Liste (oder sein Analogon in der numerischen Computerwissenschaft, dem Halbierungsalgorithmus für die Wurzel zu finden, die findet). Diese Algorithmen können effizienter durchgeführt werden als allgemeine teilen-und-überwinden Algorithmen; insbesondere wenn sie Schwanz recursion verwenden, können sie in einfache Schleifen umgewandelt werden. Laut dieser breiten Definition, jedoch, konnte jeder Algorithmus, der recursion oder Schleifen verwendet, betrachtet werden, weil "teilen und Algorithmus überwinden". Deshalb denken einige Autoren, dass sich der Name "teilt und siegt", sollte nur verwendet werden, wenn jedes Problem zwei oder mehr Teilprobleme erzeugen kann. Die Namenabnahme und siegt ist stattdessen für die Klasse des einzelnen Teilproblems vorgeschlagen worden.

Die Genauigkeit eines Teilens und siegt Algorithmus wird gewöhnlich durch die mathematische Induktion bewiesen, und seine rechenbetonten Kosten werden häufig durch das Lösen von Wiederauftreten-Beziehungen bestimmt.

Früh historische Beispiele

Binäre Suche, ein Teilen und überwinden Algorithmus, in dem das ursprüngliche Problem unten in einzelne Teilprobleme der grob Hälfte der ursprünglichen Größe nacheinander zerbrochen wird, hat eine lange Geschichte. Während eine klare Beschreibung des Algorithmus auf Computern 1946 in einem Artikel von John Mauchly erschienen ist, geht die Idee, eine sortierte Liste von Sachen zu verwenden, um Suche zu erleichtern, mindestens so weit Babylonia in 200 v. Chr. zurück. Ein anderer teilt sich und siegt der Algorithmus mit einem einzelnen Teilproblem ist der Euklidische Algorithmus, um den größten allgemeinen Teiler von zwei Zahlen (durch das Vermindern der Anzahlen zu kleineren und kleineren gleichwertigen Teilproblemen), der Daten zu mehreren Jahrhunderten v. Chr. zu schätzen.

Ein frühes Beispiel eines teilen-und-überwinden Algorithmus mit vielfachen Teilproblemen ist die 1805-Beschreibung von Gauss dessen, was jetzt den Cooley-Tukey Algorithmus des schnellen Fouriers verwandelt sich (FFT) genannt wird, obwohl er seine Operationszählung quantitativ nicht analysiert hat und FFTs weit verbreitet nicht geworden ist, bis sie mehr als ein Jahrhundert später wieder entdeckt wurden.

Ein früher zwei-Teilprobleme-D&C Algorithmus, der für Computer spezifisch entwickelt und richtig analysiert wurde, ist der Verflechtungssorte-Algorithmus, der von John von Neumann 1945 erfunden ist.

Ein anderes bemerkenswertes Beispiel ist der Algorithmus, der von Anatolii A. Karatsuba 1960 erfunden ist, der zwei n-digit Zahlen in Operationen (in der Großen O Notation) multiplizieren konnte. Dieser Algorithmus hat die 1956-Vermutung von Andrey Kolmogorov widerlegt, dass Operationen für diese Aufgabe erforderlich wären.

Als ein anderes Beispiel eines Teilens und überwinden Algorithmus, der Computer nicht ursprünglich eingeschlossen hat, gibt Knuth die Methode, die eine Post normalerweise an der Weg-Post verwendet: Briefe werden in getrennte Taschen für verschiedene geografische Gebiete sortiert, jede dieser Taschen wird selbst in Gruppen für kleinere Subgebiete und so weiter sortiert, bis sie geliefert werden. Das ist mit einer Basis-Sorte verbunden, die für Sortieren-Maschinen der Schlag-Karte schon in 1929 beschrieben ist.

Vorteile

Das Beheben schwieriger Probleme

Teilen Sie sich und siegen Sie ist ein starkes Werkzeug, um begrifflich schwierige Probleme wie der klassische Turm des Hanoier Rätsels zu beheben: Alles, was man verlangt, ist eine Weise, das Problem in Teilprobleme zu brechen, die trivialen Fälle und sich verbindender Teilprobleme zum ursprünglichen Problem zu lösen.

Algorithmus-Leistungsfähigkeit

Das teilen-und-überwinden Paradigma hilft häufig in der Entdeckung von effizienten Algorithmen. Es war der Schlüssel, zum Beispiel, zur schnellen Multiplikationsmethode von Karatsuba, der Schnellsortierung und den mergesort Algorithmen, dem Algorithmus von Strassen für die Matrixmultiplikation, und schneller Fourier verwandelt sich.

In allen diesen Beispielen D&C hat Annäherung zu einer Verbesserung in den asymptotischen Kosten der Lösung geführt.

Zum Beispiel, wenn die Grundfälle Größe unveränderlich begrenzt haben, ist die Arbeit, das Problem zu spalten und die teilweisen Lösungen zu verbinden, zur Größe des Problems n proportional, und es gibt eine begrenzte Nummer p von Teilproblemen der Größe ~ n/p in jeder Bühne, dann werden die Kosten des teilen-und-überwinden Algorithmus O sein (n loggen n).

Parallelismus

Teilen Sie sich und siegen Sie Algorithmen werden an die Ausführung in Mehrverarbeiter-Maschinen, besonders Systeme des geteilten Gedächtnisses natürlich angepasst, wo die Kommunikation von Daten zwischen Verarbeitern im Voraus nicht geplant zu werden braucht, weil verschiedene Teilprobleme auf verschiedenen Verarbeitern durchgeführt werden können.

Speicherzugang

Teilen-und-überwinden Algorithmen neigen natürlich dazu, effizienten Gebrauch von geheimen Speicherlagern zu machen. Der Grund besteht darin, dass sobald ein Teilproblem klein genug ist, kann es und alle seine Teilprobleme im Prinzip innerhalb des geheimen Lagers gelöst werden, ohne auf das langsamere Hauptgedächtnis zuzugreifen. Ein Algorithmus hat vorgehabt, das geheime Lager auszunutzen, auf diese Weise wird gegen das geheimes Lager vergesslich genannt, weil es die Größe (N) des geheimen Lagers als ein ausführlicher Parameter nicht enthält.

Außerdem D&C können Algorithmen für wichtige Algorithmen (z.B, das Sortieren, FFTs und die Matrixmultiplikation) entworfen werden, um optimale gegen das geheimes Lager vergessliche Algorithmen zu sein - sie verwenden das geheime Lager auf eine nachweisbar optimale Weise in einem asymptotischen Sinn unabhängig von der Größe des geheimen Lagers. Im Gegensatz blockiert die traditionelle Annäherung an die Ausnutzung des geheimen Lagers, wo das Problem in Klötze der passenden Größe ausführlich geteilt wird — kann das auch das geheime Lager optimal verwenden, aber nur wenn der Algorithmus für die spezifische Größe (N) des geheimen Lagers einer besonderen Maschine abgestimmt wird.

Derselbe Vorteil besteht hinsichtlich anderer hierarchischer Lagerungssysteme, wie NUMA oder virtuelles Gedächtnis, sowie für vielfache Niveaus des geheimen Lagers: Sobald ein Teilproblem klein genug ist, kann es innerhalb eines gegebenen Niveaus der Hierarchie gelöst werden, ohne auf die höher (langsameren) Niveaus zuzugreifen.

Kontrolle von Roundoff

In der Berechnung mit der rund gemachten Arithmetik, z.B mit Schwimmpunkt-Zahlen, kann ein teilen-und-überwinden Algorithmus genauere Ergebnisse nachgeben als eine oberflächlich gleichwertige wiederholende Methode. Zum Beispiel kann man N Zahlen entweder durch eine einfache Schleife hinzufügen, die jede Gegebenheit zu einer einzelnen Variable, oder durch D&C hinzufügt, hat Algorithmus pairwise Summierung genannt, die die Datei in zwei Hälften bricht, rekursiv die Summe jeder Hälfte schätzt, und dann die zwei Summen hinzufügt. Während die zweite Methode dieselbe Zahl von Hinzufügungen wie das erste durchführt, und den Gemeinkosten der rekursiven Anrufe bezahlt, ist es gewöhnlich genauer.

Durchführungsprobleme

Recursion

Teilen-und-überwinden Algorithmen werden als rekursive Verfahren natürlich durchgeführt. In diesem Fall werden die teilweisen Teilprobleme, die zu demjenigen zurzeit führen, gelöst im Verfahren-Anruf-Stapel automatisch versorgt.

Ausführlicher Stapel

Teilen Sie sich und siegen Sie Algorithmen können auch durch ein nichtrekursives Programm durchgeführt werden, das die teilweisen Teilprobleme in einer ausführlichen Datenstruktur, wie ein Stapel, Warteschlange oder Vorzugswarteschlange versorgt. Diese Annäherung erlaubt mehr Freiheit in der Wahl des Teilproblems, das als nächstes, eine Eigenschaft gelöst werden soll, die in einigen Anwendungen — z.B in der Breite der erste recursion und der Zweig und die gebundene Methode für die Funktionsoptimierung wichtig ist. Diese Annäherung ist auch die Standardlösung auf Programmiersprachen, die Unterstützung für rekursive Verfahren nicht zur Verfügung stellen.

Stapel-Größe

In rekursiven Durchführungen D&C Algorithmen muss man sicherstellen, dass es genügend für den Recursion-Stapel zugeteiltes Gedächtnis gibt, sonst kann die Ausführung wegen der Stapel-Überschwemmung scheitern. Glücklich D&C haben Algorithmen, die häufig zeiteffizient sind, relativ kleine recursion Tiefe. Zum Beispiel kann der Schnellsortierungsalgorithmus durchgeführt werden, so dass er nie mehr verlangt als verschachtelte rekursive Anrufe zu Sorte-Sachen.

Stapel-Überschwemmung kann schwierig sein zu vermeiden, wenn sie rekursive Verfahren verwendet, da viele Bearbeiter annehmen, dass der Recursion-Stapel ein aneinander grenzendes Gebiet des Gedächtnisses ist, und einige eine feste verfügbare Fläche dafür zuteilen. Bearbeiter können auch mehr Information im Recursion-Stapel sparen, als, wie Rücksprungadresse, unveränderliche Rahmen und die inneren Variablen des Verfahrens ausschließlich notwendig ist. So kann die Gefahr der Stapel-Überschwemmung durch die Minderung der Rahmen und inneren Variablen des rekursiven Verfahrens, und/oder durch das Verwenden einer ausführlichen Stapel-Struktur reduziert werden.

Die Auswahl der Grundfälle

In jedem rekursiven Algorithmus gibt es beträchtliche Freiheit in der Wahl der Grundfälle, die kleinen Teilprobleme, die direkt gelöst werden, um den recursion zu begrenzen.

Auswahl der kleinsten oder einfachstmöglichen Grundfälle ist eleganter und führt gewöhnlich zu einfacheren Programmen, weil es weniger Fälle gibt, um in Betracht zu ziehen, und sie leichter sind zu lösen. Zum Beispiel konnte ein FFT Algorithmus den recursion aufhören, wenn der Eingang eine einzelne Probe ist, und der Schnellsortierungslistensortieren-Algorithmus anhalten konnte, wenn der Eingang die leere Liste ist; in beiden Beispielen gibt es nur einen Grundfall, um in Betracht zu ziehen, und er verlangt keine Verarbeitung.

Andererseits verbessert sich Leistungsfähigkeit häufig, wenn der recursion an relativ großen Grundfällen angehalten wird, und diese nichtrekursiv gelöst werden. Diese Strategie vermeidet die Gemeinkosten von rekursiven Anrufen, die wenig oder keine Arbeit tun, und auch den Gebrauch von nichtrekursiven Spezialalgorithmen erlauben können, die, für jene Grundfälle, effizienter sind als ausführlicher recursion. Seit D&C reduziert Algorithmus schließlich jedes Problem oder Teilproblem-Beispiel zu einer Vielzahl von Grundbeispielen, diese beherrschen häufig die gesamten Kosten des Algorithmus besonders, wenn das Aufspalten/Verbinden oben niedrig ist. Bemerken Sie, dass diese Rücksichten nicht abhängen, ob recursion durch den Bearbeiter oder durch einen ausführlichen Stapel durchgeführt wird.

So, zum Beispiel, werden viele Bibliotheksdurchführungen der Schnellsortierung zu einer einfachen Schleife-basierten Einfügungssorte (oder ähnlich) Algorithmus schalten, sobald die Zahl von zu sortierenden Sachen genug klein ist. Bemerken Sie, dass, wenn die leere Liste der einzige Grundfall war, eine Liste mit n Einträgen sortierend, n+1 Schnellsortierungsanrufe zur Folge haben würde, die nichts als Rückkehr sofort tun würden. Die Erhöhung der Grundfälle zu Listen der Größe 2 oder weniger wird die meisten jener nichtstuerischen Anrufe beseitigen, und mehr allgemein wird ein Grundfall, der größer ist als 2, normalerweise verwendet, um den Bruchteil der Zeit zu reduzieren, die im Funktionsaufruf oben oder der Stapel-Manipulation verbracht ist.

Wechselweise kann man große Grundfälle verwenden, die noch einen teilen-und-überwinden Algorithmus verwenden, aber den Algorithmus für den vorher bestimmten Satz von festen Größen durchführen, wo der Algorithmus in den Code völlig entrollt werden kann, der keinen recursion, Schleifen oder conditionals (verbunden mit der Technik der teilweisen Einschätzung) hat. Zum Beispiel wird diese Annäherung in einigen effizienten FFT Durchführungen verwendet, wo die Grundfälle entrollte Durchführungen von teilen-und-überwinden FFT Algorithmen für eine Reihe fester Größen sind. Quellcodegenerationsmethoden können verwendet werden, um die Vielzahl von getrennten Grundfällen zu erzeugen, die wünschenswert sind, um diese Strategie effizient durchzuführen.

Die verallgemeinerte Version dieser Idee ist als recursion "das Entfalten" oder "Vergröbern" bekannt, und verschiedene Techniken sind vorgeschlagen worden, für das Verfahren zu automatisieren, den Grundfall zu vergrößern.

Das Teilen wiederholter Teilprobleme

Für einige Probleme kann der verzweigte recursion damit enden, dasselbe Teilproblem oft zu bewerten. In solchen Fällen kann es sich lohnen, die Lösungen dieser überlappenden Teilprobleme, eine Technik allgemein bekannt als memoization zu identifizieren und zu sparen. Gefolgt zur Grenze führt es von unten nach oben zu teilen-und-überwinden Algorithmen wie dynamische Programmierung und Karte-Syntaxanalyse.

Siehe auch

Links


Teilen Sie sich und herrschen Sie / Lotfi A. Zadeh
Impressum & Datenschutz