web-dev-qa-db-fra.com

Quelle est la différence entre la mémoisation et la programmation dynamique?

Quelle est la différence entre la mémoisation et la programmation dynamique? Je pense que la programmation dynamique est un sous-ensemble de la mémoisation. Est ce bien?

213
Sanghyun Lee

Quelle est la différence entre la mémoisation et la programmation dynamique?

Memoization est un terme décrivant une technique d'optimisation dans laquelle vous mettez en cache les résultats précédemment calculés et renvoyez le résultat mis en cache lorsque le même calcul est nécessaire à nouveau.

La programmation dynamique est une technique permettant de résoudre des problèmes de nature récursive, de manière itérative, et qui est applicable lorsque les calculs des sous-problèmes se chevauchent.

La programmation dynamique est généralement implémentée à l'aide de la tabulation, mais peut également être implémentée à l'aide de la mémorisation. Comme vous pouvez le constater, aucun des deux n’est un "sous-ensemble" de l’autre.


Une question de suivi raisonnable est la suivante: Quelle est la différence entre la tabulation (technique de programmation dynamique typique) et la mémoisation?

Lorsque vous résolvez un problème de programmation dynamique à l’aide de la tabulation, vous résolvez le problème " de bas en haut ", c’est-à-dire en résolvant d’abord tous les sous-problèmes liés, up an n - tableau dimensionnel. Sur la base des résultats du tableau, la solution au problème "top"/original est ensuite calculée.

Si vous utilisez la mémorisation pour résoudre le problème, vous devez le faire en maintenant une carte des problèmes déjà résolus. Vous le faites " de haut en bas " en ce sens que vous résolvez le problème "du haut" en premier (ce qui est généralement récurrent pour résoudre les problèmes secondaires).

Une bonne glissade de ici (lien est maintenant mort, la diapositive est toujours bonne):

  • Si tous les sous-problèmes doivent être résolus au moins une fois, un algorithme de programmation dynamique de bas en haut surpasse généralement celui d'un algorithme mémorisé de haut en bas d'un facteur constant
    • Pas de temps système pour la récursion et moins de temps système pour le maintien de la table
    • Il existe certains problèmes pour lesquels le modèle habituel d'accès aux tables dans l'algorithme de programmation dynamique peut être exploité pour réduire davantage les exigences de temps ou d'espace.
  • S'il n'est pas du tout nécessaire de résoudre certains sous-problèmes dans l'espace des sous-problèmes, la solution mémoisée présente l'avantage de ne résoudre que les sous-problèmes réellement nécessaires.

Ressources supplémentaires:


Ceci a été réécrit sous forme d'article ici .

320
aioobe

La programmation dynamique est un paradigme algorithmique qui résout un problème complexe en le divisant en sous-problèmes et stocke les résultats des sous-problèmes afin d'éviter de calculer à nouveau les mêmes résultats.

http://www.geeksforgeeks.org/dynamic-programming-set-1/

