Différence entre la programmation dynamique, l'approche diviser pour régner, et les algorithmes gloutons

23 Mar 2023 23 Mar 2023 2342 vues ESSADDOUKI Mostafa 11 min de lecture
Complexité algorithmique
1 Introduction à l'analyse des algorithmes 2 Notations asymptotiques 3 Opérations élémentaires et modèles de coût 4 Complexité temporelle et spatiale 5 Méthode de comptage des pas 6 Méthode de comptage des pas pour les boucles
Diviser pour régner & algorithmes de tri
7 Rappel sur l'approche récursive 8 Diviser pour régner 9 la recherche dichotomique 10 Tri par fusion 11 Tri rapide 12 Analyse des fonctions récursives
Les arbres binaires
13 Introduction aux arbres binaires 14 Définitions récursives des arbres 15 Propriétés des arbres binaires 16 Types d'arbre binaire 17 Parcours en profondeur des arbres binaires 18 Parcours en largeur des arbres binaires 19 Exercices corrigés sur les arbres - TD 1 20 Exercices corrigés sur les arbres - TD 2 21 Exercices corrigés sur les arbres - TD 3 22 DS - Arbres binaires de recherche équilibrés (AVL) 23 DS - Codage de Huffman - Compression de données
Algorithmes gloutons
24 Introduction aux algorithmes gloutons 25 Problème de la sélection d'activités 26 Problème de séquencement des tâches 27 Problème du Sac à Dos fraction
Programmation dynamique
28 Introduction à la programmation dynamique 29 Le concept de sous-structure optimale 30 Le concept de sous-problèmes superposés 31 Méthodes de la programmation dynamique 32 Différence entre la programmation dynamique, l'approche diviser pour régner, et les algorithmes gloutons 33 Calculer les nombres de catalan en C++ et Python 34 Calculer le coefficient binomial 35 Le nombre de façons pour construire un mur de dimension 4*N 36 Défi de conversion de mots 37 Décomposition de phrases à partir d'un dictionnaire 38 La collection de pièces dans un labyrinthe 39 Nombre de façons de regrouper les étudiants 40 Compter tous les chemins possibles dans une grille MxN
Méta heuristique
41 Algorithmes heuristiques et métaheuristiques 42 Algorithme de Recuit simulé 43 Algorithme Colonies de fourmis
Théorie des graphes
44 Introduction et notions fondamentales 45 Chemins, cycles et connexité 46 Représentations des graphes 47 Parcours de graphes 48 Algorithme de Dijkstra 49 Algorithme A* 50 Algorithme de Bellman-Ford 51 Algorithme Floyd-Warshall 52 Coloration des graphes
Base de données et SQL
53 Introduction au langage SQL 54 Concepts de base de SGBDR 55 Syntaxes de différentes instructions SQL 56 Création et suppression d'une base de données 57 Opérateurs SQL 58 Les contraintes en SQL 59 Création et suppression des tables en SQL 60 Insertion et modifications des enregistrements 61 Extraction des données - SELECT 62 Filtrer les données - WHERE 63 Recherche de motifs - LIKE 64 Trier les données - ORDER BY 65 Les jointures en SQL - JOIN 66 Fonctions d'agrégation en SQL - SUM, COUNT, AVG, MIN et MAX 67 Organiser des données identiques en groupes - GROUP BY et HAVING 68 Les sous-requêtes en SQL 69 Les fonctions SQL de manipulation de date 70 DS - langage SQL 71 Exercices corrigés de langage SQL
Introduction à l'intelligence artificielle
Introduction à la théorie des jeux
Préparation aux concours
72 Réseau de distribution d'eau 73 Arbre d'expression arithmétique 74 Exploration d'une grotte souterraine

Programmation dynamique vs Diviser pour régner vs Algorithmes gloutons

Trois paradigmes algorithmiques majeurs

La programmation dynamique, l'approche diviser pour régner et les algorithmes gloutons sont des techniques d'optimisation algorithmique qui peuvent être utilisées pour résoudre des problèmes complexes. Chacune a ses propres caractéristiques, forces et faiblesses.

Les trois approches en bref

 Approche

Programmation dynamique

La programmation dynamique est généralement utilisée pour les problèmes d'optimisation combinatoire, où une solution doit être trouvée parmi un grand nombre de possibilités.

Principe : Décomposer le problème en sous-problèmes plus petits et résoudre chaque sous-problème de manière récursive, en mémorisant les résultats pour éviter les calculs redondants (mémoïsation).

