Vous êtes sur la page 1sur 5

Diviser pour régner (informatique)

Trois étapes (diviser, régner, combiner) illustrées avec l'algorithme du tri fusion

En informatique, diviser pour régner (du latin « Divide ut imperes », divide and conquer en anglais) est
une technique algorithmique consistant à :

1. Diviser : découper un problème initial en sous-problèmes ;


2. Régner : résoudre les sous-problèmes (récursivement ou directement s'ils sont assez
petits) ;
3. Combiner : calculer une solution au problème initial à partir des solutions des sous-
problèmes.

Cette technique fournit des algorithmes efficaces pour de nombreux problèmes, comme la recherche d'un
élément dans un tableau trié (recherche dichotomique), le tri (tri fusion, tri rapide), la multiplication de
grands nombres (algorithme de Karatsuba) ou la transformation de Fourier discrète (transformation de
Fourier rapide).
Sommaire
Exemples
Exemples détaillés
Autres exemples
Histoire
Intérêts
Complexité
Parallélisme
Circuits
Limites
Récursivité
Sous-problèmes redondants
Notes et références
Notes
Références
Voir aussi
Articles connexes
Liens externes

Exemples

Exemples détaillés

La table suivante donne des exemples d'algorithmes en donnant les trois étapes (diviser, régner, combiner).

Diviser Régner Combiner


Pour chercher x dans le tableau trié T[1, ..
n],
Recherche
on cherche dans T[1, .. n/2] si x < - -
dichotomique
T[n/2]
on cherche dans T[n/2 +1,..n] sinon.

on trie les deux sous- on calcule une


tableaux T[1, .. n/2] et permutation triée du
on découpe le tableau T[1, .. n] à trier en
T[n/2 +1,..n] tableau initial en
Tri fusion deux sous-tableaux T[1, .. n/2] et T[n/2
(récursivement, ou on fusionnant les deux
+1,..n]
ne fait rien s'ils sont sous-tableaux triés T[1,
de taille 1) .. n/2] et T[n/2 +1,..n].
on choisit un élément du tableau au hasard
qui sera 'pivot' et on permute tous les on trie les deux
Tri rapide éléments de manière à placer à gauche du moitiés de part et -
pivot les éléments qui lui sont inférieurs, et d'autre du pivot.
à droite ceux qui lui sont supérieurs
Autres exemples

Voici d'autres exemples d'algorithmes diviser pour régner :

la transformation de Fourier rapide.


Il existe un algorithme de type diviser pour régner pour la recherche des deux points les
plus rapprochés.
Quickhull pour le calcul de l'enveloppe convexe d'un ensemble de points.

Histoire
La recherche dichotomique est formalisée dans un article de John Mauchly en 1946, mais l'idée d'utiliser
1
une liste triée pour faciliter la recherche remonte à Babylone en -220 . L'algorithme d'Euclide pour calculer
le plus grand commun diviseur de deux nombres peut être vu comme un algorithme diviser pour régner (les
deux nombres diminuent et on se ramène à un problème plus petit). Gauss décrit la transformée de Fourier
2
rapide en 1805 sans en faire l'analyse de complexité. La transformée de Fourier rapide est redécouverte
un siècle plus tard.
3
John von Neumann invente le tri fusion en 1945 . L'algorithme de Karatsuba est inventé par Anatolii A.
4
Karatsuba en 1960 : il multiplie deux nombres de n chiffres en opérations (voir notations de
Landau). Cet algorithme contredit la conjecture d’Andreï Kolmogorov de 1956 qui stipule que
opérations sont nécessaires. Knuth donne une méthode utilisée par les services postaux : les lettres sont
1
triées et séparés en fonction des zones géographiques, puis en sous-zones géographies, etc. Ce tri est le tri
1
radix, décrit pour les machines IBM à cartes (Trieur de cartes IBM (en)) dès 1929 .

Intérêts

Complexité
N1
La faible complexité des algorithmes diviser pour régner est l'un de leurs principaux intérêts . Il existe
plusieurs théorèmes facilitant le calcul des complexités des algorithmes de type diviser pour régner. Le
principal théorème est le Master theorem. Pour des cas plus complexes on peut citer le théorème d'Akra-
Bazzi. La table suivante compare la complexité d'un algorithme naïf et de l'algorithme diviser pour régner
pour quelques problèmes (voir Notations de Landau) :

Complexité avec Complexité avec l'algorithme diviser


l'algorithme naïf pour régner
Recherche dans un tableau trié de
O(n) O(log n)
taille n
O(n log n) avec le tri fusion

O(n²) (voir tri insertion, tri


Tri d'un tableau de n éléments
sélection)
O(n log n) en moyenne avec le tri
rapide

