Terminale · Algorithmique

Diviser pour régner

Pour traiter un grand problème, on peut parfois le découper en problèmes de même nature mais plus petits. La difficulté ne disparaît pas : elle se répartit entre la division, les solutions partielles et leur combinaison. C’est cette organisation qui caractérise la méthode diviser pour régner.

SofienAvec SofienIngénieur et enseignant en informatique
Dans ce chapitre

Un cap pour ce chapitre

Ce que vous saurez faire

  • Identifier division, résolution et combinaison.
  • Choisir des cas de base cohérents.
  • Distinguer récursion et stratégie algorithmique.
Les bases utiles pour commencer

Trois questions à poser au problème

Comment découper l’entrée ? Comment résoudre chaque morceau ? Comment reconstruire la réponse globale ? Pour trier une liste, on peut la couper en deux, trier les moitiés puis les fusionner. Les sous-problèmes appartiennent au même type de tâche, mais portent sur des entrées plus petites.

Le cas de base doit être directement résolu : une liste vide ou contenant un seul élément est déjà triée. La réduction garantit que les appels atteignent ces bases. La combinaison n’est pas toujours une simple concaténation ; dans un tri, deux moitiés triées doivent être entrelacées selon leurs valeurs.

Voir le découpage dans une image

Une image carrée peut être représentée par une matrice de pixels. Pour une rotation d’un quart de tour horaire, le pixel situé en ligne i, colonne j devient celui de ligne j, colonne n-1-i. Sur une matrice 2×2 dont les lignes sont A B puis C D, on obtient C A puis D B.

On peut aussi découper une image de côté puissance de deux en quatre quadrants. Chaque quadrant doit tourner intérieurement ; les quadrants changent ensuite de position : bas gauche vers haut gauche, haut gauche vers haut droite, haut droite vers bas droite, bas droite vers bas gauche. Déplacer les quadrants sans tourner leur contenu ne suffit pas.

Pour visualiser le déplacement, gardez les indices à partir de zéro et choisissez d’abord les quatre coins. Le coin supérieur gauche (0,0) va en (0,n-1), le supérieur droit en (n-1,n-1). Ce repère distingue rotation horaire, rotation antihoraire et simple transposition.

Écrire une transformation de référence

Une version simple construit une nouvelle matrice. Elle permet de vérifier facilement les coordonnées attendues et de servir de référence à une version plus élaborée.

def tourner(image):
    n = len(image)
    resultat = [[None for _ in range(n)] for _ in range(n)]
    for i in range(n):
        for j in range(n):
            resultat[j][n - 1 - i] = image[i][j]
    return resultat

Cette implémentation est itérative et utilise une mémoire supplémentaire proportionnelle au nombre de pixels. Elle illustre la transformation, pas à elle seule une implémentation récursive de diviser pour régner. Pour une version récursive, il faut rendre explicites les régions, les sous-appels et la combinaison.

Écrire une division récursive complète

