Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 20

Substitution Method for Simple Recurrences

Recommended resources

Bonjour,

Dans la leçon précédente, nous avons établi une méthode formelle, l'invariant de boucle, pour prouver la correction des algorithmes itératifs. Nous avons vu que cette méthode est une application directe du raisonnement par récurrence.

Aujourd'hui, nous revenons à l'analyse de complexité, mais en nous concentrant cette fois sur les algorithmes récursifs. La structure récursive d'un algorithme se traduit naturellement par une relation de récurrence pour sa complexité. Notre objectif est d'apprendre à résoudre une classe simple mais fondamentale de ces relations : celles de la forme . Pour cela, nous allons explorer la méthode de substitution, une technique essentielle que nous aborderons sous deux angles : une approche intuitive par expansion, et une approche formelle par preuve inductive.

1. De l'algorithme récursif à la relation de récurrence

Analyser un algorithme récursif commence par la modélisation de son temps d'exécution. Le temps pour résoudre un problème de taille , noté , est la somme du temps des appels récursifs sur des sous-problèmes plus petits et du travail effectué à l'étape courante.

Pour comprendre concrètement comment on établit une telle relation, nous allons analyser un premier algorithme très simple.

2.1.1 Recurrence Relation (T(n)= T(n-1) + 1) #1

La vidéo suivante, de Abdul Bari, est un modèle de clarté. Elle montre comment, à partir d'une simple fonction C récursive, on peut à la fois tracer son exécution et dériver la relation de récurrence qui décrit sa complexité.

Regardez la vidéo du début jusqu'à 7:36. Concentrez-vous sur les deux aspects : Le traçage (0:18 - 4:34) : Comment l'exécution de test(3) génère une série d'appels. Cela donne une intuition sur le coût total, qui est proportionnel à n. La formulation (4:34 - 7:36) : Observez comment le corps de la fonction est décomposé pour obtenir l'équation T(n) = T(n-1) + 1. Retenez pourquoi le coût des opérations simples (test, affichage) est regroupé en une constante, ici 1.

Ce processus est fondamental. Une relation de récurrence pour la complexité est toujours composée de deux parties :

  • La relation récursive : Elle définit en fonction de termes plus petits. Pour l'exemple de la vidéo, c'est pour . Le terme représente le coût de l'appel récursif, et le +1 (ou plus généralement +c pour une constante ) représente le travail constant effectué à chaque appel (condition, printf, etc.).
  • Le cas de base : Il définit la valeur pour laquelle la récursion s'arrête. Ici, , car même l'appel qui ne fait rien consomme un temps constant.

Maintenant que nous avons notre équation, comment la "résoudre", c'est-à-dire trouver une forme non-récursive (une "forme close") pour ?


2. Méthode de substitution par itérations (ou "télescopage")

La première approche pour résoudre une récurrence est intuitive. Elle consiste à "dérouler" la définition récursive plusieurs fois jusqu'à ce qu'un schéma général se dégage. Cette méthode est aussi connue sous les noms de back-substitution, plug-and-chug ou télescopage.

2.1.1 Recurrence Relation (T(n)= T(n-1) + 1) #1

Continuons avec la même vidéo, qui enchaîne parfaitement en appliquant cette méthode.

Regardez la section de 7:36 à 13:29. Suivez attentivement les étapes de la substitution : On part de T(n) = T(n-1) + 1. On exprime T(n-1) en utilisant la même formule : T(n-1) = T(n-2) + 1. On substitue dans la première équation : T(n) = (T(n-2) + 1) + 1 = T(n-2) + 2. On répète le processus pour voir apparaître le motif : T(n) = T(n-k) + k. On résout en allant jusqu'au cas de base (n-k=0), ce qui implique k=n. On obtient alors T(n) = T(0) + n.

La méthode est donc :

  1. Développer la récurrence sur plusieurs termes.
  2. Identifier un motif général après substitutions.
  3. Résoudre en fonction du cas de base pour trouver une forme close.

Pour avec , on a trouvé . La complexité est donc bien, comme notre intuition le suggérait, en .

Cette méthode s'applique aussi lorsque le travail à chaque étape n'est pas constant. Considérons un algorithme dont le temps d'exécution est décrit par . Cela pourrait correspondre à une fonction récursive qui contient une boucle for de 1 à n.

Le raisonnement est identique, mais les calculs sont un peu plus complexes. La somme qui apparaît ne sera plus une somme de constantes.


3. La méthode de substitution par preuve d'induction

