Diviser pour régner (informatique)
Diviser pour régner (divide and conquer) est une technique algorithmique consistant à diviser un problème de grande taille en plusieurs sous-problèmes analogues. L'étape de subdivision est appliquée récursivement. Son nom est inspiré du proverbe « Diviser pour régner » (en latin : « Divide ut imperes »)
Sommaire |
Présentation [modifier]
Les algorithmes récursifs utilisent naturellement cette technique : ils s'appellent eux-mêmes une ou plusieurs fois sur une partition du problème initial et combinent les solutions pour retrouver une solution au problème initial.
Deux stratégies [modifier]
Les algorithmes Diviser pour régner appliquent deux stratégies principales. La première est la récursivité sur les données : on sépare les données en deux parties quelconques (ou plus), puis on résout les sous-problèmes (par la même fonction), pour enfin combiner les résultats. La seconde stratégie, la récursivité sur le résultat, consiste elle à effectuer un pré-traitement pour bien découper les données, puis à résoudre les sous-problèmes, pour que les sous-résultats se combinent d'eux-mêmes à la fin.
Illustration des stratégies [modifier]
Tri fusion [modifier]
Un exemple de récursivité sur les données est le Tri fusion. La donnée initiale est alors une séquence d'entiers non triée. Le résultat est une séquence triée des mêmes entiers.
- on divise la séquence de n éléments à trier en deux sous-séquences de n/2 éléments,
- on trie les deux sous-séquences à l'aide du tri fusion (appel récursif),
- on combine, en les fusionnant, les deux sous-séquences triées pour produire la séquence triée.
La récursivité prend fin quand pour un appel à l'algorithme, la séquence à trier est de taille 1. Dans ce cas il n'y a rien à faire car par définition une telle séquence est déjà triée.
Tri rapide [modifier]
Un exemple de récursivité sur le résultat est le Tri rapide. La donnée initiale et le résultat sont les mêmes que pour le tri fusion.
- on choisit un élément du tableau au hasard qui sera 'pivot' ;
- on permute tous les éléments de manière à placer à gauche du pivot les éléments qui lui sont inférieurs, et à droite ceux qui lui sont supérieurs ;
- on appelle (récursivement) le tri rapide sur les deux moitiés de part et d'autre du pivot.
Lorsque la séquence à trier est de taille 1, il n'y a plus rien à faire, car le tableau est déjà trié.
Complexité [modifier]
La faible complexité des algorithmes Diviser pour régner est l'un de leurs principaux intérêts.
Notations : n taille du problème, C(n) coût en nombre d'opérations. Pour les notations de comparaison asymptotiques, consulter Notations de Landau
Cas où la résolution d'un seul sous-problème suffit [modifier]
Théorème [modifier]
Si
, alors 
Exemple [modifier]
- Recherche dichotomique
- avec deux comparaisons, on choisit le tableau sur lequel continuer la recherche.

Cas des sous-problèmes de même taille [modifier]
Théorème 1 [modifier]
Si
, avec C(1)=constante alors
- si
, 
- si
, 
- si
, 
a représente ici le nombre de sous-problèmes et n/b leur taille.
Exemple 1 [modifier]
Tri fusion : 2 sous-problèmes de taille n/2, donc a=b=2, donc 
Théorème 2 [modifier]
Si
avec a et k deux entiers strictement positifs et f une fonction. Alors
- si
avec
, alors 
- si
alors 
- si
avec
et si
tel que
pour n suffisamment grand, alors 
- si a=1 et
avec
alors 
Exemple 2 [modifier]
Si
, alors 
Exemples [modifier]
- la Recherche dichotomique
- le Tri fusion
- le Tri rapide
- le Parcours de Graham
Liens externes [modifier]
- Evaluation de la complexité pour le tri rapide
- (en) Diviser pour régner: tri, exponentiation, nombres de Fibonacci, multiplication matricielle, algorithme de Strassen, …: vidéo d'une leçon dans le cadre d'un cours d'introduction à l'algorithmique du MIT.

, 
, 
, 
avec
, alors 
alors 
avec
tel que
pour n suffisamment grand, alors 
avec
alors 