Exemples : Plus court chemin, LCS, sac à dos, Fibonacci optimisé.

 Approche

Diviser pour régner

La technique de diviser pour régner est souvent utilisée pour les problèmes où une solution peut être facilement trouvée en combinant les solutions de sous-problèmes plus petits et indépendants.

Principe : Diviser le problème en sous-problèmes plus petits, résoudre chaque sous-problème de manière récursive et combiner les résultats.

Exemples : Tri fusion, tri rapide, recherche binaire, multiplication de matrices.

 Approche

Algorithmes gloutons

Les algorithmes gloutons sont une technique d'optimisation qui consiste à faire des choix locaux optimaux à chaque étape, dans l'espoir que ces choix locaux conduiront à une solution globale optimale.

Principe : Prendre la décision qui semble la meilleure sur le moment, sans jamais revenir en arrière.

Exemples : Dijkstra, Kruskal, rendu de monnaie (systèmes canoniques), sac à dos fractionnaire.

Tableau comparatif détaillé

CaractéristiqueProgrammation dynamiqueDiviser pour régnerAlgorithmes gloutons
Type de problèmesOptimisation combinatoireProblèmes divisibles indépendantsOptimisation locale
Structure des sous-problèmesSuperposés (overlapping)IndépendantsUn seul sous-problème à chaque étape
Mémoïsation / CacheEssentielle (stockage des résultats)Non nécessaireNon nécessaire
ApprocheTop-down ou bottom-upTop-down récursifSéquentiel (pas à pas)
Retour en arrièreOui (explore toutes les possibilités)Oui (via récursion)Non (décisions définitives)
Garantie d'optimalitéOui (si structure optimale)Oui (pour les problèmes adaptés)Pas toujours (dépend du problème)
Complexité temporelleSouvent polynomiale (O(n²), O(n³))Souvent O(n log n) ou exponentielleSouvent linéaire ou O(n log n)
Complexité spatialePeut être élevée (stockage des résultats)Liée à la profondeur de récursionGénéralement faible (O(1) ou O(n))
Facilité d'implémentationComplexe (choix des états, récurrence)Moyenne (récursion + combinaison)Simple (choix local évident)

Points communs entre les trois approches

Objectif commun

Les trois approches visent à résoudre des problèmes complexes en décomposant ou en simplifiant le problème initial, afin de réduire la complexité temporelle et/ou spatiale.

Adaptabilité

Les trois techniques peuvent être appliquées à divers problèmes d'optimisation et de recherche. Leur efficacité dépend de la nature du problème et de ses contraintes.

Approches complémentaires

Dans certains cas, les trois techniques peuvent être combinées pour résoudre un problème spécifique. Par exemple, un algorithme de programmation dynamique peut utiliser une approche de diviser pour régner pour réduire la taille des sous-problèmes.

⚖️ Compromis temps/mémoire

Les trois approches font des compromis entre temps d'exécution et utilisation mémoire, mais de manières différentes : la PD privilégie la mémoire pour gagner du temps, DPR est souvent équilibré, et les gloutons minimisent les deux.

Différences fondamentales

1. Gestion des sous-problèmes

CritèreProgrammation dynamiqueDiviser pour régnerAlgorithmes gloutons
Relation entre sous-problèmesSuperposés (dépendants)IndépendantsUn seul chemin exploré
Nombre de sous-problèmesNombre limité d'états uniquesSouvent une arborescence complèteUn seul sous-problème par étape
Réutilisation des résultatsEssentielle (mémoïsation)Aucune (chaque sous-problème est unique)Sans objet

Illustration des différences

Programmation dynamique
    Problème
    /      \
   A        B
    \      /
       C
 (C partagé)
            
Diviser pour régner
    Problème
    /      \
   A        B
  / \      / \
 A1  A2   B1  B2
 (indépendants)
            
Algorithme glouton
    Étape 1 → Étape 2 → Étape 3 → ...
    (un seul chemin, pas de retour)
            

2. Optimalité des solutions

Programmation dynamique et diviser pour régner

Garantissent généralement des solutions optimales pour les problèmes qu'elles résolvent, car elles explorent (explicitement ou implicitement) toutes les possibilités.

Algorithmes gloutons

Ne fournissent pas toujours des solutions optimales. Cependant, dans certains cas, ils peuvent produire des solutions optimales ou des solutions proches de l'optimal.

Avantage : Ils sont souvent plus simples et plus rapides, ce qui les rend attrayants quand une solution approchée suffit ou quand les ressources sont limitées.