La méthode par itérations est excellente pour deviner une solution. Cependant, pour une préparation à l'Agrégation, il est impératif de savoir prouver formellement que notre "supposition" est correcte. C'est ici qu'intervient la seconde facette de la méthode de substitution, telle que présentée dans les ouvrages de référence comme le Cormen.

The substitution method for solving recurrences

Le document suivant, un extrait adapté du livre de Cormen et al., formalise cette approche. Elle est en parfaite continuité avec la leçon précédente sur les invariants de boucle.

Lisez la section 4.3 'The substitution method for solving recurrences' jusqu'à la fin du premier paragraphe. Retenez les deux étapes clés.

La méthode se déroule en deux temps :

  1. Deviner la forme de la solution (par exemple, en utilisant la méthode par itérations que nous venons de voir, ou simplement par intuition).
  2. Prouver la solution par récurrence (induction mathématique) que cette forme est correcte, en déterminant les constantes nécessaires.

Appliquons cela à notre récurrence avec .

  1. Devinette : Nous avons vu que la solution est . Nous allons donc essayer de prouver que . Formellement, nous voulons montrer qu'il existe une constante et un rang tels que pour tout , .

  2. Preuve par récurrence :

    • Hypothèse de récurrence : .

    • Cas de base : Pour , nous avons . L'hypothèse est vraie si nous choisissons .

    • Cas inductif : Supposons que est vraie pour , c'est-à-dire . Montrons que est vraie.

      Nous voulons montrer que cette expression est inférieure ou égale à .

      Cette inégalité est vraie si , soit .

    • Conclusion : Nous avons trouvé une condition sur () qui fonctionne à la fois pour le cas de base et pour le cas inductif. Nous pouvons donc choisir un tel (par exemple, si ), et la preuve est complète. Nous avons formellement démontré que .

Cette démarche est plus rigoureuse et sera votre outil de prédilection pour les démonstrations formelles.


4. Exercice d'application

Mettons maintenant ces deux approches en synergie pour résoudre une récurrence légèrement plus complexe.

Problème : Soit la récurrence avec .

Étape 1 : Intuition par back-substitution
Regardez comment cette récurrence est résolue avec la méthode par itérations.

2.1.2 Recurrence Relation (T(n)= T(n-1) + n) #2

Cette autre vidéo de Abdul Bari applique la même méthode de back-substitution à notre nouvelle récurrence.

Regardez la section de 7:40 à 15:23. L'objectif n'est pas de mémoriser chaque ligne, mais de comprendre comment le déroulement de la récurrence fait apparaître la somme des entiers de 1 à n : 1 + 2 + ... + n.

Comme le montre la vidéo, la solution est . Cette expression est un polynôme de degré 2. La complexité est donc en .

Étape 2 : Preuve formelle par induction

Maintenant que nous avons une excellente supposition (), votre tâche est de le prouver formellement.

Exercice : Montrez que la solution de est . (Ceci correspond à l'exercice 4.3-1 du document didawiki.)

Votre démarche :

  1. Objectif : Prouver qu'il existe des constantes et telles que pour .
  2. Cas de base : Vérifiez pour . On a . L'inégalité est vraie si .
  3. Cas inductif :
    • Supposez pour .
    • Développez .
    • Utilisez votre hypothèse et développez l'expression .
    • Essayez de montrer que le résultat est . Vous devriez arriver à une condition de la forme , qui se simplifie en .
    • Analysez cette dernière inégalité : si vous choisissez une constante suffisamment grande (par exemple ), est-ce que cette condition est remplie pour tout ? Vous constaterez que oui, car le terme en dominera les autres.

Prenez le temps de rédiger cette preuve, c'est un excellent entraînement à la manipulation d'inégalités et au raisonnement par récurrence.


Conclusion

Aujourd'hui, nous avons jeté les bases de l'analyse des algorithmes récursifs. Nous avons appris à traduire un algorithme en relation de récurrence et à la résoudre par la méthode de substitution.

Points clés à retenir :

  • La complexité d'un algorithme récursif est modélisée par une relation de récurrence.
  • La méthode de substitution par itérations (télescopage) est une technique intuitive pour "deviner" la forme close d'une récurrence en la déroulant.
  • La méthode de substitution par induction est la technique formelle pour prouver qu'une solution supposée est correcte. Elle s'articule en deux temps : deviner et prouver.
  • Nous avons résolu et .

Dans la prochaine leçon, nous passerons à une nouvelle famille de récurrences, celles issues des algorithmes de type "diviser pour régner", comme le tri fusion. Ces récurrences ont la forme . Pour les résoudre, nous découvrirons un outil extrêmement puissant et rapide : le théorème maître (Master Theorem).