Voici une fonction complète qui cherche le maximum d’une liste non vide de nombres. Chaque appel traite l’intervalle semi-ouvert [debut, fin[ ; ses deux moitiés sont strictement plus petites tant que leur longueur dépasse un. La combinaison compare les deux maxima.

def maximum(valeurs):
    assert len(valeurs) > 0

    def chercher(debut, fin):
        if fin - debut == 1:
            return valeurs[debut]
        milieu = (debut + fin) // 2
        gauche = chercher(debut, milieu)
        droite = chercher(milieu, fin)
        return max(gauche, droite)

    return chercher(0, len(valeurs))

Sur [4,9,2,7], les maxima des deux moitiés valent neuf et sept ; leur maximum vaut neuf. La méthode est récursive et divise réellement le problème, mais elle conserve un coût linéaire : chaque valeur doit être examinée. Une meilleure organisation n’implique donc pas toujours un meilleur ordre de coût.

Découper n’assure pas automatiquement une amélioration. Si chaque combinaison recopie beaucoup de données ou résout de nouveau le problème entier, le coût peut rester élevé. Le tri fusion réalise des fusions linéaires à chaque niveau ; cette structure explique son coût en n log n.

Pour la rotation, des échanges cycliques de quatre pixels permettent aussi une réalisation en place avec quelques variables temporaires. Le programme officiel évoque la rotation avec faible mémoire comme exemple ; il faut préciser si l’on compte la mémoire de la pile récursive. Un traitement en place n’implique pas automatiquement une mémoire auxiliaire totale constante lorsque la récursion conserve plusieurs niveaux d’appels.

Exemple suivi : deux niveaux de découpage

Dans une image 4×4 numérotée ligne par ligne de 1 à 16, le quadrant supérieur gauche contient [1,2] puis [5,6]. Sa rotation interne produit [5,1] puis [6,2]. Ce quadrant se déplace ensuite en haut à droite. Le quadrant inférieur gauche contient [9,10] puis [13,14] ; il devient [13,9] puis [14,10] et se déplace en haut à gauche. Les deux premières lignes complètes deviennent donc [13,9,5,1] et [14,10,6,2].

Ce calcul montre les deux responsabilités de la combinaison : déplacer les régions et préserver leur orientation correcte. Si les quadrants étaient déplacés sans tourner intérieurement, le pixel 13 n’arriverait pas au coin supérieur gauche. Pour une taille puissance de deux, on peut recommencer la subdivision jusqu’aux pixels seuls, dont la rotation interne ne change rien. La formule globale des coordonnées fournit un contrôle indépendant de cette récursion.

Exemple suivi : analyser le maximum divisé

Pour [4,9,2,7,5], l’intervalle [0,5[ se coupe en [0,2[ et [2,5[. Le premier maximum vaut 9 ; le second, calculé à partir de [2] et [7,5], vaut 7. Leur comparaison fournit 9. Une feuille de la décomposition contient exactement une valeur ; elle n’a pas besoin de comparaison pour donner son maximum.

Si deux parties contiennent a et b valeurs, leurs calculs demandent respectivement a-1 et b-1 comparaisons, puis la combinaison en ajoute une : a+b-1. On retrouve n-1 comparaisons pour n valeurs, comme une recherche séquentielle bien écrite. La division réduit la profondeur des appels par rapport à une récursion qui enlève une seule valeur, mais elle ne peut éviter d’examiner tous les candidats. Cette analyse apprend à séparer forme de la récursion et quantité de travail.

À vous de faire varier les choses

Tournez une image en suivant les coordonnées

Choisissez une taille et un nombre de quarts de tour. Les valeurs identifient les pixels pour vérifier chaque déplacement.

Lire le résultat de l’expérience initiale

1 quart de tour horaire.

Pour un tour, (ligne i, colonne j) devient (ligne j, colonne n-1-i). Quatre tours retrouvent l’image initiale.

LigneAvant rotationAprès rotation
01 2 3 413 9 5 1
15 6 7 814 10 6 2
29 10 11 1215 11 7 3
313 14 15 1616 12 8 4

La transformation globale se vérifie pixel par pixel ; une décomposition doit conserver exactement cette correspondance.

De la compréhension à l’autonomie

À vous de résoudre

Cherchez d’abord par vous-même. Vérifiez les résultats demandés, utilisez les indices si nécessaire, puis comparez votre méthode à la correction.

Exercice 1 · Comprendre#

Identifier les trois rôles

Dans le tri fusion, associez couper la liste, trier les moitiés et entrelacer les résultats aux trois étapes de la méthode.

Indice 1

La division crée les entrées plus petites.

Indice 2

La combinaison reconstruit la sortie globale.

Comprendre la correction

Couper correspond à diviser ; trier chaque moitié correspond à résoudre les sous-problèmes ; entrelacer les résultats correspond à combiner. La récursion réalise les résolutions répétées, tandis que la fusion assure la cohérence du résultat final.

Exercice 2 · Appliquer#

Tourner une petite matrice

Une matrice 2×2 contient les lignes [1,2] puis [3,4]. Donnez sa rotation horaire d’un quart de tour.

Indice 1

La première colonne devient la première ligne en ordre inversé.

Indice 2

Le pixel en bas à gauche arrive en haut à gauche.

Comprendre la correction

La matrice obtenue contient [3,1] puis [4,2]. La règle de coordonnées donne notamment (1,0) vers (0,0) et (0,0) vers (0,1). Conserver [1,2] comme première ligne ne réalise pas une rotation.

Exercice 3 · Analyser#

Corriger une combinaison

On trie deux moitiés et obtient [1,8] et [2,3]. Les concaténer suffit-il à trier l’ensemble ?

Indice 1

Examinez la frontière entre les deux listes.

Indice 2

Il faut choisir progressivement la plus petite tête disponible.

Comprendre la correction

Non, la concaténation donne [1,8,2,3], qui n’est pas triée. La fusion doit produire [1,2,3,8]. La correction des sous-résultats ne dispense pas de justifier l’opération qui les combine.

Exercice 4 · Justifier#

Raisonner sur la mémoire

Une fonction modifie une image sur place mais conserve une pile récursive de profondeur log n. Peut-on annoncer sans précision une mémoire auxiliaire constante ?

Indice 1

Les données temporaires ne sont pas seulement les pixels copiés.

Indice 2

Les contextes d’appels occupent aussi de la mémoire.

Comprendre la correction

Non, si l’on compte la pile, elle ajoute une quantité logarithmique de contextes dans ce modèle. On peut préciser « sans seconde image » ou « échanges en place », puis analyser séparément la pile. Les hypothèses de comptage doivent accompagner l’annonce du coût.

Exercice 5 · Problème de synthèse#

Problème : suivre les coordonnées

Une matrice 4×4 contient 1 à 16 par lignes. Donnez la position de 6 avant et après un quart de tour horaire, puis la première ligne finale. Effectuez mentalement un deuxième quart de tour et donnez le nouveau coin supérieur gauche. Justifiez avec la formule, indices à zéro.

Indice 1

Six est en (1,1).

Indice 2

Appliquez (i,j)→(j,n-1-i) à chaque tour.

Comprendre la correction

Six part de (1,1) et arrive en (1,2). La première ligne devient 13,9,5,1, l’ancienne première colonne lue de bas en haut. Après deux tours, la rotation totale est un demi-tour : le coin supérieur gauche reçoit 16, ancien coin inférieur droit. Chaque application conserve le nombre de pixels et transforme leur position.

Exercice 6 · Problème de synthèse#

Problème : réparer une rotation de quadrants

Une version découpe une image 4×4 en quadrants 2×2 et les déplace correctement, mais ne tourne pas leur contenu. Suivez le quadrant contenant 1,2,5,6 : où va-t-il, quelle doit être sa disposition et quelle erreur permet de distinguer les versions ? Précisez le cas de base d’une version récursive.

Indice 1

Le quadrant supérieur gauche va en haut à droite.

Indice 2

La rotation interne est la même transformation sur une plus petite matrice.

Comprendre la correction

Le quadrant va en haut à droite et doit contenir [5,1] puis [6,2]. La version fautive y placerait [1,2] puis [5,6] ; le coin supérieur droit devrait recevoir 1 mais recevrait 2. Une matrice 1×1 est un cas de base invariant. Déplacer les régions sans résoudre leur rotation interne laisse donc une partie du problème non traitée.

Exercice 7 · Problème de synthèse#

Problème : prouver et compter un maximum

Tracez la décomposition du maximum de [4,9,2,7,5]. Comptez les comparaisons de valeurs, puis expliquez pourquoi la combinaison du maximum gauche et droit suffit. Que faut-il annoncer pour l’entrée vide ? La méthode assure-t-elle automatiquement un coût logarithmique ?

Indice 1

Les singletons ne comparent rien.

Indice 2

Les deux sous-listes couvrent toutes les valeurs sans chevauchement.

Comprendre la correction

Les comparaisons peuvent être 4 contre 9, 7 contre 5, 2 contre 7 puis 9 contre 7 : quatre. Tout candidat est dans une des deux parties, donc le maximum global est le plus grand de leurs maxima. Le vide est exclu par le contrat présenté, car aucun maximum n’y est défini. Le travail reste linéaire, même si le découpage équilibré donne une profondeur logarithmique.

Les erreurs qui méritent un détour

Confondre récursion et diviser pour régner.
La récursion est un mécanisme ; la méthode décrit une décomposition et une combinaison du problème.
Oublier de tourner l’intérieur des quadrants.
Le déplacement global des régions ne transforme pas leurs coordonnées internes.

La fiche à garder

L’essentiel à retenir

  • Diviser, résoudre et combiner sont trois responsabilités distinctes.
  • Les bases et la réduction assurent une résolution finie.
  • Le coût des copies et de la pile doit être compté explicitement.

Le prochain pas

Retrouver le catalogue de Terminale

Ce chapitre s’appuie sur le programme officiel de Terminale (PDF, nouvel onglet). Les explications et exercices sont proposés pour l’apprentissage.