3. Compromis temps/mémoire

AspectProgrammation dynamiqueDiviser pour régnerAlgorithmes gloutons
TendanceRéduit le temps au prix de la mémoireÉquilibre souvent bonMinimise les deux
Stockage intermédiaireÉlevé (tableaux, dictionnaires)Pile de récursion uniquementMinimal (quelques variables)
Exemple typiqueFloyd-Warshall: O(n²) mémoireMerge sort: O(n) mémoire temporaireDijkstra: O(n) pour les distances

Exemples concrets comparés

Exemple 1 : Calcul de Fibonacci

MéthodeCodeComplexité tempsComplexité mémoire
Diviser pour régner (naïf)return fib(n-1) + fib(n-2)O(2ⁿ) - exponentielO(n) - pile
Programmation dynamiquememo[n] = fib(n-1) + fib(n-2)O(n) - linéaireO(n) - cache
GloutonNon applicable (pas de choix local évident)

Exemple 2 : Plus court chemin

MéthodeAlgorithmeCaractéristiquesOptimalité
Programmation dynamiqueFloyd-WarshallCalcule toutes les paires, O(n³), O(n²) mémoireOptimale
Diviser pour régnerNon standard pour ce problèmePeu adapté-
GloutonDijkstraSource unique, O((V+E)log V) avec tasOptimale (poids positifs)

Exemple 3 : Sac à dos

MéthodeVersionComplexitéOptimalité
Programmation dynamiqueSac à dos 0/1O(n × capacité)Optimale
Diviser pour régnerNon adapté--
GloutonSac à dos fractionnaireO(n log n)Optimale
GloutonSac à dos 0/1O(n log n)Pas optimale en général

Comment choisir la bonne approche ?

Arbre de décision
  1. Le problème a-t-il une sous-structure optimale ?
    • Non → Peut-être diviser pour régner si indépendance, sinon chercher autre chose
    • Oui → Passer à l'étape suivante
  2. Y a-t-il superposition des sous-problèmes ?
    • Oui → Programmation dynamique (exploite la superposition)
    • Non → Peut-on faire un choix local optimal définitif ?
  3. Le choix local optimal mène-t-il à l'optimum global ?
    • Oui → Algorithme glouton (efficace et simple)
    • Non → Diviser pour régner (si sous-problèmes indépendants)

Résumé des critères de choix

CritèreProgrammation dynamiqueDiviser pour régnerAlgorithmes gloutons
Sous-structure optimaleRequiseRequiseRequise
Sous-problèmes superposésRequisIndépendantsN/A
Propriété de choix gloutonNon nécessaireNon nécessaireRequise
Exploration exhaustiveOui (implicitement)Oui (explicitement)Non (un seul chemin)
 Exercice pratique

Choisir la bonne technique

 Niveau : Intermédiaire

Pour chacun des problèmes suivants, indiquez quelle technique (programmation dynamique, diviser pour régner, ou glouton) serait la plus appropriée et justifiez votre réponse :

  1. Problème A : Trier une liste de nombres.
  2. Problème B : Trouver la plus longue sous-séquence croissante dans une séquence.
  3. Problème C : Trouver l'arbre couvrant de poids minimum d'un graphe.
  4. Problème D : Calculer le nombre de façons de monter un escalier de n marches (pas de 1 ou 2).
  5. Problème E : Rechercher un élément dans un tableau trié.
  6. Problème F : Problème du voyageur de commerce (TSP) pour une solution exacte.
Points clés à retenir
  • La programmation dynamique est idéale pour les problèmes avec sous-structure optimale et sous-problèmes superposés (ex: LCS, sac à dos, Floyd-Warshall).
  • L'approche diviser pour régner convient aux problèmes où les sous-problèmes sont indépendants et peuvent être combinés (ex: tri fusion, recherche binaire).
  • Les algorithmes gloutons s'appliquent quand un choix local optimal mène à une solution globale optimale (ex: Dijkstra, Kruskal, rendu de monnaie canonique).
  • La PD et DPR garantissent généralement l'optimalité, tandis que les gloutons ne l'offrent que sous certaines conditions.
  • La PD fait un compromis temps/mémoire explicite en stockant les résultats intermédiaires.
  • Les trois approches peuvent être combinées : par exemple, un algorithme de PD peut utiliser DPR pour réduire la taille des sous-problèmes.
  • Le choix de la technique dépend de la nature du problème : indépendance des sous-problèmes, présence de superposition, validité de la propriété de choix glouton.

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.