Multiplication de deux nombres avec


O(n²) avec l'algorithme de Karatsuba
n chiffres
Parallélisme
Les algorithmes diviser pour régner sont souvent adaptés pour être exécutés sur des machines avec
plusieurs processeurs.

Circuits

Il existe des circuits pour des entrées de taille fixées pour la transformation de Fourier rapide. Il existe
également des réseaux de tris pour le tri fusion, appelé le tri bitonique.

Limites

Récursivité

Les algorithmes diviser pour régner se prêtent naturellement à une écriture récursive. Mais parfois,
l'exécution d'algorithmes récursifs peut conduire à un dépassement de pile. On préfère donc parfois un
algorithme itératif.

Sous-problèmes redondants

Lorsque l'on applique « diviser pour régner », il n'y a pas de redondance : chaque sous-problème n’est
résolu qu'une seule fois lors des appels récursifs. Par contre, lorsque les sous-problèmes sont redondants,
l'algorithme récursif obtenu à partir de « diviser pour régner » peut avoir une mauvaise complexité. Prenons
l'exemple du calcul du nème terme de la suite de Fibonacci. L'algorithme suivant est en temps exponentiel
en n :

fonction fibonacci(n)
si(n = 0 ou n = 1)
renvoyer 1
sinon
renvoyer fibonacci(n-1) + fibonacci(n-2)

Pour pallier cette limite, on peut mémoriser les valeurs déjà calculées afin d'éviter de résoudre les sous-
problèmes déjà rencontrés. Il s'agit de la mémoïsation (aussi utilisée en programmation dynamique).

Notes et références

Notes
1. L'utilisation du paradigme diviser pour régner n'est pas une garantie absolue d'optimalité :
des algorithmes comme le tri faire-valoir sont plus mauvais que des algorithmes naïfs bien
qu'ils utilisent ce paradigme.

Références
1. (en) Donald E. Knuth, The Art of Computer Programming, vol. 3 : Sorting and Searching,
1998, 2e éd. [détail de l’édition].
2. (en) M. T. Heideman, D. H. Johnson et C. S. Burrus, « Gauss and the history of the fast
Fourier transform », IEEE ASSP Magazine, vol. 1, no 4, 1984, p. 14-21.
ou e t a s o , SS aga e, o , , 98 , p
3. Knuth 1998, p. 159.
4. (ru) Anatolii A. Karatsuba et Yuri P. Ofman, « Умножение многозначных чисел на
автоматах », Doklady Akademii Nauk SSSR, vol. 146, 1962, p. 293–294 (lire en ligne (http
s://www.researchgate.net/publication/248199959_Umnozenie_mnogoznacnyh_cisel_na_avt
omatah_Multiplying_multi-digit_numbers_on_the_machines)) traduit en anglais dans (en)
« Multiplication of Multidigit Numbers on Automata », Physics-Doklady, vol. 7, 1963, p. 595–
596 (présentation en ligne (https://books.google.com/books?id=MrkOAAAAIAAJ)).

Voir aussi

Articles connexes
Arbre de produits
Programmation dynamique

Liens externes
« Évaluation de la complexité pour le tri rapide » (http://imss-www.upmf-grenoble.fr/prevert/
Prog/Tris/triRapideEval.html)
(en) Diviser pour régner : tri, exponentiation, nombres de Fibonacci, multiplication
matricielle, algorithme de Strassen… (http://ocw.mit.edu/courses/electrical-engineering-an
d-computer-science/6-046j-introduction-to-algorithms-sma-5503-fall-2005/video-lectures/le
cture-3-divide-and-conquer-strassen-fibonacci-polynomial-multiplication/) : vidéo d'une
leçon dans le cadre d'un cours d'introduction à l'algorithmique au MIT.

Ce document provient de « https://fr.wikipedia.org/w/index.php?


title=Diviser_pour_régner_(informatique)&oldid=176763333 ».

La dernière modification de cette page a été faite le 19 novembre 2020 à 17:52.

Droit d'auteur : les textes sont disponibles sous licence Creative Commons attribution, partage dans les mêmes
conditions ; d’autres conditions peuvent s’appliquer. Voyez les conditions d’utilisation pour plus de détails, ainsi que
les crédits graphiques. En cas de réutilisation des textes de cette page, voyez comment citer les auteurs et
mentionner la licence.
Wikipedia® est une marque déposée de la Wikimedia Foundation, Inc., organisation de bienfaisance régie par le
paragraphe 501(c)(3) du code fiscal des États-Unis.

Politique de confidentialité
À propos de Wikipédia
Avertissements
Contact
Développeurs
Statistiques
Déclaration sur les témoins (cookies)

Vous aimerez peut-être aussi