Dynamische Programmiermerkmale, Beispiele, Vorteile, Nachteile

Dynamische Programmiermerkmale, Beispiele, Vorteile, Nachteile

Der Dynamische Programmierung Es ist ein Algorithmusmodell, das ein komplexes Problem löst, indem es in Unterprobleme unterteilt ist und ihre Ergebnisse speichert, um zu vermeiden, dass diese Ergebnisse berechnet werden müssen.

Dieses Programm wird verwendet, wenn Probleme in ähnliche Unterprobleme unterteilt werden können, sodass ihre Ergebnisse wiederverwendet werden können. Für die Mehrheit wird dieses Programm zur Optimierung verwendet.

Dynamische Programmierung. Unterprobleme in der Fibonacci -Nachfolge überlagert. Quelle: Wikimedia Commons, AT: Benutzer: dcoatze, nach Benutzer verfolgt: Sternered / Public Domain

Vor dem Lösen des verfügbaren Teilproblems versucht der dynamische Algorithmus, die Ergebnisse der zuvor aufgelösten Unterprobleme zu untersuchen. Subproblem -Lösungen werden kombiniert, um die beste Lösung zu erreichen.

Anstatt immer wieder dasselbe Subproblem zu berechnen, kann Ihre Lösung in einem Speicher gespeichert werden, wenn Sie dieses Subproblema zum ersten Mal treffen. Wenn es während der Lösung eines anderen Teilproblems erneut erscheint, wird die bereits im Speicher gespeicherte Lösung genommen.

Dies ist eine wunderbare Idee, um die Zeit mit dem Speicher zu korrigieren, wo Sie bei der Verwendung zusätzlicher Raum die Zeit verbessern können, die erforderlich ist, um eine Lösung zu finden.

[TOC]

Eigenschaften der dynamischen Programmierung

Die folgenden wesentlichen Eigenschaften sind diejenigen, die ein Problem für die dynamische Programmierung angewendet werden können:

Optimale Unterstruktur

Diese Eigenschaft drückt aus, dass ein Optimierungsproblem gelöst werden kann, indem die optimalen Lösungen der sekundären Probleme kombiniert werden, die es ausmachen. Diese optimalen Unterstrukturen werden durch Rekursion beschrieben.

In einem Diagramm wird beispielsweise eine optimale Unterstruktur auf der kürzesten Route dargestellt, die von einem Scheitelpunkt zu einem Scheitelpunkt T geht:

Das heißt, auf dieser kürzesten Route r können Sie jeden Zwischenscheitelpunkt i nehmen. Wenn R wirklich die kürzeste Route ist, kann es in die Subrutas R1 (von S nach i) und R2 (von i bis t) unterteilt werden, so dass diese wiederum die kürzesten Routen zwischen den entsprechenden Eckpunkten sind.

Um die kürzesten Routen zu finden, können Sie die Lösung leicht rekursiv formulieren, was der Floyd-Warshall-Algorithmus tut.

Überlagerte Unterprobleme

Der Unterproblemraum muss klein sein. Das heißt, jeder rekursive Algorithmus, der ein Problem löst.

Um beispielsweise die Fibonacci-Serie zu erzeugen, kann diese rekursive Formulierung berücksichtigt werden: fn = f (n-1) + f (n-2), wobei er als Grundfall angenommen wird, dass f1 = f2 = 1. Dann müssen Sie: f33 = f32 + f31 und f32 = f31 + f30.

Wie zu sehen ist, wird F31 in den rekursiven Sub -Seasons von F33 und F32 gelöst. Obwohl die Gesamtzahl der Teilprobleme wirklich klein ist.

Kann Ihnen dienen: Die 7 Komponenten eines Informationssystems

Dies wird durch dynamische Programmierung berücksichtigt, sodass es jedes Teilproblem nur einmal löst. Dies kann auf zwei Arten erreicht werden:

Top -Ansatz

Wenn die Lösung für ein Problem mit der Lösung ihrer Unterprobleme rekursiv formuliert werden kann und sich diese Unterprobleme überlappen, können die Lösungen für die Unterprobleme leicht auswendig gelernt oder in einer Tabelle in einer Tabelle gespeichert werden.

Jedes Mal, wenn die Lösung eines neuen Unterproblems gesucht wird, wird sie in der Tabelle überprüft, wenn sie zuvor gelöst werden. Wenn eine Lösung gespeichert ist, wird sie verwendet, anstatt sie erneut zu berechnen. Andernfalls wird das Unterproblem behoben, wodurch die Lösung in der Tabelle gespeichert wird.

