Pour résoudre un problème sur un ensemble de données, le principe "diviser pour régner" consiste :
à diviser les données en deux (ou plus) parties.
résoudre le problème sur une ou plus des parties (de façon récursive).
utiliser les solutions sur les différentes parties pour trouver la (les) solution pour le problème.
Exemples
La dichotomie
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
0
1
2
3
5
8
12
15
20
25
30
33
38
40
42
48
50
55
60
65
70
72
80
90
100
101
105
107
108
110
112
118
122
125
130
132
140
145
150
152
160
162
170
175
177
180
182
188
190
200
La méthode de la dichotomie pour trouver une valeur dans un tableau étudié en première (lien) est un exemple important d'algorithme "diviser pour régner". Voici une implémentation récursive (et fonctionnelle car les "variables" ne sont pas modifiées) :
Le tri fusion
Présentation
Le tri fusion est un autre classique de la méthode diviser pour régner, il est en O( nln(n) ) qui est la limite théorique des méthodes de tri par comparaison. Pour mémoire les tri par insertion et sélection sont en O( n² ) soit moins bien au bout d'une certaine taille.
Le tri par fusion a l'inconvénient de consommer beaucoup de mémoire (il faut doubler la liste) (mais on peut l'éviter voir l'exercice).
Implémentation
Il existe de nombreuses manière d'implémenter le tri fusion, plus ou moins consommatrice en mémoire, avec plus ou moins de copies, avec ou sans récurrence. Une implémentation que je vous conseille car elle est simple (et finalement performante) du tri fusion est la suivante :
Comparaison
Voci deux autres façons d'implémenter le tri_fusion, la première n'utilise pas de mémoires en plus (ou plutôt une mémoire indépendante de la taille) et la deuxième se fait en place. Les deux méthodes ne sont pas récursives mais on verra qu'elles ne sont pas forcément meilleures.
Comparer le temps des méthodes en utilisant le code suivant :