La mémorisation est une méthode simple pour suivre les solutions précédemment résolues (souvent implémentées sous la forme d'une paire de valeurs de clé de hachage, par opposition à la tabulation qui est souvent basée sur des tableaux) afin qu'elles ne soient pas recalculées lorsqu'elles sont à nouveau rencontrées. Il peut être utilisé dans les méthodes ascendantes ou descendantes.

Voir cette discussion sur la mémoisation vs la tabulation.

La programmation dynamique est donc une méthode permettant de résoudre certaines catégories de problèmes en résolvant les relations/récurrences de récurrence et en stockant les solutions précédemment trouvées, soit par tabulation, soit par mémorisation. La mémorisation est une méthode permettant de garder une trace des solutions aux problèmes précédemment résolus. Elle peut être utilisée avec toute fonction disposant de solutions déterministes uniques pour un ensemble donné d'entrées.

42
Tom M

La programmation dynamique est souvent appelée mémorisation!

  1. La mémorisation est la technique descendante (commencer à résoudre le problème donné en le décomposant) et la programmation dynamique est une technique ascendante (commencer à résoudre du sous-problème trivial vers le problème donné)

  2. DP trouve la solution en partant du ou des cas de base et progresse vers le haut. DP résout tous les sous-problèmes, parce qu'il le fait de bas en haut

    Contrairement à la mémorisation, qui ne résout que les problèmes secondaires nécessaires

  3. DP a le potentiel de transformer des solutions à force brute à temps exponentiel en algorithmes à temps polynomiaux.

  4. Le DP peut être beaucoup plus efficace parce que son itératif

    Au contraire, Memoization doit payer pour les frais généraux (souvent importants) dus à la récursivité.

Pour être plus simple, Memoization utilise l’approche descendante pour résoudre le problème, c’est-à-dire qu’il commence par le problème principal (principal), puis le divise en sous-problèmes et résout ces problèmes de manière similaire. Dans cette approche, le même sous-problème peut se produire plusieurs fois et consommer plus de cycle de la CPU, augmentant ainsi la complexité temporelle. Alors que dans la programmation dynamique, le même sous-problème ne sera pas résolu plusieurs fois mais le résultat précédent sera utilisé pour optimiser la solution.

12
Farah Nazifa

(1) Mémoization et DP, conceptuellement, est vraiment la même chose. Parce que: considérons la définition de DP: "chevauchement de sous-problèmes" "et sous-structure optimale". Memoization possède pleinement ces 2.

(2) La mémorisation est DP avec le risque de débordement de pile si la récursion est profonde. DP bottom up n'a pas ce risque.

(3) La mémorisation nécessite une table de hachage. Donc, un espace supplémentaire, et un peu de temps de recherche.

Donc, pour répondre à la question:

-Conceptuellement, (1) signifie qu'ils sont la même chose.

-En prenant (2) en compte, si vous voulez vraiment, la mémorisation est un sous-ensemble de DP, dans le sens où un problème pouvant être résolu par mémorisation sera résolu par DP, mais qu'un problème pouvant être résolu par DP ne peut pas être résolu par mémorisation (car débordement possible).

-En prenant en compte (3), ils présentent des différences de performances mineures.

8
PoweredByRice

De wikipedia:

mémorisation

En informatique, la mémorisation est une technique d'optimisation principalement utilisée pour accélérer les programmes informatiques en permettant aux appels de fonction d'éviter de répéter le calcul des résultats pour des entrées précédemment traitées.

Programmation dynamique

En mathématiques et en informatique, la programmation dynamique est une méthode permettant de résoudre des problèmes complexes en les décomposant en sous-problèmes plus simples.

Lorsque vous divisez un problème en sous-problèmes plus petits/plus simples, nous rencontrons souvent le même sous-problème plus d'une fois. Nous utilisons donc Memoization pour enregistrer les résultats de calculs antérieurs, sans avoir à les répéter.

La programmation dynamique rencontre souvent des situations où il est judicieux d'utiliser la mémorisation, mais vous pouvez utiliser l'une ou l'autre technique sans nécessairement utiliser l'autre.

6
yurib

La mémorisation et la programmation dynamique ne résolvent qu'une seule fois un sous-problème individuel.

La mémorisation utilise la récursivité et fonctionne de haut en bas, tandis que la programmation dynamique se déplace en sens inverse, ce qui résout le problème de manière ascendante.

Voici une analogie intéressante -

Top-down - D'abord, vous dites que je vais conquérir le monde. Comment feras-tu cela? Vous dites que je vais d'abord conquérir l'Asie. Comment feras-tu cela? Je vais d'abord prendre en charge l'Inde. Je vais devenir le ministre en chef de Delhi, etc.

Bottom-up - Vous dites que je vais devenir le CM de Delhi. Ensuite, l'Inde, tous les autres pays d'Asie et enfin le monde entier.

4
Priyanshu Agarwal

Je voudrais aller avec un exemple ;

Problème:

Vous montez un escalier. Il faut n étapes pour atteindre le sommet.

Chaque fois, vous pouvez monter 1 ou 2 marches. De combien de façons distinctes pouvez-vous monter au sommet?

enter image description here

Récursion avec mémorisation

De cette façon, nous procédons à l’élagage (élimination de la matière excédentaire d’un arbre ou d’un arbuste) à l’aide du mémo array et réduisons la taille de l’arbre de récurrence.

public class Solution {
    public int climbStairs(int n) {
        int memo[] = new int[n + 1];
        return climb_Stairs(0, n, memo);
    }
    public int climb_Stairs(int i, int n, int memo[]) {
        if (i > n) {
            return 0;
        }
        if (i == n) {
            return 1;
        }
        if (memo[i] > 0) {
            return memo[i];
        }
        memo[i] = climb_Stairs(i + 1, n, memo) + climb_Stairs(i + 2, n, memo);
        return memo[i];
    }
}

Programmation dynamique

Comme nous pouvons le constater, ce problème peut être divisé en sous-problèmes, et il contient la propriété de sous-structure optimale, c’est-à-dire que sa solution optimale peut être construite efficacement à partir de solutions optimales de ses sous-problèmes. Nous pouvons utiliser la programmation dynamique pour résoudre ce problème.

public class Solution {
    public int climbStairs(int n) {
        if (n == 1) {
            return 1;
        }
        int[] dp = new int[n + 1];
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
}

Exemples tirés de https://leetcode.com/problems/climbing-stairs/

1
Teoman shipahi