Aufsteiger Ansatz

Nachdem die Lösung eines Problems in Bezug auf seine Unterprobleme rekursiv formuliert wurde.

Dies erfolgt normalerweise auch in Form einer Tabelle, wobei iterative Lösungen für immer große Unterprobleme erzeugt werden, indem Lösungen für kleine Teilprobleme verwendet werden. Wenn beispielsweise die Werte von F31 und F30 bereits bekannt sind, kann der Wert von F32 direkt berechnet werden.

Vergleich mit anderen Techniken

Eine signifikante Zugehörigkeit eines Problems, das durch dynamische Programmierung gelöst werden kann, ist, dass es überlappende Unterprobleme haben sollte. Dies unterscheidet die dynamische Programmierung der Technik des Teilens und Erobertens, wo es nicht erforderlich ist, die einfachsten Werte zu speichern.

Es ähnelt der Rekursion, da durch Berechnung von Basisfällen der Endwert induktiv bestimmt werden kann. Dieser aufsteigende Ansatz funktioniert gut, wenn ein neuer Wert nur von zuvor berechneten Werten abhängt.

Beispiel

Mindestschritte, um 1 zu erreichen

Für jede positive ganze Zahl "E" können Sie einen der folgenden drei Schritte ausführen.

- 1 von der Zahl abziehen. (E = e-1).

- Wenn es durch 2 teilbar ist, ist es durch 2 geteilt (wenn e%2 == 0, dann e = e/2).

- Wenn es durch 3 teilbar ist, ist es durch 3 geteilt (wenn e%3 == 0, dann e = e/3).

Basierend auf den vorherigen Schritten müssen Sie die minimale Menge dieser zu erlegender Schritte finden und 1. Zum Beispiel:

- Wenn e = 1, Ergebnis: 0.

- Wenn e = 4, Ergebnis: 2 (4/2 = 2/2 = 1).

- Wenn e = 7, Ergebnis: 3 (7-1 = 6/3 = 2/2 = 1).

Ansatz

Sie könnten immer darüber nachdenken, den Schritt auszuwählen, der N so niedrig wie möglich macht und so weitergeht, bis er 1 erreicht. Es ist jedoch ersichtlich, dass diese Strategie hier nicht funktioniert.

Kann Ihnen dienen: kommerzielle Software

Wenn beispielsweise E = 10, wären die Schritte: 10/2 = 5-1 = 4/2 = 2/2 = 1 (4 Schritte). Der optimale Weg ist jedoch: 10-1 = 9/3 = 3/3 = 1 (3 Schritte). Daher müssen alle möglichen Schritte, die für jeden Wert von n durchgeführt werden können.

Alles beginnt mit Rekursion: f (e) = 1 + min f (e-1), f (e/2), f (e/3) wenn e> 1, als Basisfall: F (1 ) = 0. Mit der Wiederholungsgleichung können Sie die Rekursion mit der Codierung beginnen.

Es kann jedoch beobachtet werden, dass es überlagte Unterprobleme hat. Darüber hinaus hängt die optimale Lösung für einen bestimmten Eingang von der optimalen Lösung seiner Unterprobleme ab.

Wie bei der Auswendiglerie, wo die Lösungen der aufgelösten Unterprobleme gespeichert werden, um sie später zu verwenden. Oder wie bei der dynamischen Programmierung beginnt sie von unten und steigt zum gegebenen E. Als nächstes beide Codes:

Auswendiglernen

Dynamische Aufwärtsprogrammierung

Vorteile

Einer der Hauptvorteile bei der Verwendung dynamischer Programmierung ist, dass sie die Verarbeitung beschleunigt, da zuvor berechnete Referenzen verwendet werden. Wie eine rekursive Programmierungstechnik, reduziert es Programmcodezeilen.

Vorace -Algoritmos gegen dynamische Programmierung

Unersättliche Algorithmen ähneln der dynamischen Programmierung in dem Sinne, dass beide Werkzeuge für die Optimierung sind. Der Voraz -Algorithmus sucht jedoch in jedem lokalen Schritt eine optimale Lösung. Das heißt, es sucht nach einer gierigen Entscheidung mit der Hoffnung, ein globales Optimal zu finden.

Daher können unersättliche Algorithmen eine Annahme machen, die zu diesem Zeitpunkt optimal aussieht, aber in Zukunft teuer wird und kein globales Optimal garantiert.

