Aller au contenu

Diviser pour régner

Définition

Une fonction résoudre(problème) qui applique la méthode « Diviser pour régner » se déroule suivant les étapes :

  • Cas de base : Si le problème est trivial, le résoudre immédiatement et renvoyer sa solution.

  • Diviser : Sinon, diviser le problème en plusieurs sous-problèmes indépendants.

  • Régner : Résoudre ces sous-problèmes récursivement (c'est-à-dire appeler résoudre sur ces sous-problèmes).

  • Combiner : Combiner les différentes solutions des sous-problèmes pour obtenir la solution au problème initial et la renvoyer. C'est l'étape la plus difficile à élaborer.

Pour appliquer la stratégie « Diviser pour régner » à un problème, on raisonne principalement sur l'étape Combiner : on suppose que les sous-problèmes ont été résolus, et on réfléchit à la manière de les réunir pour reconstruire la solution du problème initial.

Exemple : Tri Fusion

  • Le tri fusion applique la stratégie « Diviser pour régner ». Ce tri consiste à :

    • Cas de base : Si la liste ne possède qu'un élément ou moins, elle est déjà triée, la renvoyer.
    • Diviser : Sinon, diviser en deux la liste à trier.
    • Régner : Trier récursivement les deux sous-listes.
    • Combiner : Fusionner les deux sous-listes triées en une liste triée et la renvoyer.

  • Une implémentation possible en Python :

    def fusionner(A, B):
        """ Fusionne deux listes triées en une seule liste triée. """
        F = []
        a, b = 0, 0  # indices pour parcourir A et B
        while a < len(A) and b < len(B):
            if A[a] < B[b]:
                F.append(A[a])
                a += 1
            else:
                F.append(B[b])
                b += 1
        return F + A[a:] + B[b:]  # ajoute les éléments restants
    
    def tri_fusion(tab):
        if len(tab) <= 1:  # cas de base
            return tab
        m = len(tab) // 2
        G, D = tab[:m], tab[m:]              # Étape 1. Diviser
        G, D = tri_fusion(G), tri_fusion(D)  # Étape 2. Régner 
        return fusionner(G, D)               # Étape 3. Combiner
    
  • Cet algorithme de tri a une complexité en temps de \(O(n \log n)\) (quasi-linéaire).