Diviser pour régner 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 »)
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.
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.
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.
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.
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.
Lorsque la séquence à trier est de taille 1, il n'y a plus rien à faire, car le tableau est déjà trié.
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
Si C(n) = C(n / k) + g(n), alors
Recherche dichotomique : avec deux comparaisons, on choisit le tableau sur lequel continuer la recherche.
Si C(n) = aC(n / b) + cn, avec C(1)=constante alors
a représente ici le nombre de sous-problèmes et n/b leur taille.
Tri fusion : 2 sous-problèmes de taille n/2, donc a=b=2, donc C(n) = O(n.log2(n))
Si C(n) = aC(n / k) + f(n) avec a et k deux entiers strictement positifs et f une fonction. Alors
Si