Auf der anderen Seite findet die dynamische Programmierung die optimale Lösung für Unterprobleme und trifft dann eine fundierte Wahl, indem die Ergebnisse dieser Unterprobleme kombiniert werden, um die optimalste Lösung wirklich zu finden.

Nachteile

- Um das berechnete Ergebnis jedes Teilproblems zu speichern, ist viel Speicher erforderlich, ohne sicherzustellen, dass der gespeicherte Wert verwendet wird oder nicht.

- Oft wird der Ausgangswert gespeichert, ohne jemals in den folgenden Unterproblemen während der Ausführung jemals verwendet zu werden. Dies führt zu unnötigen Verwendung des Speichers.

- Bei der dynamischen Programmierung werden die Funktionen rekursiv bezeichnet. Dadurch bleibt der Akkuspeicher konstant erhöht.

Rekursivität gegenüber dynamischer Programmierung

Wenn Sie einen begrenzten Speicher haben, um den Code auszuführen und die Verarbeitungsgeschwindigkeit nicht besorgniserregend ist, kann die Rekursivität verwendet werden. Wenn beispielsweise eine mobile Anwendung entwickelt wird, ist der Speicher sehr beschränkt auf die Ausführung der Anwendung.

Kann Ihnen dienen: gemischte Geräte: Eigenschaften und Beispiele

Wenn das Programm schneller ausgeführt werden soll und es keine Speicherbeschränkungen gibt, ist es vorzuziehen, eine dynamische Programmierung zu verwenden.

Anwendungen

Dynamische Programmierung ist eine wirksame Methode, um Probleme zu lösen, die ansonsten in einer angemessenen Zeit extrem schwer zu lösen erscheinen könnten.

Algorithmen, die auf dem dynamischen Programmierparadigma basieren.

Dynamische Programmieralgorithmen

Die dynamische Programmierung ist sehr effektiv und dient sehr gut für eine Vielzahl von Problemen. Viele Algorithmen können als Anwendungen von unersättlichen Algorithmen angesehen werden, wie z

- Serie Fibonacci Numbers.

- Hanoi Towers.

- Alle kürzesten Routen Paare von Floyd-Warshall.

- Rucksack.

- Projektprogrammierung.

- Der kürzeste Weg von Dijkstra.

- Robotik -Flugkontrolle und Kontrolle.

- Mathematische Optimierungsprobleme.

- Gemeinsame Zeit: Programmieren Sie die Arbeit, um die Nutzung der CPU zu maximieren.

Serie Fibonacci Numbers

Fibonacci -Zahlen sind die Zahlen in der folgenden Sequenz: 0, 1, 1, 3, 5, 8, 13, 21, 34, 55, 89, 144 usw.

In der mathematischen Terminologie wird die FN -Folge von Fibonacci -Zahlen durch die Rezidivformel definiert: f (n) = f (n -1) + f (n -2), wobei f (0) = 0 und f (1) = 1.

Top -Ansatz

In diesem Beispiel wird eine Suchmatrix mit allen Anfangswerten mit -1 initialisiert. Immer wenn die Lösung für ein Teilproblem benötigt wird, wird sie zunächst in dieser Suchmatrix gesucht.

Wenn es den berechneten Wert gibt, wird dieser Wert zurückgegeben. Andernfalls wird das Ergebnis berechnet, um es in der Suchmatrix zu speichern und somit später wiederverwenden zu können.

Aufsteiger Ansatz

In diesem Fall wird für dieselbe Fibonacci -Reihe F (0), dann F (1), F (2), F (3) usw. zuerst berechnet. Somit werden die Lösungen der Teilprobleme von unten aufgebaut.

Verweise

  1. Vineet Choudhary (2020). Einführung in die dynamische Programmierung. Insider.Entnommen aus: DeveloperInsider.CO.
  2. Alex Allain (2020). Dynamische Programmierung in C++. C -Programmierung. Entnommen aus: Cprogrammming.com.
  3. Nach der Akademie (2020). Idee der dynamischen Programmierung. Genommen von: Afteracademy.com.
  4. Aniruddha Chaudhari (2019). Dynamische Programmierung und Rekursion | Anders. CSE Stack. Genommen von: cSestack.Org.
  5. Codekoch (2020). Für ein dynamisches Programmier -Tutorial. Entnommen aus: codhef.com.
  6. Programmiz (2020). Dynamische Programmierung. Entnommen aus: Programmiz.com.