Beruflich Dokumente
Kultur Dokumente
Amin Shokrollahi
Semestre dAutomne 2010-2011
Contents
0 Introduction 1
0.1 Quest ce quun algorithme? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
0.2 Exemples dalgorithmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
0.2.1 Somme dentiers positifs . . . . . . . . . . . . . . . . . . . . . . . . . . 1
0.2.2 Probl` eme de Localisation . . . . . . . . . . . . . . . . . . . . . . . . . . 3
0.2.3 Monnaie Optimale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
0.3 Th eorie des ensembles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
0.3.1 Rappels de notations de logique . . . . . . . . . . . . . . . . . . . . . . 6
0.3.2 Rappels de notations de th eorie des ensembles . . . . . . . . . . . . . . 7
0.3.3 Ensembles des parties, Ensembles des mots . . . . . . . . . . . . . . . . 9
0.3.4 Ensembles standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
0.4 Relations et Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
0.5 Sp ecication dun Probl` eme . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
0.6 Du Probl` eme ` a lalgorithme et son impl ementation . . . . . . . . . . . . . . . . 14
1 Induction 15
1.1 Ce que cest et ` a quoi ca sert . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.2 Techniques dinduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.2.1 Induction simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.2.2 Induction descendante . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.2.3 Induction Forte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.3 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.3.1 La formule dEuler pour les arbres . . . . . . . . . . . . . . . . . . . . . 22
1.3.2 Ensemble Ind ependant de lHypercube . . . . . . . . . . . . . . . . . . 24
1.3.3 Le Lemme de Schwartz-Zippel . . . . . . . . . . . . . . . . . . . . . . . 28
2 Analyse dAlgorithmes 30
2.1 Pourquoi analyser des Algorithmes? . . . . . . . . . . . . . . . . . . . . . . . . 30
2.2 Exemple: Multiplication de polyn omes . . . . . . . . . . . . . . . . . . . . . . . 30
2.3 Exemple: Multiplication de matrices . . . . . . . . . . . . . . . . . . . . . . . . 32
2.4 La notation O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.5 Lalgorithme de Karatsuba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.6 Lalgorithme de Strassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
i
Algorithmique - Semestre dAutomne 2010/2011
2.7 Relations de R ecurrence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.8 Remarques Finales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3 Structures de donn ees el ementaires 46
3.1 Ensembles dynamiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.2 Structures des donn ees dynamiques el ementaires . . . . . . . . . . . . . . . . . 47
3.2.1 Stack (ou pile) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.2.2 Files dattente (Queues) . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.2.3 Listes li ees (Linked lists) . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.3 Graphes et Arbres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3.3.1 Repr esenter des graphes . . . . . . . . . . . . . . . . . . . . . . . . . . 57
3.3.2 Arbres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.3.3 Repr esentation darbres . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.3.4 Parcourir des arbres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
3.3.5 R esum e de la section 3.3 . . . . . . . . . . . . . . . . . . . . . . . . . . 68
3.4 Structures de donn ees pour des algorithmes de recherche . . . . . . . . . . . . . 69
3.4.1 Arbres binaires de recherche . . . . . . . . . . . . . . . . . . . . . . . . 69
3.4.2 Arbres bicolores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
3.4.3 Arbres AVL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
3.5 Le Hachage (Hashing) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
4 Construction dalgorithmes par induction 90
4.1 La m ethode de Horner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
4.2 Elimination de Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
4.3 Les algorithmes diviser-pour-r egner . . . . . . . . . . . . . . . . . . . . . . . . 95
4.3.1 Le paradigme DPR g en eral . . . . . . . . . . . . . . . . . . . . . . . . . 95
4.3.2 Lalgorithme de Karatsuba . . . . . . . . . . . . . . . . . . . . . . . . . 96
4.3.3 Recherche binaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
4.3.4 MergeSort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
4.3.5 La paire la plus proche . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
4.3.6 Carrelage de formes L . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.4 Programmation dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
4.4.1 Multiplication de plusieurs matrices . . . . . . . . . . . . . . . . . . . . 104
4.4.2 Le probl` eme LCS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
4.4.3 Le plus-court-chemin-pour-toute-paire (Floyd-Warshall) . . . . . . . . . 112
4.4.4 Le Probl` eme 0/1-Knapsack (Sac-` a-dos 0/1) . . . . . . . . . . . . . . . . 115
4.5 Un algorithme plus rapide pour le probl` eme LCS . . . . . . . . . . . . . . . . . 119
5 Algorithmes gloutons 126
5.1 Exemple: horaires de salles de cours . . . . . . . . . . . . . . . . . . . . . . . . 126
5.2
El ements dune strat egie gloutonne . . . . . . . . . . . . . . . . . . . . . . . . . 127
5.3 Glouton compar e ` a la programmation dynamique: Le probl` eme du sac ` a dos . . . 128
5.4 Codes de Huffman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
ii
Algorithmique - Semestre dAutomne 2010/2011
5.4.1 Codes represent es par des arbres binaires . . . . . . . . . . . . . . . . . 132
5.4.2 Le codage de Huffman . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
5.4.3 Impl ementation de lalgorithme de codage de Huffman . . . . . . . . . . 133
5.4.4 Optimalit e de lalgorithme de codage de Huffman . . . . . . . . . . . . . 137
6 Algorithmes de tri 139
6.1 Algorithmes el ementaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
6.1.1 Selection Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
6.1.2 Insertion Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
6.1.3 Shell Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
6.1.4 Bubble Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
6.2 Quicksort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
6.2.1 Variantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
6.3 Heap Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
6.3.1 Sifting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
6.3.2 Cr eation dun heap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
6.3.3 Lalgorithme HEAPSORT . . . . . . . . . . . . . . . . . . . . . . . . . . 159
6.3.4 Priority Queues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
7 Algorithmes de graphes 163
7.1 Parcourir des graphes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
7.2 Lalgorithme Depth First Search (DFS) . . . . . . . . . . . . . . . . . . . . . . . 165
7.3 Lalgorithme Breadth First Search (BFS) . . . . . . . . . . . . . . . . . . . . . . 165
7.4 Tri Topologique (Topological Sorting) . . . . . . . . . . . . . . . . . . . . . . . 166
7.5 Chemins les plus courts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
7.6 Lalgorithme de Moore-Bellman-Ford . . . . . . . . . . . . . . . . . . . . . . . 175
7.7 Flux de r eseau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
7.8 Application: Maximum Bipartite Matching . . . . . . . . . . . . . . . . . . . . 187
7.9 Arbres couvrants minimaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
7.9.1 Lalgorithme de Kruskal . . . . . . . . . . . . . . . . . . . . . . . . . . 191
7.9.2 La structure Union Find . . . . . . . . . . . . . . . . . . . . . . . . . 193
7.9.3 Version nale de lalgorithme de Kruskal . . . . . . . . . . . . . . . . . 195
7.9.4 Lalgorithme de Prim . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
7.10 D etecter des cycles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
7.10.1 D etecter des cycles n egatifs . . . . . . . . . . . . . . . . . . . . . . . . 199
7.10.2 Lalgorithme de Karp pour trouver des cycles avec poids moyen minimal 200
8 Les probl` emes NP-complets 203
8.1 La classe P . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
8.2 R eduction polynomiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
8.3 La classe NP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
8.4 NP-Compl etude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
8.5 Probl` emes de Satisabilit e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
iii
Algorithmique - Semestre dAutomne 2010/2011
8.6 Quelques probl` emes de graphe NP-Complets . . . . . . . . . . . . . . . . . . . 209
8.7 Quelques autres problemes de graphe
NP-complets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
8.8 Probl` emes de th eorie des ensembles . . . . . . . . . . . . . . . . . . . . . . . . 212
1
0
Introduction
0.1 QUEST CE QUUN ALGORITHME?
Informellement, on peut d enir un algorithme comme suit:
Un algorithme est une suite d etapes dont le but est de r esoudre un probl` eme
ou daccomplir une t ache.
Les algorithmes sont utilis es partout. Par exemple, une recette pour votre plat pr ef er e peut
etre un algorithme. Nous rafnerons le concept dun algorithme en etudiant des exemples.
0.2 EXEMPLES DALGORITHMES
0.2.1 Somme dentiers positifs
Probl` eme: Calculer la somme des n premiers entiers positifs
Input: n N := 1, 2, 3, . . .
Output: S(n) := 1 + 2 + 3 +. . . +n =
n
k=1
k
Par exemple, si n = 10, lalgorithme retourne 55.
Une approche nave serait de d enir une variable s initialis ee ` a z ero, puis dy ajouter un par
un les nombres de 1 ` a n. Le code correspondant s ecrit:
1
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 1 M ethode nave de sommation
Input: Un entier positif n N.
Output: La somme s :=
n
k=1
k.
s 0
for i = 1 to n do
s s +i
end for
return s
Une meilleure m ethode a et e d ecouverte par le math ematicien allemand Carl Friedrich Gau
` a l age de 5 ans. Son instituteur, pour le punir, lui demanda de calculer la somme des entiers
de 1 ` a 100. Le jeune Gau annonca le r esultat tr` es peu de temps apr` es, car il avait r ealis e quon
pouvait ajouter les termes deux par deux en partant des c ot es oppos es de la liste, et que les termes
interm ediaires ainsi obtenus etaient tous identiques: 1+100 = 101, 2+99 = 101, . . . , 50+51 =
101. On obtient ainsi 50 termes, le r esultat est donc 50 101 = 5050.
Cette m ethode peut etre g en eralis ee ` a tout n pair. On a:
n
2
termes
_
_
1 + n = n + 1
2 + n 1 = n + 1
3 + n 2 = n + 1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
n
2
1 +
n
2
+ 2 = n + 1
n
2
+
n
2
+ 1 = n + 1
Donc,
S(n) =
n(n + 1)
2
.
Limpl ementation de la m ethode de Gau est triviale; Il suft d ecrire la formule ci-dessus:
Algorithme 2 M ethode de sommation de Gau
Input: Un entier positif n N.
Output: La somme s :=
n
k=1
k.
return
n(n+1)
2
Nous avons d eclar e que la m ethode de Gau etait meilleure que notre m ethode originale.
Mais que veut dire meilleure? Nous pouvons donner un sens pr ecis a ce terme: nous voulions
dire quen utilisant la m ethode de Gau, la somme pouvait etre calcul ee de facon plus efcace.
Ceci peut etre montr e formellement en comparant le nombre dop erations arithm etiques dont a
besoin chaque algorithme pour parvenir au r esultat.
La premi` ere m ethode utilise n additions du compteur s. (Nous ignorons les additions de i).
La deuxi` eme m ethode utilise 3 op erations arithm etiques (une addition, une multiplication et une
division). La m ethode de Gau est donc plus performante pour n > 3.
2
Algorithmique - Semestre dAutomne 2010/2011
Il nous manque toujours:
Une d emonstration que la formule de Gau est juste. (R ecurrence!)
Une notion de performance et des m ethodes pour analyser nos algorithmes.
Une sp ecication formelle du probl` eme.
0.2.2 Probl`eme de Localisation
Probl` eme: Probl` eme de localisation
Input: Des entiers a
0
< a
1
< < a
n1
, et x Z
Output: Trouver un indice i tel que a
i
= x, si un tel i existe
Exemple: Supposons que les entiers soient 1, 3, 8, 11, 39, 41; Si x = 39, loutput de lalgorithme
serait 4, alors que si x = 26 il ny aurait pas de r eponse.
Voici une premi` ere solution au probl` eme:
Algorithme 3 Recherche lin eaire
i 0
while a
i
,= x and i < n do
i i + 1
end while
if i = n then
return ERROR
else
return i
end if
Quelle est lefcacit e de cette solution? Comme avant, nous comptons le nombre dop erations
arithm etiques que doit r ealiser lalgorithme. Nous ignorons de nouveau les op erations qui ne
concernent que le compteur i. Les op erations restantes sont donc les comparaisons a
i
,= x. Cet
algorithme effectue n comparaisons dans le pire des cas (ici le pire des cas se produit quand x
nest pas dans la liste ou quand x est le dernier el ement, x = a
n1
).
Peut-on faire mieux? Oui, car on peut utiliser le fait que les a
i
sont ordonn es. Cest ce que
fait lalgorithme suivant, appel e Recherche Binaire (Binary Search):
3
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 4 Recherche binaire
i 0, j n
while j i > 1 do
_
ji
2
_
+i
if x < a
then
j
else
i
end if
end while
if x ,= a
i
then
return ERROR
else
return i
end if
Supposons que k soit la solution recherch ee, i.e., a
k
= x. Par convention, nous posons
a
n
= . Au d ebut de chaque it eration de la boucle while, on a
a
i
a
k
< a
j
. (1)
En effet, avant la premi` ere it eration, (1) est clairement vraie. Dans toutes les it erations qui
suivent, nous modions i et j de telle facon ` a ce quelle reste vraie. Puisque les a sont ordonn es,
on d eduit de (1) que
i k < j.
A chaque it eration lintervalle [i, j[ est coup e en deux, puisque est choisi tel quil soit au milieu
de i et j. On nira donc forc ement par trouver k.
La recherche binaire utilise au plus log
2
(n) comparaisons (pourquoi ?), et cet algorithme
est donc beaucoup plus efcace que le premier algorithme. (Remarque: log
2
(n) est beaucoup
plus petit que n quand n est grand. Par exemple, si n = 100, log
2
(n) vaut environ 6.64, et si
n = 1024, log
2
(n) vaut 10).
Il nous manque toujours:
Outils de construction de lalgorithme
Outils danalyse de lalgorithme
Structures de donn ees (Data structures) pour r ealiser lalgorithme
4
Algorithmique - Semestre dAutomne 2010/2011
0.2.3 Monnaie Optimale
Probl` eme: Monnaie optimale
Input: Une collection C = 1, 2, 5, 10, 20, 50, 100 de valeurs de pi` eces
de monnaie, et un entier x
Output: Une suite nie de pi` eces, contenant aussi peu de pi` eces que pos-
sible, dont la somme des valeurs vaut x
Exemple: Si x = 325, alors
c
0
= c
1
= c
2
= 100, c
3
= 20, c
4
= 5.
Nous pouvons donc obtenir le r esultat demand e en utilisant 5 pi` eces.
Voici lalgorithme le plus simple qui vienne ` a lesprit, appel e Algorithme Glouton (Greedy
Algorithm):
Algorithme 5 Algorithme Glouton
v 0 et t 0
while v < x do
Trouver le plus grand c C tel que c +v x
c
t
c
v v +c
t t + 1
end while
return (c
0
, c
1
, . . . , c
t1
)
Cet algorithme retourne-t-il une suite de pi` eces dont la somme des valeurs vaut x? Si oui, le
nombre de pi` eces est-il minimal?
Il nous manque toujours:
Une preuve que lalgorithme est juste
Sp ecication du probl` eme
Analyse
Solution optimale
Structures de donn ees (Data structures)
5
Algorithmique - Semestre dAutomne 2010/2011
Principes de construction (greedy algorithms)
Le premier pas vers ces objectifs est davoir une mani` ere rigoureuse de d ecrire ce que lalgorithme
doit accomplir, cest-` a-dire une sp ecication formelle du probl` eme. Ceci n ecessite quelques
concepts math ematiques (ensembles, relations, fonctions, . . . ) que nous d ecrirons dans les
prochaines sections.
0.3 TH
AF
A := x X [ A F : x A.
La diff erence de A et B est lensemble
A B := x A [ x / B.
La diff erence symm etrique de A et B est lensemble
AB = (A B) (B A).
Le produit cart esien A B est lensemble de tous les couples (a, b), o` u a A et b B.
(Deux el ements (a, b), (a
, b
et b = b
). Pour
des ensembles A
1
, . . . , A
n
, le produit cart esien A
1
A
n
est lensemble de n-tuples
(a
1
, . . . , a
n
) o` u a
1
A
1
, . . . , a
n
A
n
.
Le n-` eme produit cart esien de A est lensemble
A
n
:= A A
. .
n fois
.
Remarque: Les op erateurs et , respectivement et , ne sont pas seulement supercielle-
ment similaires. En fait, la d enition de fait appel ` a et celle de ` a .
8
Algorithmique - Semestre dAutomne 2010/2011
D enition. A tout ensemble A nous pouvons associer une quantit e appel ee sa cardinalit e (ou
simplement taille). Nous d enotons [A[ la cardinalit e de A, d enie comme etant
[A[ :=
_
n si A contient exactement n el ements,
si le nombre d el ements de A nest pas ni.
Pour dire que A est ni, nous ecrivons souvent [A[ < . Il nexiste quun seul ensemble
de cardinalit e nulle, qui est lensemble vide , caract eris e par le fait quaucun el ement nest
contenu dans .
D enition. Les ensembles A et B sont disjoints si
A B = ,
i.e., si A et B nont aucun el ement en commun.
Soit X un ensemble et F une famille de sous-ensembles disjoints de X. La r eunion disjointe
des membres de F est not ee
_
AF
A.
Il ne sagit de rien autre que de lunion usuelle. Mais parfois, on parle de r eunion disjointe et
on ecrit au lieu se pour souligner le fait que les ensembles sont disjoints. (Par exemple, de
mani` ere g en erale, on a
_
AF
A
AF
[A[,
ce qui nest pas toujours vrai pour lunion usuelle.)
0.3.3 Ensembles des parties, Ensembles des mots
D enition. Lensemble des parties dun ensemble X est d eni comme etant lensemble de tous
les sous-ensembles de X. Lensemble des parties de X est not e Pot(X) ou encore 2
X
.
Lensemble des parties nies de X est d eni comme etant lensemble de tous les sous-
ensembles nis de X. Il est not e Pot
(X).
On voit que si X est ni, alors on a Pot(X) = Pot
(X).
Remarque: L ecriture 2
X
est due au fait que si X est ni, on a [2
X
[ = 2
|X|
. La notation Pot(X)
vient de lallemand: lensemble des parties sappelle die Potenzmenge en allemand.
9
Algorithmique - Semestre dAutomne 2010/2011
Exemple: Si A = Ding, 3, Brr, alors
Pot(A) = , Ding, 3, Brr, Ding, 3, Ding, Brr, 3, Brr, Ding, 3, Brr.
D enition. Soit A un ensemble. Lensemble des mots sur A est lensemble
A
:=
_
n0
A
n
.
Lensemble des mots non-vides sur A est lensemble
A
+
:=
_
n1
A
n
.
On a donc A
= A
+
.
Exemple: Si A = a, b, c, d, . . . , z, alors A
, o` u R
:= (m, n) [ m, n Z, m n.
D enition. La relation inverse de R est d enie par
R
1
:= (b, a) B A [ (a, b) R.
Exemple: La relation inverse de (R
= (a, b) [ a, b R
0
, b
2
= a
a pour chaque a R
0
exactement une image b R
0
. R
) implique que a = a
.
On remarque quune d enition equivalente de linjectivit e de F est a ,= a
= F(a) ,=
F(a
).
Exemple: La fonction F = (a, b) [ a, b R, b = a
3
est injective. En effet, si a
3
= b
3
alors on
a a = b. Par contre, G = (a, b) [ a, b R, b = a
2
nest pas injective car G(1) = 1 = G(1).
Si A = a
1
, . . . , a
m
est ni, alors il peut etre pratique dexprimer F : A B sous la forme
dun vecteur. On ecrit
(F(a
1
), . . . , F(a
m
)).
12
Algorithmique - Semestre dAutomne 2010/2011
0.5 SP
m =
n
k=1
k
_
I O.
Exemple: Le probl` eme de Monnaie Optimale a la sp ecication suivante:
I = Pot
(N) N
O = N
+
R =
_
((a
1
, . . . , a
n
; x), (c
1
, . . . , c
m
)) I O
i : c
i
a
1
, . . . , a
n
m
i=1
c
i
= x
(d
1
, . . . , d
m
) a
1
, . . . , a
n
+
:
m
i=1
d
i
= x = m
m
_
Rappelons que Pot
(N), et dun nombre naturel x N pour lequel nous voulons obtenir la monnaie optimale.
Loutput est une suite (c
1
, . . . , c
m
) A
m
de valeurs de pi` eces dont la somme vaut x, et telle
que m est minimal parmi toutes les suites qui ont cette propri et e.
Une sp ecication exacte dun probl` eme est d ej` a un pas majeur vers la construction et lanalyse
dun algorithme pour ce probl` eme. En pratique, une sp ecication exacte dun probl` eme est sou-
vent plus difcile ` a trouver quelle ne le parat.
13
Algorithmique - Semestre dAutomne 2010/2011
0.6 DU PROBL
`
EME
`
A LALGORITHME ET SON IMPL
EMEN-
TATION
Les etapes typiques dans la construction dalgorithmes et dans leur impl ementation pratique sont
les suivantes:
1. Sp ecication formelle du probl` eme. Souvent, le probl` eme nous est donn e en prose
(francais, anglais, allemand, ...) et la t ache est de trouver une sp ecication exacte. Quel
est lensemble des inputs possibles, quel est lensemble des outputs possibles, et quelle est
la d ependance relationnelle entre les deux?
2. S eparation du probl` eme en morceaux plus petits et plus g erables. Souvent le probl` eme
est trop grand pour etre attaqu e dun seul coup. Il doit etre s epar e en sous-probl` emes plus
petits, qui doivent etre eux-m emes sp eci es. De plus, un m echanisme doit etre trouv e
pour recoller les solutions des sous-probl` emes an dobtenir une solution du probl` eme
original.
3. Construction dalgorithmes. Pour chaque sous-probl` eme, un algorithme doit etre con-
struit pour le r esoudre. Souvent en pratique lune des nombreuses techniques de construc-
tion dalgorithmes peut etre utilis ee ` a cette n. Cependant, dans certains cas, de nouveaux
algorithmes doivent etre constitu es. La construction doit etre motiv ee par des contraintes
defcacit e, et donc des m ethodes danalyse dalgorithmes doivent etre utilis ees. De plus,
tous les algorithmes doivent etre v eri es et prouv es.
4. Construction de structures de donn ees. Les structures de donn ees sont le lien entre
les algorithmes th eoriques et leur impl ementation pratique. Elles sont cruciales pour la
performance dun algorithme dans limpl ementation.
5. Impl ementation. Au bout de la route on trouve limpl ementation. Celle-ci se classe dans
le domaine du g enie logiciel, qui ne nous concernera pas dans ce cours.
14
1
Induction
1.1 CE QUE CEST ET
`
A QUOI CA SERT
Linduction math ematique est une m ethode pour prouver des afrmations concernant des ensem-
bles d enombrables. Dans la plupart des cas, cet ensemble sera lensemble des nombres naturels
N.
Soit A(n) une afrmation pour lentier n.
Exemple: Si A(n) d eclare que n
2
2
n
, alors A(3) dit par exemple que 9 8, ce qui
est vrai, donc A(3) est vraie. Dautre part, on peut trivialement v erier que A(5) nest pas
vraie. Dautres exemples dafrmations A(n) sont n est pair, ou n est un produit de nombres
premiers.
Si A(n) est vraie pour tout n N, alors linduction math ematique (aussi appel ee r ecurrence)
est souvent une facon el egante de le prouver.
1.2 TECHNIQUES DINDUCTION
1.2.1 Induction simple
Th eor` eme 1.1 Une afrmation A(n) est vraie pour tout n N si et seulement si les deux
conditions suivantes sont vraies:
(1) A(1)
(2) Pour tout n 1: A(n) = A(n + 1).
D enition. La technique dinduction simple consiste ` a montrer que A(n) est vraie pour tout
n N en utilisant le th eor` eme pr ec edent. Le point (1) sappelle la base dinduction et le point
(2) le pas dinduction. Dans les preuves, nous marquerons les etapes correspondantes par [Base]
et [Pas] respectivement.
15
Algorithmique - Semestre dAutomne 2010/2011
Pour effectuer le pas dinduction, nous supposons que A(n) est vraie et montrons alors que
A(n + 1) est aussi vraie. Lhypoth` ese A(n) sappelle alors lhypoth` ese dinduction.
Preuve du th eor` eme 1.1: La partie seulement si est claire. Maintenant, si (1) et (2) sont les
deux vraies, alors pour tout n N, on a
A(1),
A(1) = A(2), donc, A(2) est vraie,
A(2) = A(3), donc, A(3) est vraie,
.
.
.
.
.
.
.
.
.
A(n 1) = A(n), donc, A(n) est vraie.
n
k=1
k. Montrer que S(n) =
1
2
n(n + 1).
Soit A(n) lassertion S(n) =
1
2
n(n +1). Nous allons montrer pas r ecurrence que A(n) est
vraie pour tout n N.
[Base] S(1) = 1, donc A(1) est vraie.
[Pas] Supposons que A(n) est vraie pour un certain n, cest ` a dire supposons quon a S(n) =
1
2
n(n + 1). Nous voulons montrer que A(n + 1) est vraie:
S(n + 1) = S(n) + (n + 1)
A(n)
=
1
2
n(n + 1) + (n + 1)
=
1
2
(n + 1)(n + 2).
on a donc A(n) = A(n + 1), et donc par induction, la formule de Gau est vraie pour tout
n N.
La base dinduction est g en eralement assez facile ` a etablir; le calcul trivial dans lexemple
ci-dessus est relativement typique.
16
Algorithmique - Semestre dAutomne 2010/2011
Remarquons aussi comment le pas dinduction a et e prouv e: nous ecrivons dabord S(n+1)
en fonction de S(n) et n, et utilisons ensuite lhypoth` ese dinduction S(n). Lendroit o` u est
utilis ee lhypoth` ese dinduction est indiqu e par la notation
A(n)
= .
Le proc ed e par r ecurrence est souvent utilis e pour montrer des assertions concernant le com-
portement de suites. Nous arrivons parfois ` a deviner une formule ferm ee sans disposer dune
preuve directe de celle-ci. Dans de tels cas, il est parfois possible de prouver la formule par
r ecurrence. Lexemple suivant illustre cette technique.
Informellement, une formule ferm ee pour une suite (u
0
, u
1
, . . .) est une formule qui nous
donne u
n
en fonction de n sans utiliser de r ecurrence sur n ni de termes ` a indices qui d ependent
de n (comme
n
i=0
ou
n
i=0
).
Par exemple u
n
= 2
n
et u
n
= n + log n sont des formules ferm ees, alors que u
n
=
n
i=1
i
2
ou u
n
= u
n1
+u
n2
ne sont pas des formules ferm ees.
Exemple: Trouver une formule ferm ee pour la suite B(n) =
n
k=0
_
n
k
_
.
Rappel: Le coefcient binomial
_
n
k
_
est d eni comme suit:
_
n
k
_
=
n!
(n k)!k!
.
Nous commencons par deviner une formule ferm ee de B(n). Pour ce faire, nous regardons ce
qui se passe quand n est petit:
1 B(0) = 1
1 1 B(1) = 2
1 2 1 B(2) = 4
1 3 3 1 B(3) = 8
1 4 6 4 1 B(4) = 16
1 5 10 10 5 1 B(5) = 32
Nous devinons donc que B(n) = 2
n
. Il faut le prouver, et pour ce faire, nous utilisons linduction.
Dans la preuve, nous aurons besoin de lidentit e suivante:
_
n + 1
k
_
=
_
n
k 1
_
+
_
n
k
_
.
Afrmation: Soit A(n) lafrmation
n
k=0
_
n
k
_
= 2
n
.
Nous aimerions montrer que A(n) est vraie pour tout n 1.
17
Algorithmique - Semestre dAutomne 2010/2011
[Base] n = 1:
1
k=0
_
n
k
_
= 1 + 1 = 2 = 2
1
.
[Pas]
_
n+1
0
_
=
_
n
0
_
+ +
_
n+1
1
_
=
_
n
0
_
+
_
n
1
_
+ +
_
n+1
2
_
=
_
n
1
_
+
_
n
2
_
+ +
.
.
.
.
.
.
+ +
_
n+1
n
_
=
_
n
n1
_
+
_
n
n
_
+ +
_
n+1
n+1
_
=
_
n
n
_
B(n + 1) = 2 B(n)
Preuve en langage math ematique:
B(n + 1) =
n+1
k=0
_
n + 1
k
_
=
_
n + 1
0
_
. .
=1=(
n
n
)
+
n
k=1
_
n + 1
k
_
+
_
n + 1
n + 1
_
. .
=1=(
n
0
)
=
_
n
n
_
+
n
k=1
__
n
k 1
_
+
_
n
k
__
+
_
n
0
_
=
_
n
n
_
+
n1
k=0
_
n
k
_
+
n
k=1
_
n
k
_
+
_
n
0
_
=
n
k=0
_
n
k
_
. .
=B(n)
+
n
k=0
_
n
k
_
. .
=B(n)
= 2 B(n)
A(n)
= 2
n+1
.
18
Algorithmique - Semestre dAutomne 2010/2011
1.2.2 Induction descendante
Une autre variante dinduction est linduction descendante, d ecrite dans le th eor` eme 1.2. Nous
lutiliserons plus tard pour prouver lin egalit e entre moyenne arithm etique et moyenne g eom etrique
(arithmetic-geometric-mean, AGM).
Th eor` eme 1.2 Une afrmation A(n) est vraie pour tout n N si et seulement si
1. A(n) est vraie pour une innit e de n, et
2. On a A(n) = A(n 1) pour tout n 2.
Intuitivement, ce theor` eme est vrai par le raisonnement suivant: Fixons un n pour lequel nous
aimerions etablir A(n). Choisissons ensuite un u n tel que A(u) soit vraie (ce qui est toujours
possible, car nous savons que A est vraie sur un ensemble inni, par (1)). Nous it erons ensuite
en utilisant (2): A(u) = A(u1), A(u1) = A(u2), . . . , A(n+1) = A(n). Nous
prouvons maintenant ce th eor` eme formellement:
Preuve. La partie seulement si est claire. Nous regardons donc la partie si. Supposons que
les points (1) et (2) soient vrais, et montrons que A(n) est vraie pour tout n N.
Ecrivons
U = u
1
, u
2
, . . . (avec u
1
< u
2
< ) lensemble inni sur lequel A est vraie. Nous allons
montrer les deux afrmations suivantes:
(a) Pour tout u U et tout 0 k < u, A(u k) est vraie.
(b) Pour tout n N, il existe u U et k N
0
tel que n = u k.
Ces deux afrmations r eunies impliquent que A(n) est vraie pour tout n. Nous utilisons linduction
simple pour montrer (a) et (b).
Preuve de (a). On xe u U et on proc` ede par induction sur k.
[Base] k = 0. A(u k) = A(u), ce qui est vrai.
[Pas] A(u k)
(2)
= A(u (k + 1)).
Preuve de (b)
[Base] n = 1: Posons u = u
1
, k = u
1
1:
n = 1 = u k = u
1
(u
1
1).
[Pas] Hypoth` ese dinduction: n = u
m
k pour un m 1 et un 0 k < u
m
.
Alors
n + 1 = u
m+1
. .
U
(u
m+1
u
m
1 +k)
. .
0 et <u
m+1
.
19
Algorithmique - Semestre dAutomne 2010/2011
x
1
+ +x
n
n
. .
moy. arithm etique
Preuve. (Due ` a Cauchy, utilisant linduction descendante)
Nous d emontrons dabord que A(2
k
) est vraie pour tout k 1, ce qui montre que A(n) est
v eri ee pour une innit e de n. Ensuite, nous prouverons que si A(n + 1) est vraie, alors A(n)
lest aussi.
Fait 1: A(2
k
) est vraie pour tout k 1
Preuve: On proc` ede par induction sur k.
[Base] k = 1,
A(2)
x
1
x
2
x
1
+x
2
2
4x
1
x
2
x
2
1
+ 2x
1
x
2
+x
2
2
0 (x
1
x
2
)
2
.
La derni` ere ligne est clairement vraie, donc comme toutes les in egalites ci-dessus sont equivalentes,
on en d eduit que A(2) doit etre vraie.
[Pas] Soit n = 2
k
. Supposons que A(n) est vraie. Nous devons montrer qualors A(2
k+1
) est
vraie, i.e., que A(2n) est vraie:
20
Algorithmique - Semestre dAutomne 2010/2011
(x
1
x
2n
)
1
2n
=
_
(x
1
x
n
)
1
n
(x
n+1
x
2n
)
1
n
A(2)
(x
1
x
n
)
1
n
+ (x
n+1
x
2n
)
1
n
2
A(n)
x
1
+ +x
n
n
+
x
n+1
+ +x
2n
n
2
=
x
1
+ +x
2n
2n
.
Donc par induction, A(2
k
) est vraie pour tout k 1.
Fait 2: A(n + 1) = A(n)
Preuve: Soit x
1
, . . . x
n
R
>0
donn e. Posons
z :=
x
1
+. . . +x
n
n
. (1.1)
Alors z R
>0
, et:
(x
1
x
n
z)
1
n+1
A(n+1)
x
1
+ +x
n
+z
n + 1
(1.1)
=
n z +z
n + 1
= z.
x
1
x
n
z z
n+1
(x
1
x
n
)
1/n
z =
x
1
+ +x
n
n
.
Le fait que A(n) est vraie pour tout n N suit des faits 1 et 2 par induction descendante
(th eor` eme 1.2).
1.2.3 Induction Forte
Rappelons que pour linduction simple, le pas dinduction consistait ` a montrer que
A(n) = A(n + 1).
Nous verrons maintenant quen fait, linduction se fait toujours si lon utilise lhypoth` ese dinduction
plus forte A(1) A(n) pour montrer A(n + 1). Cette variante dinduction sappelle
linduction forte.
21
Algorithmique - Semestre dAutomne 2010/2011
Nous illustrerons lutilisation de linduction forte dans le paragraphe 1.3.1 en montrant la
formule dEuler pour les arbres.
Th eor` eme 1.4 Lafrmation A(n) est vraie pour tout n N si et seulement si
(1) A(1) est vraie,
(2) pour tout n N, A(1) A(n) = A(n + 1).
La preuve est tr` es similaire ` a celle du th eor` eme 1.1. Supposons que (1) et (2) sont les deux
vraies, alors pour nimporte quel n N on a
A(1) par hypoth` ese.
A(1) = A(2) Donc, A(2) est vraie, et ainsi aussi A(1) A(2).
A(1) A(2) = A(3) Donc, A(3) est vraie, et ainsi aussi A(1) A(2) A(3).
.
.
.
.
.
.
A(1) A(n 1) = A(n)
Passons maintenant aux exemples.
1.3 EXEMPLES
1.3.1 La formule dEuler pour les arbres
Nous commencons par introduire quelques notions de base de th eorie des graphes.
D enition. Un graphe est un ensemble ni V de sommets (vertices) muni dune relation E
V V , appel ee lensemble dar etes (edges).
Nous repr esentons les el ements de V par des nuds, et les ar etes par des segments orient e.
On a donc un segment orient e entre a et b si et seulement si (a, b) E. Dans ce cas nous dirons
que a est reli e (joined) ` a b.
D enition. Le graphe est non-orient e (undirected) si E est symm etrique.
Dans le cas dun graphe non-orient e, un sommet a est li e ` a un sommet b si et seulement
si b est li e ` a a. Il est donc commun de repr esenter un tel graph avec un unique segment (sans
direction) liant a et b, sans les doubles ` eches liant a ` a b et b ` a a.
Exemple:
22
Algorithmique - Semestre dAutomne 2010/2011
Un graphe non-orient e
D enition. Une chane (path) dans un graphe est une suite de sommets distincts qui sont reli es
par des ar etes. Un cycle dans le graphe est une chane ferm ee.
Une chane Un cycle
D enition. Un graphe est dit acyclique (acyclic) sil ne continent pas de cycles. On dit que le
graphe est connexe (connected) si tout paire de sommets est reli ee par une chane.
Un graphe acyclique et connexe
D enition. Un graphe acyclique et connexe sappelle un arbre (tree).
23
Algorithmique - Semestre dAutomne 2010/2011
Th eor` eme 1.5 (La formule dEuler pour les arbres) Si T est un arbre de n sommets, alors T
poss` ede n 1 ar etes.
Preuve. Nous procedons par induction forte sur le nombre de sommets n. Soit A(n) lafrmation
si T est un arbre sur n sommets, alors T a n 1 ar etes.
[Base] n = 1: Si larbre T na quun seul sommet alors il ne peut avoir aucune ar ete. Donc A(1)
est vraie.
[Pas] Supposons A(k) vraie pour tout 1 k n. Soit T un arbre sur n+1 sommets. Choisissons
une ar ete e dans T et enlevons-la. Comme T est connexe et acyclique, enlever e transforme T en
deux sous-arbres de n
1
et n
2
sommets respectivement, avec les n
i
< n + 1 et n
1
+n
2
= n + 1.
Lhypoth` ese dinduction permet maintenant de conclure que ces sous-arbres ont respective-
ment n
1
1 et n
2
1 ar etes. Et le nombre total dar etes de T est donc
1
er
sous-arbre
..
n
1
1 +
2
` eme
sous-arbre
..
n
2
1 +
Ar ete enlev ee e
..
1 = n.
Donc A(n + 1) est vraie. Le r esultat suit par induction forte.
1.3.2 Ensemble Independant de lHypercube
Soit G un graphe non-orient e densemble de sommets V et densemble dar etes E V V . Un
ensemble ind ependant de G est un ensemble de sommets tel quaucune paire de sommets nest
reli ee.
Un ensemble ind ependant
Le n-hypercube est le graphe densemble de sommets 0, 1
n
dans lequel deux sommets sont
reli es si et seulement si les vecteurs correspondants diff` erent en exactement une coordonn ee. (p.e.
(0, 0, 1) est reli e ` a (0, 0, 0) mais pas ` a (1, 1, 1)).
Exemple: Soit n = 2. Lensemble de sommets est V = 0, 1
2
= (0, 0), (0, 1), (1, 0), (1, 1).
Lensemble dar etes est E = [(0, 0), (0, 1)], [(0, 1), (1, 1)], [(1, 1), (1, 0)], [(1, 0), (0, 0)]. Si
24
Algorithmique - Semestre dAutomne 2010/2011
nous dessinons ces sommets dans un espace euclidien de dimension deux, nous voyons que
le 2-hypercube est un carr e.
Similairement, le 3-hypercube est le cube de dimension trois, et le n-hypercube nous dit ` a
quoi ressemblerait un cube si nous vivions dans un espace de dimension n.
Une repr esentation du 4-hypercube
Donc, un ensemble ind ependant dans lhypercube est un sous-ensemble S 0, 1
n
pour
lequel deux vecteur distincts x, x
, 0) diff` erent en au moins deux coordonn ees par hypoth` ese dinduction,
comme x, x
, 1).
Finalement, pour completer le pas dinduction nous devons montrer que le compl ement de
U est aussi un ensemble ind ependant. Puisque U = (x, 0) [ x V (y, 1) [ y W, son
compl ement va consister en
les elements de la forme (x, 0) o` u x 0, 1
n
et x / V , cest ` a dire (x, 0) o` u x W
puisque W est le compl ement de V dans 0, 1
n
.
les elements de la forme (y, 0) o` u y 0, 1
n
et x / W, cest ` a dire (y, 0) o` u y V
puisque V est le compl ement de W dans 0, 1
n
.
Le compl ement de U dans 0, 1
n
est donc egal ` a U(x, 0) [ x W (y, 1) [ y V .
On peut donc utiliser la m eme m ethode quau dessus pour montrer que U est ind ependant.
i
1
,i
2
,...,in
a
i
1
,...,in
x
i
1
1
x
in
n
.
Le degr e de f(x
1
, . . . , x
n
) est d eni comme suit:
deg(f) := max(i
1
+ +i
n
[ a
i
1
,...,in
,= 0).
Par exemple, le degr e de 2x
3
1
x
4
2
est 7, et le degr e de 2x
3
1
x
4
2
+x
1
x
2
x
6
3
est 8.
Th eor` eme 1.6 (Le Lemme de Schwartz-Zippel) Soit f(x
1
, . . . , x
n
) un polyn ome en n vari-
ables sur R, et soit D R un sous-ensemble ni. Soit d := deg(f). D enissons encore
Z = (a
1
, . . . , a
n
) D
n
[ f(a
1
, . . . , a
n
) = 0.
Alors,
[Z[ d[D[
n1
Ce th eor` eme est utilis e pour lanalyse de nombreux algorithmes alg ebriques al eatoires.
Preuve. Nous le prouvons par induction sur le nombre de variables n.
[Base] n = 1.
Soit f(x
1
) un polyn ome de degr e d sur R. f est un polyn ome en une variable (comme n = 1).
Nous savons par le th eor` eme fondamental de laritm etique que f(x
1
) a au plus d racines dans R.
Donc pour nimporte quel sous-ensemble D R, le nombre de racines a D peut etre au plus
d.
[Pas] Nous supposons que lassertion est vraie pour n et nous la montrons pour n + 1. Soit
f(x
1
, . . . , x
n+1
) un polyn ome en n + 1 variables. Nous avons
f(x
1
, . . . , x
n+1
) =
k
=0
x
n+1
Q
(x
1
, . . . , x
n
)
pour un k 0, et Q
k
(x
1
, . . . , x
n
) ,= 0.
Remarquons quon a deg(Q
k
(x
1
, . . . , x
n
)) d k.
1
er
cas: k = 0, i.e., f ne d epend pas de x
n+1
. f peut etre donc consid er e comme polyn ome en n
variables (auquel sapplique lhypoth` ese dinduction). Alors
[Z[ [(a
1
, . . . , a
n
) D
n
[ f(a
1
, . . . , a
n
, 0) = 0[ [D[
A(n)
d [D[
n1
[D[
= d [D[
n
.
28
Algorithmique - Semestre dAutomne 2010/2011
2
` eme
cas: k > 0.
[Z[
M
1
..
[(a
1
, . . . , a
n
) D
n
[ Q
k
(a
1
, . . . , a
n
) = 0[ [D[ +
[(a
1
, . . . , a
n+1
) D
n+1
[ Q
k
(a
1
, . . . , a
n
) ,= 0
f(a
1
, . . . , a
n+1
) = 0[
A(1)
M
1
[D[ +k ([D[
n
M
1
)
M
1
[D[ +k [D[
n
A(n)
(d k) [D[
n1
[D[ +k [D[
n
= d [D[
n
.
29
2
Analyse dAlgorithmes
2.1 POURQUOI ANALYSER DES ALGORITHMES?
Lanalyse dalgorithmes est essentielle dans la comparaison de diff erents algorithmes pour des
probl` emes computationnels; elle nous fournit un outil pour d eterminer le meilleur algorithme
pour nos besoins.
Dans lanalyse dun algorithme nous essayons de calculer les ressources dont il aurait besoin.
De telles ressources peuvent etre, par exemple, lutilisation CPU, m emoire, temps dacc` es, etc.
Comme le nombre de facteurs qui interviennent est souvent tr` es grand, il est en g en eral tr` es
difcile de calculer exactement les ressources utilis ees. On se contente souvent de les estimer.
Dans ce chapitre, nous apprendrons des techniques pour calculer ou estimer la quantit e de
ressources utilis ees par un algorithme.
2.2 EXEMPLE: MULTIPLICATION DE POLYN
OMES
La multiplication de polyn omes est lun des probl` emes calculatoires principaux de lalg` ebre
computationelle (computational algebra) et du traitement du signal.
On rappelle quun polyn ome sur R de degr e d est une expression de la forme
p(x) = a
0
+a
1
x +a
2
x
2
+. . . +a
d
x
d
avec a
0
, . . . , a
d
R et a
d
,= 0.
Les valeurs a
0
, a
1
, . . . , a
d
sappellent les coefcients du polyn ome. Un polyn ome peut etre
d eni enti` erement par ses coefcients. Si p
1
(x) et p
2
(x) sont des polyn omes dont les degr es sont
respectivement d
1
et d
2
, alors leur produit est un polyn ome de degr e d
1
+d
2
.
30
Algorithmique - Semestre dAutomne 2010/2011
Probl` eme: Multiplication de polyn omes
Input: (a
0
, a
1
, . . . , a
n1
), (b
0
, b
1
, . . . , b
n1
) R
n
Output: (c
0
, c
1
, . . . , c
2n2
) R
2n2
tel que
2n2
i=0
c
i
x
i
=
n1
k=0
a
k
x
k
n1
j=0
b
j
x
j
.
Les valeurs a
0
, a
1
, . . . , a
n1
et b
0
, b
1
, . . . , b
n1
sont les coefcients des polyn omes dentr ee,
et les valeurs c
0
, c
1
, . . . , c
2n2
sont les coefcients de leur produit. Remarquons quen multipliant
deux polyn omes de degr e n 1, on obtient un polyn ome de degr e 2n 2.
Si nous voulons multiplier deux polyn omes, nous pouvons simplement multiplier chaque
terme du premier polyn ome par chaque terme du deuxi` eme polyn ome et combiner les termes de
m eme exposant.
Nous voulons compter le nombre dop erations arithm etiques (cest-` a-dire dadditions et de
multiplications de nombres r eels) dont a besoin lalgorithme naf, qui effectue le calcul
c
i
=
min(i,n1)
j=max(0,i+1n)
a
j
b
ij
pour tout i = 0, 1, . . . , 2n 2.
Comptons le nombre dadditions et de multiplications ` a chaque etape.
c
0
= a
0
b
0
1 + 0
c
1
= a
0
b
1
+a
1
b
0
2 + 1
.
.
.
.
.
.
.
.
.
c
n2
= a
0
b
n2
+ +a
n2
b
0
n 1 +n 2
c
n1
= a
0
b
n1
+ +a
n1
b
0
n +n 1
c
n
= a
1
b
n1
+ +a
n1
b
1
n 1 +n 2
.
.
.
.
.
.
.
.
.
c
2n3
= a
n1
b
n2
+a
n2
b
n1
2 + 1
c
2n2
= a
n1
b
n1
1 + 0
Lalgorithme utilise
n + 2
n1
k=1
k = 2
n(n 1)
2
+n
= n
2
31
Algorithmique - Semestre dAutomne 2010/2011
multiplications, et
n 1 + 2
n2
k=0
k = 2
(n 1)(n 2)
2
+n 1
= (n 1)
2
additions.
En additionnant ces nombres, nous obtenons le nombre total dop erations arithm etiques, qui
vaut n
2
+ (n 1)
2
.
Nous disons que lalgorithme utilise de lordre de n
2
op erations.
La notation dordre supprime les constantes multiplicatives et donne une borne sup erieure au
nombre dop erations. Nous etudierons cette notation plus en d etail dans ce chapitre.
2.3 EXEMPLE: MULTIPLICATION DE MATRICES
Probl` eme: Multiplication de matrices
Input: A = (a
ij
) R
nn
, B = (b
ij
) R
nn
Output: C = (c
ij
) R
nn
, o` u C = A B
La multiplication de matrices est un des probl` emes principaux en alg` ebre lin eaire. On peut
montrer que de nombreux probl` emes calculatoires en alg` ebre lin eaire (r esoudre des syst` emes
d equations, inversion de matrices, calcul de d eterminants, etc.) se r eduisent ` a la multiplication
de matrices.
Si A = (a
ij
) et B = (b
ij
) sont les deux des matrices n n, alors le produit matriciel
C := A B est une matrice n n, avec les composantes
c
ij
=
n
k=1
a
ik
b
kj
pour tout 1 i, j n.
Nous aimerions analyser lalgorithme naf en comptant le nombre dadditions et de multipli-
32
Algorithmique - Semestre dAutomne 2010/2011
cations (de nombres r eels) ` a chaque pas.
c
11
= a
11
b
11
+a
12
b
21
+ +a
1n
b
n1
c
12
= a
11
b
12
+a
12
b
22
+ +a
1n
b
n2
.
.
.
.
.
.
c
ij
= a
i1
b
1j
+a
i2
b
2j
+ +a
in
b
nj
.
.
.
.
.
.
c
nn
= a
n1
b
1n
+a
n2
b
2n
+ a
nn
b
nn
Lalgorithme utilise
n
2
n
multiplications, et
n
2
(n 1)
additions.
Au total, cet algorithme effectue donc n
3
+ n
2
(n 1) op erations. Nous disons que
lalgorithme utilise de lordre de n
3
op erations arithm etiques.
La notation dordre supprime les constantes et donne la croissance approximative. Lid ee est
de ne consid erer que les termes principaux (dans ce cas n
3
) et de supprimer le reste, qui devient
insigniant quand n est grand.
n 1000 log
2
(n) 200
n 50n 10n
2
2n
3 1
32
2
n
2 1000 282.84 100 40 16 1/8
4 2000 400 200 160 128 1/2
8 3000 565.69 400 640 1024 8
16 4000 800 800 2560 8192 2048
32 5000 1131.37 1600 10240 65536 134217728
64 6000 1600 3200 40960 524288 Grand
128 7000 2262.74 6400 163840 4194304 GRAND
256 8000 3200 12800 655360 33554432 enorme
512 9000 4500.25 25600 2621440 268435456
ENORME
1024 10000 6400 51200 10485760 GRAND
2.4 LA NOTATION O
Nous aimerions mesurer des fonctions de mani` ere approximative, selon leur croissance. Ceci
nous permettra davoir une premi` ere impression du temps de parcours dun algorithme. Nous
obtiendrons ainsi une caract erisation simple de son efcacit e, permettant de comparer diff erents
types dalgorithmes.
Dans ce qui suit, toutes les fonctions sont de N vers R
>0
.
33
Algorithmique - Semestre dAutomne 2010/2011
D enition. Pour deux fonctions f et g nous dirons que f = O(g) si
c > 0 n
0
> 0 n n
0
: f(n) cg(n).
Alors f crot au plus aussi vite que g. O se prononce grand O.
Exemple: Toute fonction est de lordre delle-m eme, on a par exemple n = O(n) et de mani` ere
g en erale f(n) = O(f(n)) pour toute fonction f(n). En effet, on peut prendre c = 1 et n
0
= 1
dans la d enition ci-dessus puisque n 1 on a f(n) 1 f(n).
Exemple: Les constantes multiplicatives ne jouent pas de r ole: 3n = O(10n), et de mani` ere
g en erale, pour toute fonction f(n) et pour tout a, b R
>0
on a:
a f(n) = O(b f(n))
On peut obtenir ce r esultat en prenant c =
a
b
et n
0
= 1 dans la d enition ci-dessus, puisque
n 1 on a a f(n)
a
b
b f(n).
Exemple: On a n
2
= O(n
3
). En effet, en prenant c = 1 et n
0
= 1 ci-dessus, on voit que n 1
on a n
2
1 n
3
.
Exemple: On a 1000n = O(n
2
). En effet, en prenant c = 1000 et n
0
= 1 ci-dessus, on voit que
n 1 on a 1000n 1000 n
2
.
Exemple: On a n + 100 = O(n
2
). On prend c = 1 et n
0
= 11 ci-dessus, on voit que n 11
on a n + 100 1 n
2
.
Exemple: On a:
n = O(1000n)
1000n = O(n)
log n = O(log n)
log n = O((log n)
2
)
n
2
= O(n
3
)
an
2
= O(bn
3
) pour tous a, b R
>0
n = O(100n
2
14n + 2)
34
Algorithmique - Semestre dAutomne 2010/2011
1000 n
1000
= O(2
n
)
100 log(n) = O(n)
log(n) + 3 +n
2
= O(n
2
)
1 = O(n)
2003 = O(1)
1
n
= O(1)
Si p(n) est un polyn ome de degr e d, alors p(n) = O(n
d
)
Si p(n) est un polyn ome, et a > 1 alors p(n) = O(a
n
)
D enition. Pour des fonctions f et g nous ecrivons f = o(g) si
lim
n
f(n)
g(n)
= 0.
Alors, f crot plus lentement que g. On peut aussi dire que f devient insigniante par rapport
` a g lorsque n tend vers linni. o so prononce petit o.
Exemple: n = o(n
2
), en effet on a
lim
n
n
n
2
= lim
n
1
n
= 0.
Remarquons que si f = o(g), alors on a aussi f = O(g). n = o(n
2
) dans lexemple ci-dessus,
donc on a aussi n = O(n
2
).
D enition. Pour des fonctions f et g nous disons que
f = (g) si g = O(f), et
f = (g) si f = O(g) et f = (g).
Donc, si f = (g) alors f et g ont le m eme ordre de magnitude.
Exemple: On a:
n
7
= (n
6
)
35
Algorithmique - Semestre dAutomne 2010/2011
100n
3
= (10n
3
)
1 +n + 10n
2
= o(n
3
)
1 +n + 10n
2
,= o(n
2
)
1 +n + 10n
2
= O(n
2
)
1 +n + 10n
2
= (n
2
)
n
1001
= o(1.001
n
)
Si p(n) est un polyn ome de degr e < d alors p(n) = o(n
d
).
Si p(n) est un polyn ome de degr e d alors p(n) ,= o(n
d
).
Si p(n) est un polyn ome de degr e d alors p(n) = (n
d
).
Dans ce langage nous disons que la multiplication nave de polyn omes est un algorithme
O(n
2
), ou encore que cest un algorithme avec un temps de parcours O(n
2
). La multiplication
nave de matrices est un algorithme O(n
3
), ou un algorithme avec temps de parcours O(n
3
).
Peut-on faire mieux?
Oui. Nous allons introduire puis analyser des algorithmes plus rapides pour ces deux probl` emes.
2.5 LALGORITHME DE KARATSUBA
Supposons que nous aimerions multiplier f(x) =
2n1
i=0
a
i
x
i
et g(x) =
2n1
i=0
b
i
x
i
aussi rapi-
dement que possible. Nous pouvons ecrire f(x) et g(x) comme suit.
f(x) =
_
a
0
+a
1
x + +a
n1
x
n1
_
. .
=:f
0
(x)
+x
n
_
a
n
+a
n+1
x + +a
2n1
x
n1
_
. .
=:f
1
(x)
g(x) =
_
b
0
+b
1
x + +b
n1
x
n1
_
. .
=:g
0
(x)
+x
n
_
b
n
+b
n+1
x + +b
2n1
x
n1
_
. .
=:g
1
(x)
.
Remarquons que les polyn omes f
0
(x) et f
1
(x) respectivement g
0
(x) et g
1
(x) nont que la moiti e
de taille (degr e) de f(x) respectivement g(x). Lid ee sous-jacente ` a lalgorithme de Karatsuba
est dop erer sur les polyn omes plus petits f
i
(x) et g
i
(x), o` u les calculs peuvent etre effectu es
plus rapidement.
Consid erons lalgorithme ci-dessous pour calculer f(x) g(x).
Remarquons que les op erations dans les pas 1, 2 et 5 sont elles-m emes des multiplications de
polyn omes, mais de polyn omes de taille n au lieu de 2n.
36
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 6 LAlgorithme de Karatsuba
1: h
0
(x) f
0
(x) g
0
(x).
2: h
2
(x) f
1
(x) g
1
(x).
3: u(x) f
0
(x) +f
1
(x)
4: v(x) g
0
(x) +g
1
(x).
5: A(x) u(x) v(x).
6: h
1
(x) A(x) h
0
(x) h
2
(x).
7: h(x) h
0
(x) +x
n
h
1
(x) +x
2n
h
2
(x).
8: return h(x)
Nous montrons dabord que le polyn ome h(x) calcul e est en effet le produit f(x) g(x). Pour
le voir, on calcule la valeur de h(x). Pour am eliorer la lisibilit e, nous ecrivons h au lieu de h(x),
etc.:
h = x
2n
h
2
+x
n
h
1
+h
0
= x
2n
f
1
g
1
+x
n
(uv h
0
h
2
) +f
0
g
0
= x
2n
f
1
g
1
+x
n
[(f
0
+f
1
)(g
0
+g
1
) f
0
g
0
f
1
g
1
]
. .
(f
0
g
1
+f
1
g
0
)
+f
0
g
0
= x
2n
f
1
g
1
+x
n
(f
0
g
1
+f
1
g
0
) +f
0
g
0
= (x
n
f
1
+f
0
)(x
n
g
1
+g
0
)
= f g.
Ce que nous aimerions savoir maintenant est, bien s ur, sil y a un avantage ` a utiliser lAlgorithme
6 au lieu de lalgorithme naf introduit dans la section 2.2. Analysons donc son temps de par-
cours.
Pour multiplier deux polyn omes de degr e < 2n, nous avons besoin de 3 multiplications de
polyn omes de degr e < n, 2 additions de polyn omes de degr e < n et 2 additions de polyn omes
de degr e < 2n 1 et de 2 additions de co ut 2(n 1) ( etape 7).
h (x)
h (x)
h (x)
0
1
2
x
n
x
2n
0 n 2n2
2n 3n2
4n2
n1
n1
Commencons par supposer que nous utilisons lalgorithme naf de multiplication de polyn omes
dans les etapes 1, 2 et 5 de lalgorithme de Karatsuba. Puisque, en utilisant lalgorithme naf,
37
Algorithmique - Semestre dAutomne 2010/2011
nous avons besoin de n
2
+ (n 1)
2
op erations arithm etiques pour multiplier des polyn omes de
degr e < n, le nombre total dop erations pour multiplier deux polyn omes de degr e < 2n utilisant
la m ethode de Karatsuba est:
3 (n
2
+ (n 1)
2
) + 2 n + 2 (2n 1) + 2 (n 1) = 6n
2
+ 2n 1,
tandis que lalgorithme naf n ecessite
8n
2
4n + 1
op erations, ce qui est plus grand par un facteur dapproximativement 4/3 si n est grand. Ainsi,
de cette mani` ere nous obtenons un algorithme qui est plus rapide que lalgorithme naf, mais ceci
seulement par un facteur constant: il sagit toujours dun algorithme O(n
2
).
Heureusement, ce nest pas la n de lhistoire. Nous pouvons utiliser lalgorithme de Karat-
suba lui-m eme dans les pas 1, 2 et 5 pour obtenir un algorithme qui est encore plus performant.
De tels algorithmes, qui font appel ` a eux-m emes pour accomplir leur t ache, sappellent des algo-
rithmes r ecursifs. Nous etudierons les algorithmes r ecursifs encore plus en d etail.
Analysons maintenant le comportement du vrai algorithme de Karatsuba, i.e., de la variante
r ecursive. Nous d enissons les fonctions M(), A() et T() comme suit:
M(n): le nombre de multiplications pour multiplier deux polyn omes de degr e < n.
A(n): le nombre dadditions / soustractions pour multiplier deux polyn omes de degr e < n.
T(n): le nombre total dop erations arithm etiques pour multiplier deux polyn omes de degr e
< n, dans ce cas egal ` a A(n) +M(n).
Nous avons clairement M(1) = 1, A(1) = 0, et nous pouvons calculer les valeurs de
M(), A() et T() pour les puissances de deux en utilisant les r ecurrences suivantes:
M(2n) = 3M(n)
A(2n) = 3A(n) + 2n + 2(2n 1) + 2(n 1)
= 3A(n) + 8n 4,
T(2n) = 3T(n) + 8n 4
Par exemple, la formule pour A(2n) ci-dessus se trouve comme suit: Le terme 3A(n) vient
des multiplications r ecursives dans les etapes 1, 2 et 5 de lalgorithme 6. Le terme 2n vient
des multiplications de polyn omes de degr e < n dans les etapes 3 et 4. Le terme 2(2n 1)
vient des deux soustractions de polyn omes de degr e < 2n 1 dans l etape 6. Finalement, le
terme 2(n 1) vient des additions dans l etape 7. (Dans ce dernier cas, il suft de compter les
additions des parties qui se recouvrent; c.f. lillustration ` a la page pr ec edente.)
Comment les fonctions M(n), A(n) et A(n) +M(n) croissent-elles en fonction de n? Nous
apprendrons des techniques pour r epondre ` a ce type de question plus tard dans ce chapitre.
Nous pouvons, par contre, d ej` a faire une comparaison num erique pour le cas o` u n est une
puissance de deux. Nous obtenons
38
Algorithmique - Semestre dAutomne 2010/2011
Karatsuba Naive
n Mult. Add. Total Mult. Add. Total
2 3 4 7 4 1 5
4 9 24 33 16 9 25
8 27 100 127 64 49 113
16 81 360 441 256 225 481
32 243 1204 1447 1024 961 1985
64 729 3864 4593 4096 3969 8065
128 2187 12100 14287 16384 16129 32513
Tandis que pour n petit, la multiplication nave semble etre meilleure, nous voyons que pour
n 16, lalgorithme de Karatsuba est plus rapide. (En r ealit e, la multiplication est souvent plus
co uteuse que laddition, et lalgorithme de Karatsuba pourrait donc etre meilleure m eme pour
des n plus petits).
Nous montrerons plus tard que lalgorithme de Karatsuba est O(n
log
2
(3)
), ce qui est beaucoup
mieux que lalgorithme naf O(n
2
), comme log
2
(3) 1.585.
Lutilisation de structures de donn ees ad equates rend aussi possible de r ealiser ce gain sur
des machines r eelles et dans les applications pratiques. Par exemple, quelques impl ementations
de puces cryptographiques utilisent cet algorithme. Et m eme si de nos jours, des algorithmes
meilleurs sont connus pour la multiplication de polyn omes, lalgorithme de Karatsuba sutilise
souvent dans les logiciels informatiques (par exemple, PARI/GP), parce que cest un algorithme
qui donne une bonne performance en restant relativement facile ` a impl ementer.
2.6 LALGORITHME DE STRASSEN
Dans la section pr ec edente, nous avons appris que la multiplication de polyn omes peut etre ef-
fectu ee plus rapidement en d ecomposant les polyn omes en des parties plus petites et en effectu-
ant ensuite les calculs sur ces polyn omes plus petits. Cette strat egie de division de probl` emes en
sous-probl` emes plus petits peut aussi etre appliqu ee dans dautres contextes; ce type dalgorithme
sappelle un algorithme diviser-pour-r egner (divide-and-conquer).
Dans cette section, nous pr esentons un algorithme diviser-pour-r egner pour la multiplication
de matrices.
Supposons que nous aimerions calculer le produit de deux matrices A et B,
_
C
11
C
12
C
21
C
22
_
=
_
A
11
A
12
A
21
A
22
_
_
B
11
B
12
B
21
B
22
_
39
Algorithmique - Semestre dAutomne 2010/2011
o` u C
ij
, A
ij
, B
ij
sont des matrices n n.
La d ecomposition en blocs ci-dessus sugg` ere que si nous connaissions un algorithme perfor-
mant pour la multiplication de matrices 2 2, ceci nous permettrait de construire un algorithme
g en eral (i.e., pour n arbitraire) performant de multiplication de matrices en utilisant la technique
diviser-pour-r egner.
Strassen a invent e un tel algorithme pour la multiplication de matrices 2 2 en 1969. Nous
pr esentons ici la variante am elior e de Winograd de lalgorithme de Strassen qui n ecessite encore
moins dadditions. Les pas sont:
(1) Calculer
S
1
= A
21
+A
22
T
1
= B
12
B
11
S
2
= S
1
A
11
T
2
= B
22
T
1
S
3
= A
11
A
21
T
3
= B
22
B
12
S
4
= A
12
S
2
T
4
= B
21
T
2
(2) Calculer
P
1
= A
11
B
11
P
5
= S
3
T
3
P
2
= A
12
B
21
P
6
= S
4
B
22
P
3
= S
1
T
1
P
7
= A
22
T
4
P
4
= S
2
T
2
et
U
1
= P
1
+P
2
U
5
= U
3
+P
3
U
2
= P
1
+P
4
U
6
= U
2
+P
3
U
3
= U
2
+P
5
U
7
= U
6
+P
6
U
4
= U
3
+P
7
.
(3) Ensuite,
C
11
= U
1
, C
12
= U
7
,
C
21
= U
4
, C
22
= U
5
.
Pour multiplier deux matrices 2n 2n, lalgorithme naf utilise 8 multiplications et 4 ad-
ditions de matrices n n. Lalgorithme de Strassen r eduit ceci ` a 7 multiplications et 15 addi-
tions/soustractions de matrices n n. (Remarquons que le nombre dadditions de matrices nest
pas vraiment tr` es important, puisquelle se fait el ement par el ement, donc en O(n
2
) tandis que la
multiplication nave est O(n
3
)).
Pour analyser le temps de parcours de lalgorithme de Strassen, nous introduisons de nouveau
les fonctions M(), A(), T():
M(n): Nombre de multiplications (de r eels) pour multiplier des matrices n n.
A(n): Nombre dadditions (de r eels) pour multiplier des matrices n n.
T(n): Le nombre total dop erations arithm etiques pour la multiplication de matrices nn.
40
Algorithmique - Semestre dAutomne 2010/2011
Pour les puissances de deux, ces fonctions sont donn ees par les formules r ecursives
M(2n) = 7M(n)
A(2n) = 7A(n) + 15n
2
T(2n) = 7T(n) + 15n
2
,
et les conditions initiales M(1) = 1, A(1) = 0, T(1) = 1.
Dans la section 2.7 nous apprendrons comment d eduire de ces formules que lalgorithme
de Strassen est O(n
log
2
(7)
). Lalgorithme de Strassen est donc beaucoup plus performant que
lalgorithme naf O(n
3
), puisque log
2
(7) 2.81. Le bon choix de structures de donn ees aide ` a
r ealiser cet avantage en pratique.
2.7 RELATIONS DE R
ECURRENCE
Th eor` eme 2.1 Soit T : N R une fonction telle quil existe b, c, d R
>0
, et a N avec
(a) T(n) T(n + 1) pour tout n 1 (i.e. T() crot monotonement), et
(b) T(an) cT(n) +dn
b
.
On a alors
(1) Si a
b
< c, alors T(n) = O
_
n
log
a
(c)
_
.
(2) Si a
b
= c, alors T(n) = O
_
n
log
a
(c)
log
a
(n)
_
.
(3) Si a
b
> c, alors T(n) = O
_
n
b
_
.
Avant de prouver ce th eor` eme, nous lutilisons pour obtenir les temps de parcours estim es des
algorithmes de Karatsuba et Strassen.
Corollaire 1 Lalgorithme de Karatsuba utilise O(n
log
2
(3)
) op erations.
Preuve. La fonction T(n) d enote le nombre dop erations pour multiplier des polyn omes de degr e
< n. Nous pouvons clairement supposer T(n) T(n + 1), car si n nest pas une puissance de
deux, nous pouvons r esoudre le probl` eme en remplissant les coefcients de f respectivement g
plus grand que n avec des z eros, jusqu` a la prochaine puissance de deux. (Cest du zero-padding).
Donc lhypoth` ese (a) du th eor` eme 2.1 est bien v eri ee.
Nous avons T(2n) = 3T(n) +8n4 3T(n) +8n. Donc, lhypoth` ese (b) est v eri ee avec
a = 2, b = 1, c = 3, et d = 8. En appliquant le th eor` eme, nous obtenons le corollaire.
41
Algorithmique - Semestre dAutomne 2010/2011
Corollaire 2 Lalgorithme de Strassen utilise O(n
log
2
(7)
) op erations.
Preuve. Nous avons T(n) T(n + 1) pour la m eme raison quau corollaire pr ec edent. Nous
savons que T(2n) 7T(n) + 15n
2
. Donc nous pouvons appliquer le th eor` eme avec a = 2,
b = 2, c = 7, et d = 15.
Pour pouvoir prouver le th eor` eme 2.1, nous avons besoin de la proposition suivante:
Proposition 2 Soit u R. Alors pour tout k 1:
k1
=0
u
=
_
k si u = 1
u
k
1
u1
si u ,= 1.
De plus, si [u[ < 1, alors
k1
=0
u
<
=0
u
=
1
1 u
.
Nous laissons la preuve comme exercice.
Preuve du th eor` eme 2.1. La preuve consiste en 3 etapes:
=0
_
a
b
c
_
_
.
Nous montrons ceci par induction sur k.
[Base] : k = 1. On a T(a) cT(1) +d, en utilisant lhypoth` ese (b) du th eor` eme avec n = 1.
[Pas] : Lapplication de la premi` ere etape suivi de lhypoth` ese dinduction donne
T(a
k+1
) cT(a
k
) +da
kb
Hyp.
c
k
_
cT(1) +d
k1
=0
_
a
b
c
_
_
+da
kb
= c
k
_
cT(1) +d
k1
=0
_
a
b
c
_
+d
_
a
b
c
_
k
_
= c
k
_
cT(1) +d
k
=0
_
a
b
c
_
_
.
42
Algorithmique - Semestre dAutomne 2010/2011
_
c
k
si a
b
< c
kc
k
si a
b
= c
a
kb
si a
b
> c
1. Si a
b
< c, la Proposition 2 implique que
k1
=0
_
a
b
c
_
<
1
1
a
b
c
pour tout k. En utilisant cette in egalit e et l etape 1, nous obtenons
T(a
k
) c
k1
_
cT(1) +d
1
1
a
b
c
. .
=:
_
= c
k
T(1) +c
k1
=
_
T(1) +
c
_
. .
=:
c
k
.
2. Si a
b
= c, alors
k1
=0
_
a
b
c
_
=0
_
a
b
c
_
=
_
a
b
c
_
k
1
a
b
c
1
_
a
b
c
_
k
1
a
b
c
1
. .
=:
.
43
Algorithmique - Semestre dAutomne 2010/2011
Donc nous avons
T(a
k
) c
k
T(1) +c
k1
d
_
a
b
c
_
k
= c
k
T(1) +
d
c
a
kb
= a
kb
__
c
a
b
_
k
. .
<1
T(1) +
d
c
_
_
T(1) +
d
c
_
. .
=:
a
kb
.
EES DYNAMIQUES
EL
EMEN-
TAIRES
Dans ce chapitre nous etudierons les stacks, les les dattente et les listes li ees. Ce sont des
types abstraits, cest-` a-dire que leur fonctionalit e est d enie mais ils peuvent etre impl ement es
(r ealis es) de diff erentes facons. Nous verrons pour chacun de ces trois types une impl ementation
(r ealisation) qui utilise un tableau (array).
47
Algorithmique - Semestre dAutomne 2010/2011
3.2.1 Stack (ou pile)
Un stack est une structure de donn ees qui permet dempiler des objets: Lintuition est qu` a
chaque fois quon ajoute quelque chose sur une pile, on le met par dessus les objets d ej` a pr esents.
On ne peut enlever que lobjet le plus haut. Ce principe sappelle dernier-entr e, premier-sorti
(LIFO, Last-in, First-out).
Lop eration dajout dun objet au stack sappelle push et lop eration denl` evement est nomm ee
pop. Une troisi` eme op eration indiquant si le stack est vide est parfois ajout ee.
On peut r ealiser (impl ementer) un stack avec un tableau (array) et un indice qui indique la
premi` ere position vide (ou alternativement, la derni` ere position occup ee).
Illustration:
0 1 2 3 4 5 6
15 6 2 9
top[S] = 3
S
Voici un stack S contenant 4 el ements. Les cases sont des positions dans larray de limpl ementation.
Le stack poss` ede un attribut top[S] qui est lindice indiquant la plus haute position occup ee.
0 1 2 3 4 5 6
15 6 2 9 17 3
top[S] = 5
S
Le m eme stack S apr` es Push(S, 17) et Push(S, 3).
0 1 2 3 4 5 6
15 6 2 9 17 3
top[S] = 4
S
Lop eration Pop(S) retourne 3 et efface ensuite cet el ement de S (i.e. top[S] est diminu e de un).
Si on essaye deffectuer un Pop(S) sur un stack S vide, lop eration Pop retourne un code
indiquant ce fait et on dit alors quon a stack underow.
48
Algorithmique - Semestre dAutomne 2010/2011
Les algorithmes 7, 8, 9 donnent une r ealisation standard dun stack bas e sur un tableau (ar-
ray).
Algorithme 7 StackIsEmpty(S)
1: if top[S] = 0 then
2: return true
3: else
4: return false
5: end if
Algorithme 8 Push(S, x)
1: top[S] top[S]+1
2: S[top[S]] x
Algorithme 9 Pop(S)
1: if StackIsEmpty(S) then
2: return underow
3: else
4: top[S] top[S]-1
5: return S[top[S] + 1]
6: end if
Exemple: Les stacks sont tr` es souvent utilis es dans la programmation. Quelques exemples:
Stack d evaluation dexpressions: Pour pouvoir evaluer des expressions comme
((a +b) (c +d)) + (e f) (3.1)
on se sert dun stack qui stocke les r esultats interm ediaires. Les programmes qui evaluent
ce type dexpression se servent typiquement dun stack. Lexpression (3.1) se traduit alors
en la suite dinstructions suivante:
Push(S, a)
Push(S, b)
Push(S, Pop(S) +Pop(S))
Push(S, c)
Push(S, d)
Push(S, Pop(S) +Pop(S))
Push(S, Pop(S) Pop(S))
Push(S, e)
Push(S, f)
49
Algorithmique - Semestre dAutomne 2010/2011
Push(S, Pop(S) Pop(S))
return Pop(S) +Pop(S)
Pour des valeurs de a, b, c, d, e et f donn ees, la suite ci-dessus retourne alors l evaluation
de lexpression.
(Certaines calculatrices de la marque HP laissent ` a lutilisateur ce pas de traduction, et
prennent comme input directement les op erations Push (la touche enter), et les op erateurs.
Cette m ethode sappelle reversed polish notation.)
Stack dadresse retour: Pour stocker ladresse retour dune sous-routine. Un tel stack est
utilis e par exemple dans les applications r ecursives. Les sous-routines sont ainsi ex ecut ees
dans lordre de leur ordre dappel.
Stack de variable locale: Pour g erer les variables locales dans des programmes r ecursifs.
Stack de param` etres: Pour stocker les param` etres sur lesquels agit une sous-routine. (les
valeurs dinput dun programme par exemple).
Remarquons que quasi tous les programmes informatiques disposent au moins dun stack:
Cest le stack qui contient ` a la fois les variables locales, les adresses de retour et sur lequel
les arguments pour les sous-routines sont pass es. Ce stack sert aussi a stocker des r esultats
interm ediaires.
On peut par exemple utiliser un stack pour v erier les parenth` eses dune expression:
Probl` eme: V erication de parenth` eses
Input: Une expression contenant du texte et (, ), [, ], ,
Output: correct ou incorrect, selon si toutes les parenth` eses ouvrantes
sont ensuite ferm ees.
Nous utilisons un stack S, initialement vide.
La condition l el ement le plus haut de S ne correspond pas ` a c est d enie par:
( correspond ` a )
[ correspond ` a ]
correspond ` a
Exemple: ((1 + 9) 93 (98)/23 (43 + 2) est une expression incorrecte, la toute premi` ere
parenth` ese nest pas ferm ee. Lexpression [(1 + 9) 93 (98)/23 (43 + 2)] est correcte.
50
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 10 VERIFICATIONPARENTHESES
1: while Input pas ni do
2: c prochain caract` ere
3: if c=( ou c=[ ou c= then
4: Push(S, c);
5: end if
6: if c=) ou c=] ou c= then
7: if StackIsEmpty(S) ou l el ement le plus haut de S ne correspond pas ` a c then
8: return Incorrect
9: else
10: Pop(S);
11: end if
12: end if
13: end while
14: if StackIsEmpty(S) then
15: return Correct
16: else
17: return Incorrect
18: end if
3.2.2 Files dattente (Queues)
Les les dattente sont des ensembles dynamiques qui permettent de nouveau denlever et dajouter
des el ements. Cette fois, on ne peut ajouter qu` a la n et enlever quau d ebut, i.e., si on enl` eve,
on enl` eve toujours le plus ancien el ement encore dans la queue. Cest le principe premier-entr e,
premier-sorti (en anglais: rst-in-rst-out, FIFO). Nous appelons lop eration denl` evement dun
el ement dequeue, et celle dajout enqueue.
Il est de nouveau possible de se servir dun tableau (array) pour r ealiser une le dattente,
si nous savons que la queue ne d epassera pas une certaine taille. Nous avons besoin de deux
attributs, ` a savoir dun attribut qui indique la prochaine position libre ` a la n de la queue, et un
attribut qui indique la position du plus vieil el ement de la queue (i.e. la position du prochain
el ement ` a enlever). Nous appellerons ces attributs respectivement tail et head.
Lid ee est maintenant de remplir ` a chaque fois la position tail si Enqueue est appel e, et
densuite incr ementer tail. Si tail d epasse la n du tableau, on recommence ` a la premi` ere
position. La fonction Dequeue proc` ede de mani` ere similaire: Ayant lu la valeur de la position
head ` a retourner, ce compteur est incr ement e et remis ` a un sil d epasse la n du tableau.
Exemple:
51
Algorithmique - Semestre dAutomne 2010/2011
0 1 2 3 4 5 6 7 8 9 10
15 6 9 8 4
head[Q] tail[Q]
Q
Le dessin ci-dessus repr esente une le dattente Q avec 5 el ements aux positions Q[6..10]. Si
nous faisons les op erations Enqueue(Q, 17), Enqueue(Q, 3) et Enqueue(Q, 5), nous aurons
alors la situation suivante:
0 1 2 3 4 5 6 7 8 9 10
15 6 9 8 4 17 3 5
head[Q] tail[Q]
Q
Remarquons quapr` es avoir ajout e 17, la valeur de tail est remise ` a 1. Si nous faisons ensuite
lop eration Dequeue(Q), la valeur 15 est retourn ee, et la queue se trouve dans l etat suivant:
0 1 2 3 4 5 6 7 8 9 10
15 6 9 8 4 17 3 5
head[Q] tail[Q]
Q
Les algorithmes 12 et 13 donnent des r ealisations concr` etes des op erations Enqueue respec-
tivement Dequeue pour des queues bas ees sur un tableau. Remarquons que si head[Q] =
tail[Q], la queue pourrait etre soit pleine ou soit vide. Pour diff erencier ces deux cas nous posons
head[Q]= NULL lorsque la queue est vide. Ainsi linitialisation est la suivante:
Algorithme 11 Initialize(Q)
1: head[Q] NULL
2: tail[Q] 1
Les les dattente sont utilis ees quand des t aches doivent etre trait ees dans leur ordre darriv ee.
Exemple: Les queues sont utilis ees de mani` ere visible ` a lutilisateur dans les situations suiv-
antes:
52
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 12 Enqueue(Q, x)
1: if head[Q]=tail[Q] then
2: error overow
3: end if
4: Q[tail[Q]] x
5: if head [Q] = NULL then
6: head [Q] tail[Q]
7: end if
8: if tail[Q] = length[Q] then
9: tail[Q]1
10: else
11: tail[Q] tail[Q]+1
12: end if
Algorithme 13 Dequeue(Q)
1: if head [Q] = NULL then
2: error underow
3: end if
4: x Q[head[Q]]
5: if head[Q] = length[Q] then
6: head[Q] 1
7: else
8: head[Q] head[Q]+1
9: end if
10: if head[Q] = tail[Q] then
11: head[Q] NULL
12: end if
13: return x
53
Algorithmique - Semestre dAutomne 2010/2011
Routers: Les t aches sont des paquets, il faut d eterminer ` a quel router le paquet doit etre
envoy e. On utilise une le dattente pour traiter les paquets dans lordre.
Appels t el ephoniques: Quand on appelle un num ero 0800 en Suisse, lappel est mis dans
une queue en attendant d etre trait e. Dans la situation id eale, les appels sont trait es dans
leur ordre darriv ee.
Imprimantes: Quand on envoie une t ache ` a une imprimante, elle est ins er ee dans une le
dattente.
Les tampons (buffers) sont des types particuliers de les dattente, contenant un ux de
donn ees ` a traiter. Les interfaces de transmission de donn ees utilisent des tampons. Par exemple,
les donn ees ` a ecrire sur un disque dur sont dabord stock ees sur un tampon.
Il existe des les dattente qui prennent en compte les priorit es, appel ees des les dattente
avec priorit e (Priority Queues). Cette variante ne nous concernera pas dans ce cours.
3.2.3 Listes liees (Linked lists)
Une liste li ee est une facon simple et exible de repr esenter un ensemble dynamique. Elle permet
dimpl ementer toutes les op erations mentionn ees dans la section 3.1. Il sagit dune structure de
donn ees dans laquelle les objets sont ordonn es de facon lin eaire. Lordre est donn e par des
pointeurs associ es ` a chaque objet.
Il y a plusieurs types de listes li ees. Nous regarderons ici les listes doublement li ees. Les
el ements de ce type de liste poss` edent chacun deux pointeurs, prev et next. Le pointeur prev
pointe sur le pr ed ecesseur (dans la liste) de l el ement, et nextsur le successeur. Si prev[x] =
NULL alors x est le premier el ement (head) de la liste, et si next[x] = NULL, alors x est le
dernier el ement (tail).
Nous avons encore besoin dun attribut head[L], qui est un pointeur indiquant le premier
el ement de la liste. Pour une liste L vide, on a head[L] = NULL.
Exemple:
head[L] 9 4
prev
key
next
1
Cest une liste doublement li ee L qui repr esente (9, 4, 1).
head[L] 5 9 4 1
54
Algorithmique - Semestre dAutomne 2010/2011
La liste L apr` es Insert(L, x), avec key[x] = 5.
head[L] 5 9 1
La liste L apr` es Delete(L, x), avec key[x] = 4.
Les algorithmes 14, 15 et 16 montrent comment chercher, ins erer et effacer des objets dans
une liste doublement li ee.
Algorithme 14 Search(L, k)
1: x head[L]
2: while x ,= NULL et key[x] ,= k do
3: x next[x]
4: end while
5: return x
Algorithme 15 Insert(L, x)
1: next[x] head[L]
2: prev[x] NULL
3: if head[L] ,= NULL then
4: prev[head[L]] x
5: end if
6: head[L] x
Algorithme 16 Delete(L, x)
1: if prev[x] ,= NULL then
2: next[prev[x]] next[x]
3: else
4: head[L] next[x]
5: end if
6: if next[x] ,= NULL then
7: prev[next[x]] prev[x]
8: end if
3.3 GRAPHES ET ARBRES
Les graphes sont des structures de donn ees g en erales qui peuvent etre utilis ees pour repr esenter
des d ependances et des relations entre des objets. Ils sont tr` es souvent utilis es en informa-
tique, par exemple pour d ecrire la structure du hardware, des r eseaux informatiques, des ux de
55
Algorithmique - Semestre dAutomne 2010/2011
donn ees, des syst` emes parall` eles et des structures hi erarchiques (arbres). On rappelle la d enition
dun graphe et des d enitions sy rapportant.
D enition. Un graphe (V, E) est un ensemble ni de sommets V et une relation E V V .
D enition.
Pour a, b V nous disons quil y a une ar ete de a ` a b si (a, b) E.
Un chemin de longueur n est une suite de n ar etes
(c
0
, c
1
), (c
1
, c
2
), . . . , (c
n2
, c
n1
), (c
n1
, c
n
).
Un chemin pour lequel c
0
= c
n
est appel e un cycle.
Un graphe est dit connexe sil existe un chemin entre a et b pour tout (a, b) V
2
tel que a
est diff erent de b.
Le in-degr e dun sommet a dans un graphe est le nombre dar etes qui vont vers a, i.e.,
[b V [ (b, a) E[.
Le out-degr e dun sommet a est le nombre dar etes qui sortent de a, i.e., [b V [ (a, b)
E[.
Un voisin dun sommet x dun graphe est un autre sommet y tel que x et y sont li es (i.e.,
ont une ar ete en commun).
Un graphe est dit non-orient e si E est sym etrique.
Dans un graphe non-orient e, le degr e dun sommet a est le nombre de sommets adjacents ` a
a, i.e.,
deg(a) = [b E [ (a, b) E[.
Exemple: G
1
et G
2
sont des graphes non-orient es.
G
1
:
v
w
connexe;
a un cycle de longueur 3.
56
Algorithmique - Semestre dAutomne 2010/2011
G
2
:
non-connexe;
sans cycles
On voit que G
1
a 7 sommets et 7 ar etes, et que G
2
a 6 sommets et 4 ar etes. Dans G
1
le
sommet v est de degr e 1, et le sommet w est de degr e 3.
3.3.1 Representer des graphes
Comment peut-on repr esenter des graphes de mani` ere efcace dans un ordinateur? Nous allons
etudier deux des plus importantes m ethodes.
Repr esentation par une matrice dadjacence
Consid erons un graphe G = (V, E), o` u V = v
1
, . . . , v
n
. La matrice dadjacence de G est une
matrice A = (a
ij
)
1i,jn
, telle que pour tout i et j nous avons a
ij
0, 1, d enis comme suit:
a
ij
:=
_
1, si (v
i
, v
j
) E
0, sinon.
La quantit e de m emoire n ecessaire est n
2
bits pour des graphes orient es. Pour les graphes non-
orient es, nous avons a
ij
= a
ji
, et donc la quantit e de m emoire n ecessaire est 1 + 2 + + n =
n(n+1)
2
bits.
Exemple: Consid erons le graphe orient e G, et sa matrice dadjacence A:
G =
v
1
v
2
v
3
v
4
A =
_
_
_
_
0 1 0 1
0 0 0 1
0 1 1 0
0 0 0 0
_
_
_
_
On voit que le nombre de 1 dans la matrice dadjacence est egal au nombre dar etes dans le
graphe.
Remarquons les faits suivants:
le in-degr e de v
2
est 2, et il y a 2 fois la valeur 1 dans la 2
` eme
colonne de A.
le out-degr e de v
2
est 1, et il y a 1 fois la valeur 1 dans la 2
` eme
ligne de A.
le in-degr e de v
3
est 1.
57
Algorithmique - Semestre dAutomne 2010/2011
le out-degr e de v
4
est 0.
En effet, par d enition de A le nombre de 1 dans la colonne de A qui correspond au sommet
V est egal au in-degr e de V , et le nombre de 1 dans la ligne qui correspond ` a V est egal au
out-degr e de V .
Avantages:
Repr esentation simple.
On a un acc` es efcace, i.e., tester si deux sommets sont li es peut etre rapidement effectu e.
D esavantages:
N ecessite beaucoup de m emoire (O(n
2
)), ind ependamment du nombre dar etes dans le
graphe.
Statique. Ne permet pas facilement dagrandir le graphe.
Repr esentation par des listes dadjacence
Pour chaque sommet v V nous stockons une liste L
v
de sommets voisins de v. Par exemple,
en C++ ceci peut etre fait comme suit:
typedef int vertices;
struct List
vertices value;
List
*
next;
;
List graph[n];
Ainsi, le graphe est repr esent e comme un tableau (array) de listes dadjacence. Il y a une liste
par sommet v du graphe dans laquelle sont stock es tous ses voisins.
Exemple: Le graphe G de lexemple pr ec edent peut etre repr esent e par les 4 listes suivantes:
58
Algorithmique - Semestre dAutomne 2010/2011
2
4
2
3
4
En effet, il y a deux ar etes qui partent de v
1
, lune vers v
2
et lautre vers v
4
, et les el ements de la
premi` ere liste (qui correspond ` a v
1
) sont donc 2 et 4.
La deuxi` eme liste correspond ` a v
2
qui a le seul voisin v
4
. Donc 4 est le seul el ement de la
deuxi` eme liste. Aucune ar ete ne part de v
4
, la quatri` eme liste est donc vide.
Remarquons nalement quon a 4 listes car le graphe a 4 sommets, et ces 4 listes sont stock ees
dans un array.
Avantages:
N ecessite peu de m emoire O([V [ +[E[).
On peut dynamiquement adapter le nombre dar etes.
D esavantages:
M emoire utilis ee en plus par les pointeurs.
Peut seulement op erer sur la liste dadjacence de mani` ere s equentielle (quoique ceci est
souvent sufsant).
En utilisant une liste dadjacence au lieu dun array il est aussi possible daugmenter ou de
diminuer le nombre de sommets du graphe. N eanmoins, dans ce cas il est impossible davoir un
acc` es al eatoire (random access) aux sommets.
3.3.2 Arbres
Les arbres sont lune des plus importantes structures de donn ees en informatique. Ils sont partic-
uli` erement utiles pour la repr esentation de donn ees hi erarchiques qui apparaissent dans beaucoup
dapplications. Tr` es souvent, les arbres forment la base de solutions algorithmiques efcaces de
probl` emes.
Exemples:
59
Algorithmique - Semestre dAutomne 2010/2011
Arbres de d ecision
Arbres de syntaxe
Arbres de code
Arbres de recherche
Arbres couvrants (spanning trees)
Arbres binaires
Arbres AVL
Arbres bicolores
D enition. Un arbre est un graphe qui est connexe et sans cycles.
Nous consid erons surtout les arbres avec racine (rooted trees), cest-` a-dire un arbre avec un
sommet x e appel e sa racine (root).
On a:
Il existe pour tout v V exactement un chemin sans r ep etitions de la racine v
0
` a v.
(Preuve?)
Si le chemin la racine ` a v est de longueur r, nous disons que v a profondeur r.
Par d enition, la racine est lunique sommet de profondeur 0.
La notion de profondeur induit une structure hi erarchique sur larbre. Si x est un sommet
de profondeur r et y
1
, . . . , y
d
sont ses voisins de profondeur r + 1, alors on les appelle les
ls (children) de x, et x sappelle le p` ere (parent) des y
1
, . . . , y
d
. Lentier d sappelle le
degr e de x et est not e deg(x) (donc le degr e de x est le nombre de ls de x).
Un sommet de degr e 0 est appel e une feuille
Un sommet de degr e > 0 est appel e un sommet int erieur.
Le maximum max
vV
deg(v) sappelle le degr e de larbre.
La hauteur dun arbre est la plus grande profondeur dans larbre.
Pour nous, un nud est la m eme chose quun sommet.
60
Algorithmique - Semestre dAutomne 2010/2011
Si T est un arbre et x un sommet de T, alors le sous-arbre de racine x est larbre form e de
tous les d escendants de x avec les m emes ar etes.
Bien que nous avons d eni un arbre comme un type particulier de graphe (connexe et sans
cycles), les d enitions ci-dessus ne sont pas les m emes que celles pour un graphe (par exemple le
d enition de degr e). Il est donc important quand on regarde des arbres avec racine de shabituer
` a ces d enitions.
Exemple: Consid erons larbre avec racine T ci-dessous:
x
y
1
y
2
y
3
v
racine
sommets int erieurs
Feuilles
On a les faits suivants:
T a hauteur 4
x a profondeur 1
y
1
, y
2
et y
3
ont tous profondeur 2
v a profondeur 1
x a degr e 3
y
1
et y
3
ont degr e 0, ce sont donc des feuilles
y
2
et v ont degr e 2
x est le p` ere de y
1
, y
2
et y
3
y
1
, y
2
et y
3
sont les ls de x
x et v sont les ls de la racine
61
Algorithmique - Semestre dAutomne 2010/2011
La racine est le p` ere de x et v
le degr e de T est 3
La partie gris ee est un sous-arbre de T de racine v. Appelons ce sous-arbre B.
B a hauteur 2
B a degr e 3
En consid erant chaque ls de la racine comme racine dun autre arbre avec racine, nous
pouvons donner une d enition r ecursive dun arbre avec racine:
D enition. (Arbre avec racine)
1. Larbre vide (sans sommets) est un arbre avec racine.
2. Si d 0, T
1
, . . . , T
d
sont des arbres avec racine, et x est un nouveau sommet, alors T est
un arbre avec racine x.
T :=
x
T
1
T
2
T
d
Remarque: Avec la d enition ci-dessus, la notion darbre avec racine a et e etendue et inclut
maintenaut aussi les arbres vides et les sous-arbres vides.
Dhabitude, lordre des sous-arbres dun arbre avec racine nest pas important. Si lordre est
important, on dit que larbre est ordonn e. Par exemple, les deux arbres suivants
a
b b
a
ne sont pas distincts si consid er es comme des arbres non-ordonn es, mais il le sont en tant
quarbres ordonn es.
62
Algorithmique - Semestre dAutomne 2010/2011
3.3.3 Representation darbres
Un arbre est un type particulier de graphe. On peut appliquer les m emes techniques pour
repr esenter des arbres que celles pour repr esenter des graphes.
Cependant la repr esentation par matrice dadjacence est tr` es inefcace: larbre sur n sommets
a seulement n1 ar etes, mais la matrice dadjacence utilise O(n
2
) bits. De plus, une ligne enti` ere
de la matrice doit etre parcourue pour trouver les ls dun sommet.
Les listes dadjacence sont mieux adapt es pour repr esenter des arbres. N eanmoins, avec cette
repr esentation, il est difcile de trouver le p` ere dun sommet donn e, parce que ceci nous oblige
a parcourir toutes les listes dadjacence.
Dans cette partie, nous etudierons dautres possibilit es pour repr esenter les arbres.
Nous supposerons que larbre en question est de degr e d (pour un d petit). Cest souvent vrai
en pratique. Par exemple, pour les arbres binaires on a d = 2.
Structures de Pointeurs
Comme les listes, les arbres peuvent aussi etre repr esent es en munissant chaque sommet avec
des pointeurs sur les voisins: chaque sommet est une structure (record, struct) qui, en plus des
donn ees stock ees au sommet, contient aussi des pointeurs vers le p` ere et tous les ls. Si larbre
est de degr e d, alors cette repr esentation peut etre r ealis ee en C++ comme suit:
struct node
int val;
node
*
parent;
node
*
child[d];
;
typedef node
*
tree;
Avec cette repr esentation, un arbre avec racine est donn e par un pointeur vers sa racine.
Exemple: Un arbre binaire
63
Algorithmique - Semestre dAutomne 2010/2011
1
2 3
4 5 6
(Il est important davoir une liste doublement li ee pour etre capable dacc eder aux p` eres
directement.)
Avantages:
Repr esentation simple
Stockage dynamique
Insertion, effacement, d eplacement de sommets ou m eme de sous-arbres est tr` es efcace.
D esavantages:
N ecessite plus de m emoire pour les pointeurs.
Arbres comme tableaux (arrays)
Pour chaque sommet, on stocke les donn ees et les indices des ls/p` eres dans un tableau (array).
Cette m ethode est raisonnable seulement si le nombre de sommets de larbre nexc` ede pas un
maximum pr ed etermin e. Une telle repr esentation peut etre impl ement e en C++ de la mani` ere
suivante:
64
Algorithmique - Semestre dAutomne 2010/2011
typedef int tree;
struct node
int val;
tree left;
tree right;
;
node table[MaxNodes+1];
Une valeur dindice de 1 correspond ` a un arbre vide. Ainsi, larbre est donn e par un tableau,
et lindice de sa racine se trouve dans le tableau.
Avantages:
Acc` es rapide
Pas de pointeurs
Il est possible d ecrouler larbre
D esavantages:
Nombre xe de sommets (structure statique)
Les op erations au milieu de larbre (telles que insertion et effacement) sont plus elabor ees
que pour le cas darbre bas e sur les pointeurs.
Exemple: Arbre dexpression
Consid erons lexpression
((a (a +b))) + (a +b).
On peut la repr esenter avec un arbre binaire de la mani` ere suivante:
65
Algorithmique - Semestre dAutomne 2010/2011
B :
+
a +
a
b
+
a
b
0
1 2
3 4 5
6 7
8 9
Dans cet arbre la racine correspond ` a lindice 0. Larbre peut etre r ealis e par ce tableau
(array):
i val gauche droite
0 + 1 2
1 1 3
2 + 4 5
3 6 7
4 a 1 1
5 b 1 1
6 a 1 1
7 + 8 9
8 a 1 1
9 b 1 1
Par exemple, la premi` ere ligne du tableau nous dit que la racine (le sommet dindice 0) a la
valeur +, et que ses deux ls ont les indices 1 (gauche) et 2 (droite). Donc si on veut voir le ls
gauche du sommet on regarde la deuxi` eme ligne du tableau (puisque ce sommet a lindice 1) et
on voit que sa valeur est et que ses ls sont larbre vide (qui correspond ` a lindice 1) et le
sommet dindice 3.
Repr esentation implicite darbres
Les sommets sont stock es dans un array, les ar etes sobtiennent de mani` ere implicite par la
position des sommets dans larray. Supposons que larbre est de degr e d 2: La racine se
trouve en A[0]. Si x est stock e dans A[i], alors les enfants y
1
, . . . , y
d
de x sont stock es dans
A[di + 1], A[di + 2], . . . , A[di +d].
Avantage: Pas de pointeurs. Utilise peu de m emoire.
D esavantage: La m emoire est gaspill ee si larbre est pench e (i.e., il y a des sommets avec des
sous-arbres de tailles diff erentes). De plus, les op erations au milieu de larbre sont compliqu ees.
66
Algorithmique - Semestre dAutomne 2010/2011
Exemple:
0
1
5
13
29
61
2
6
14
30
Nous avons besoin dun array avec 62 positions pour pouvoir repr esenter un arbre non-
equilibr e avec seulement 10 sommets.
3.3.4 Parcourir des arbres
Une fois les donn ees stock ees dans un arbre, nous aimerions pouvoir linspecter pour trouver des
sommets avec des propri et es donn ees ou pour appliquer une op eration ` a tous les sommets. Pour
ce faire, il est n ecessaire davoir des m ethodes syst ematiques pour parcourir larbre.
Nous consid erons ici le cas des arbres binaires ordonn es. Il y a trois m ethodes de parcours:
La m ethode preorder consiste ` a dabord parcourir la racine, ensuite le sous-arbre de gauche,
et nalement le sous-arbre de droite. (Cette d enition, comme les deux suivantes, est
r ecursive: Nous supposons que les sous-arbres gauche et droite sont aussi parcourus en
preorder.)
Le parcours inorder parcourt dabord le sous-arbre de gauche, ensuite la racine et enn le
sous-arbre de droite.
Parcourir larbre en postorder veut dire de dabord parcourir le sous-arbre de gauche, puis
le sous-arbre de droite, et nalement la racine.
Exemple: Les nombres dans les arbres ci-dessous donnent les ordres de parcours
1
2
3
4 5
6
7 8
9 10
11
12 13
10
4
3
1 3
6
5 8
7 9
12
11 13
13
9
3
1 2
8
4 7
5 6
12
10 11
preorder inorder postorder
67
Algorithmique - Semestre dAutomne 2010/2011
Exemple: Nous repr esentons ici un arbre par un pointeur sur un struct qui contient comme
attributs un pointeur left et un pointeur right sur les sous-arbres de gauche et de droite
respectivement. Un pointeur NULL repr esente un arbre vide.
Lalgorithme r ecursif 17 effectue un parcours preorder. Dans cet exemple, inspect(t) effectue
Algorithme 17 preorder(t)
Input: Un pointeur t sur la racine a parcourir.
if t ,= NULL then
inspect(t)
preorder(left[t])
preorder(right[t])
end if
lop eration d esir ee sur le sommet t.
3.3.5 Resume de la section 3.3
Nous avons vu quun graphe etait une paire (V, E) o` u V est un ensemble de sommets et
E V V est une relation sur ces sommets. Nous avons vu les notions de chemin, cycle,
connexit e, in-degr e, out-degr e, graphe orient e, graphe non orient e.
Nous avons vu deux facons de repr esenter un graphe sur un ordinateur:
Par une matrice dadjacence
Par une liste dadjacence
Nous avons etudi e le concept darbre avec racine, et les notions de profondeur, hauteur,
degr e (notion diff erente que celle dun graphe en g en eral), ls, p` ere, feuille.
Nous avons vu la d enition de lindice dun sommet dans un arbre avec racine.
Nous avons vu plusieurs facons de repr esenter un arbre sur un ordinateur:
Par une structure de pointeurs
Sous forme de tableau
De facon implicite
Nous avons vu trois m ethodes pour parcourir un arbre binaire: preorder, inorder et pos-
torder.
68
Algorithmique - Semestre dAutomne 2010/2011
3.4 STRUCTURES DE DONN
r
y
r
Alors, comme y se trouve dans le sous-arbre gauche de x, nous avons y < x. Dautre part, y
est le plus grand el ement du sous-arbre gauche de x (pourquoi ?). Ayant trouv e y, nous pouvons
effacer x comme suit:
Delete(x): Remplacer x par y, et remplacer y par son sous arbre de gauche.
En proc edant de cette mani` ere la propri et e de larbre de recherche est pr eserv ee, comme < y <
r
du sous-arbre de droite.
Analyse du temps de parcours. Les temps de parcours des op erations consid er ees ci-dessus
d ependent de la forme de larbre de recherche et de la position du sommet en question.
Dans le pire des cas, les temps de parcours sont proportionnels ` a la hauteur de larbre. La
hauteur dun arbre binaire avec N sommets est entre log
2
(N) et N 1. Donc, le co ut des
op erations est O(N) dans le pire des cas.
72
Algorithmique - Semestre dAutomne 2010/2011
En ce sens, les arbres de recherche sont tr` es similaires ` a des structures de donn ees beaucoup
plus simples telles que par exemple un tableau avec la recherche s equentielle: cette derni` ere
structure permet aussi deffectuer toutes ces op erations en O(N).
Naurions-nous donc rien gagn e par rapport ` a des structures de donn ees bien plus simples
(telles quune liste li ee avec recherche s equentielle)? La r eponse est quen pratique on ne
sint eresse pas seulement au comportement dans le pire des cas, mais aussi au comportement
en moyenne. Nous verrons maintenant quen moyenne, les arbres de recherche se comportent en
fait bien mieux que par exemple une liste li ee pour ces op erations.
De quoi devrions-nous prendre la moyenne?
Analyse de larbre al eatoire. Nous supposons que les N! facons dordonner N cl es ont toutes la
m eme probabilit e et nous consid erons larbre de recherche obtenu en ins erant les cl es 1, 2, . . . , N
dans un ordre al eatoire dans un arbre vide. Nous prenons donc la moyenne sur tous les N! arbres
de recherche correspondant aux ordres possibles des cl es.
Par exemple, si est la permutation
_
123
312
_
, larbre de recherche correspondant est
3
1
2
=: B().
Soit B = (V, E) un arbre de recherche de sommets v
1
, . . . , v
N
et de cl es correspondantes
1, 2, . . . , N. Nous d enissons
A
B
=
N
k=1
#Recherches pour trouver k
=
N
k=1
(profondeur(v
k
) + 1).
Soit S
N
lensemble de toutes les permutations sur N sommets, et pour S
N
soit B()
larbre de recherche correspondant. Alors
E
N
:=
1
N!
S
N
A
B()
est la moyenne du nombre total de recherches dans un arbre al eatoire de recherche. Est-il possible
de trouver une formule plus explicite pour E
N
?
Pour E
0
, E
1
, nous avons
E
0
= 0
E
1
= 1.
Nous aimerions trouver une formule inductive pour E
N
. Lillustration dun arbre binaire de
racine k suivante nous donne une id ee:
73
Algorithmique - Semestre dAutomne 2010/2011
k
L R
Notons pour le moment E
N,k
la moyenne du nombre total de recherches dans un arbre de
recherche de racine k. Nous avons
E
N,k
= N +E
k1
+E
Nk
,
et donc, comme tout sommet k 1, . . . , N a m eme probabilit e d etre racine dun arbre
al eatoire de recherche ` a N sommets,
E
N
=
1
N
_
N
k=1
N +E
k1
+E
Nk
_
= N +
1
N
_
N1
k=0
E
k
_
+
1
N
_
N1
k=0
E
k
_
= N +
2
N
N1
k=1
E
k
Pour N + 1, la formule ci-dessus se r e ecrit
E
N+1
= (N + 1) +
2
N + 1
N
k=1
E
k
.
Donc
(N + 1)E
N+1
= (N + 1)
2
+ 2
N
k=1
E
k
NE
N
= N
2
+ 2
N1
k=1
E
k
= (N + 1)E
N+1
NE
N
= 2N + 1 + 2E
N
Cette derni` ere equation nous donne la formule r ecursive suivante:
E
0
= 0
E
1
= 1
E
N+1
=
N + 2
N + 1
E
N
+
2N + 1
N + 1
.
74
Algorithmique - Semestre dAutomne 2010/2011
Ecrivons
H
N
:= 1 +
1
2
+
1
3
+. . . +
1
N
le N
` eme
nombre harmonique. Nous avons alors
E
N
= 2 (N + 1) H
N
3N.
Or, pour H
N
nous disposons de lapproximation suivante:
H
N
= ln N + +
1
2N
+O
_
1
N
2
_
(o` u = 0.5772 . . . est la constante dEuler). Ceci nous donne pour E
N
:
E
N
= 2N ln N (3 2)N + 2 lnN + 1 + 2 +O
_
1
N
2
_
.
Enn donc,
E
N
N
1.386 . . . log
2
N (3 2) +
2 lnN
N
+. . .
est le nombre moyen de recherches pour un sommet al eatoire dans un arbre binaire de recherche
avec N sommets. Ceci prouve le th eor` eme suivant:
Th eor` eme 3.1 Dans un arbre de recherche choisi al eatoirement, linsertion et leffacement peu-
vent etre effectu es en moyenne avec O(log
2
(N)) op erations.
Nous insistons sur le fait que le th eor` eme ci-dessus ne nous donne que le comportement
darbres de recherche en moyenne. Dans le pire des cas, les temps de parcours peuvent etre
O(N), ce qui est beaucoup plus grand.
Pour un arbre complet binaire (le meilleur cas), la moyenne correspondante est egale ` a
N+1
N
log
2
(N + 1) 1. (Sans preuve.) Si N est grand, nous avons
N+1
N
1 < 1.39, et donc
lop eration de recherche prend en moyenne 40% de temps en plus dans un arbre al eatoire que
dans un arbre complet.
3.4.2 Arbres bicolores
Bien quon puisse en moyenne faire des recherches dans un arbre binaire de facon rapide, ils se
comportent tr` es mal dans le pire des cas. En effet le temps de parcours dune recherche d epend
de la hauteur de larbre, qui sera O(N) dans le pire des cas. Le probl` eme est que si les el ements
sont ins er es dans un certain ordre (par exemple de facon croissante), la hauteur de labre grandit
tr` es vite.
75
Algorithmique - Semestre dAutomne 2010/2011
Intuitivement, les arbres bicolores sont des arbres binaires de recherche dont la hauteur nest
pas trop grande, pour lesquels on peut ajouter et enlever des el ements en maintenant cette pro-
pri et e.
D enition. Un arbre bicolore (red-black tree) est un arbre binaire de recherche dans lequel
chaque sommet est attribu e une couleur, soit rouge ou soit noir. De plus les conditions suivantes
doivent etre v eri ees:
1. La racine est noire.
2. Les ls dun sommet rouge sont noirs.
3. Tout chemin dun sommet ` a une de ses feuilles contient le m eme nombre de sommets noirs.
Remarquons que la deuxi` eme condition est equivalente ` a dire que le p` ere dun sommet rouge
est toujours noir.
Proposition 3 Dans un arbre bicolore, le sommet le plus profond est au plus deux fois plus
profond que le sommet le moins profond.
Preuve: Puisque les ls dun sommet rouge sont tous noirs (condition 2 dans la d enition dun
arbre bicolore), un chemin de la racine ` a une feuille ne peut pas contenir deux sommets rouges
de suite. Si un tel chemin contient m sommets noirs, il contiendra donc au plus 2m sommets au
total (en alternant la couleur des sommets le long du chemin).
Nous avons de plus (condition 3) que tous les chemins de la racine ` a une feuille contiennent le
m eme nombre de sommets noirs. Si nous appelons m ce nombre, nous voyons quun tel chemin
contiendra au total au moins m et au plus 2m sommets. Puisque la profondeur dun sommet est
la longueur du chemin de la racine ` a ce sommet, le r esultat suit imm ediatement.
Cette propri et e garantit que la hauteur dun arbre bicolore nest pas trop grande.
Insertion
Nous commencer par ajouter le sommet de la m eme facon que dans un arbre binaire normal,
et le colorons en rouge. Soient x le sommet ajout e, soit y sont p` ere, soit z sont grand-p` ere, et soit
u sont oncle.
Cas 1: x est la racine. Nous colorons x en noir.
Cas 2: y est noir. Nous ne faisons rien.
Cas 3: y est rouge, et u est rouge. Nous colorons y et u en noir.
76
Algorithmique - Semestre dAutomne 2010/2011
Cas 4: y est rouge, u est noir, et x est le ls de droite de y. Nous faisons une rotation ` a
gauche.
Cas 5: y est rouge, u est noir, et x est le ls de gauche de y. Nous faisons une rotation ` a
droite.
Nous devons ` a pr esent v erier que dans chaque cas, les 3 propri et es de la d enition ci-dessus
restent vraient apr` es linsertion. Il est clair que la propri et e 1 restera vraie. Nous regardons ` a
pr esent les deux propri et es restantes:
Cas 1: Larbre na quun seul sommet noir, toutes les propri et es sont donc v eri ees.
Cas 2: Nous avons ajout e un sommet dont le p` ere est noir, la propri et e 2 reste donc vraie.
De plus, le chemin dun sommet quelconque t vers x aura le m eme nombre de sommets
noirs que le chemin de t vers y, la propri et e 3 est donc toujours v eri ee.
Cas 3:
Cas 4:
Cas 5:
Effacement
Cas 1: x est la racine. Nous ne faisons rien
Cas 2: z est rouge. Nous colorons z en noir, y en rouge puis faison une roation ` a gauche
en y.
Cas 3:
Cas 4:
Cas 5:
3.4.3 Arbres AVL
Les arbres de recherche binaires se comportent tr` es mal dans le pire des cas, parce quils peuvent
etre tr` es pench es.
Un arbre binaire est dit equilibr e (balanced), ou appel e arbre AVL (dapr` es Adelson, Velskij
et Landis), si pour tout sommet k les hauteurs des sous-arbres gauches et droits diff` erent par au
plus 1.
77
Algorithmique - Semestre dAutomne 2010/2011
D enition. Soit T un arbre binaire avec racine. Soit v
k
un sommet de T. Le facteur d equilibre
(balance factor) de v
k
est d eni comme suit:
bal(v
k
) = (hauteur du sous arbre de gauche) (hauteur du sous arbre de droite),
o` u nous supposons quun sous arbre vide a hauteur 1.
D enition. Un arbre AVL est un arbre binaire avec racine dans lequel le facteur d equilibre de
chaque sommets vaut 1, 0, ou 1.
Exemple: Le graphique suivant repr esente un arbre AVL dans lequel les sommets sont index es
par leurs facteurs d equilibre respectifs.
1
1
1 0
0
1
0
La propri et e principale dun arbre AVL est que sa hauteur ne peut crotre que logarithmique-
ment avec le nombre de sommets. Un arbre AVL avec N sommets permet donc de chercher,
dins erer et deffacer en O(log N) op erations dans le pire des cas.
Th eor` eme 3.2 La hauteur dun arbre AVL avec n sommets v erie lin egalit e suivante:
h < 1.4404 log
2
(n) + 0.672.
Preuve. Remarquons dabord que les sous-arbres darbres AVL sont eux-m emes des arbres AVL.
Quel est le nombre minimal de sommets dans un arbre AVL de hauteur h?
78
Algorithmique - Semestre dAutomne 2010/2011
Pour h = 1, 2 nous avons:
h = 1: 2
h = 2: 4
En g en eral, il y a trois cas: bal(racine) = 1, 0, 1.
h h
bal=0
h
h + 1
h + 1
h
bal=+1
h + 2
h + 1
h
bal=1
h + 2
Le nombre minimum A
h
de sommets dans un arbre AVL de hauteur h v erie
A
h+1
= 1 + min (2A
h
, A
h
+A
h1
)
= 1 +A
h
+A
h1
.
Nous prouvons par induction que
A
h
>
1 +
5
2
5
_
1 +
5
2
_
h
. (3.2)
[Base] Pour h = 1, on a A
h
= 2 >
(1+
5)
2
4
5
.
[Pas] Posons c :=
1+
5
2
5
.
A
h+1
= 1 +A
h
+A
h1
> 1 +
1 +
5
2
5
_
1 +
5
2
_
h
+
1 +
5
2
5
_
1 +
5
2
_
h1
= 1 +c
_
1 +
5
2
_
h _
1 +
2
1 +
5
_
= 1 +c
_
1 +
5
2
_
h
3 +
5
1 +
5
> c
_
1 +
5
2
_
h+1
.
79
Algorithmique - Semestre dAutomne 2010/2011
Donc par induction (3.2) est vraie.
Si on pose b =
1+
5
2
, on sait ` a pr esent (par (3.2)) quun arbre AVL de hauteur h doit avoir au
moins c b
h
sommets. Supposons maintenant que nous avons un arbre AVL avec n sommets, et
soit h sa hauteur, par la phrase pr ec edente on doit avoir
c b
h
< n b
h
<
n
c
h log(b) < log(n) log(c)
h <
log(n)
log(b)
log(c)
log(b)
= h < 1.4404 log
2
(n) + 0.672
Ce th eor` eme nous dit que la hauteur dun arbre AVL avec N sommets est O(log(N)).
Lop eration Search co ute donc O(log(N)), m eme dans le pire des cas. Cependant, avec les
m ethodes dinsertion et deffacement que nous avons vues pour les arbres binaires de recherche,
si nous ajoutons ou effacons un el ement dun arbre AVL il ne sera plus n ecessairement AVL.
Si nous pouvions ins erer et effacer des sommets dun arbre AVL avec N sommets en temps
O(log(N)) en maintenant la condition AVL, alors nous aurions une structure de donn ees qui
permettrait deffectuer les op erations dinsertion, deffacement et de recherche en O(log(N)),
dans le pire des cas. De telles m ethodes dinsertion et deffacement existent, elles sont d ecrites
ci-dessous:
Insertion: On commence par ins erer le sommet de la m eme mani` ere que dans un arbre de
recherche binaire. Ensuite, lalgorithme remonte du sommet ins er e jusqu` a la racine en v eriant
l equilibre ` a chaque sommet du chemin. Si un sommet non- equilibr e est rencontr e (i.e., tel que
le facteur d equilibre est egal ` a +2 ou -2), alors une rotation est effectu ee. Le type de rotation ` a
effectuer d epend de la position du sommet ins er e par rapport au sommet non- equilibr e.
Toutes les congurations possibles peuvent se classer en 4 cas, pour chacun desquels il existe
une rotation qui r e equilibre le sommet. Les 4 rotations sont appel ees RL, LR, RR et LL:
80
Algorithmique - Semestre dAutomne 2010/2011
Rotation RL:
Rotation LR:
Rotation RR:
Rotation LL:
81
Algorithmique - Semestre dAutomne 2010/2011
Exemple: Voici une illustration de la proc edure de r e equilibrage. Le sommet bleu (new node)
vient d etre ajout e, et larbre nest donc plus AVL. Il faut effectuer une rotation pour le r e equilibrer.
2
0
0 0
2
0 +1
1
0
0
New node
Nous suivons le chemin du sommet ajout e ` a la racine jusquau prochain sommet non- equilibr e
(dans lexemple le sommet rouge, qui a comme facteur d equilibre 2). Ce sommet subira une
rotation RL:
1
0
0 0
0
+1 0
0 0 0
Effacement: Lalgorithme deffacement est un peu plus compliqu e. On commence par effacer
le sommet comme dans un arbre binaire de recherche arbitraire (cest-` a-dire non AVL). Comme
pour linsertion, larbre doit ensuite etre r e equilibr e en utilisant des rotations. Nous illustrons
cette proc edure ` a laide dun exemple.
Exemple: Dans larbre ci dessous supposons que nous voulons effacer le sommet dont la cl e vaut
26 (que nous appelons simplement le sommet 26). Lalgorithme deffacement que nous avons
d ej` a vu (pour les arbres non AVL) enl` eve le sommet 26 et le remplace par le sommet 23:
26
19
17
11
23
39
30
27 37
42
82
Algorithmique - Semestre dAutomne 2010/2011
Nous voyons ensuite que larbre nest plus equilibr e (il nest plus AVL), puisque le facteur
d equilibre du sommet 19 vaut +2.
23
19
17
11
39
30
27 37
42
Rotation LL
On voit maintenant, en regardant les diagrames ci-dessus que cette conguration peut etre
r e equilibr ee avec une rotation LL:
23
17
11 19
39
30
27 37
42
Quelques remarques:
Contrairement au cas dinsertion, il est possible que plusieurs rotations soient n ecessaires
pour le r e equilibrage apr` es un effacement.
Le co ut des op erations dinsertion et deffacement est O(log(N)), o` u N est le nombre total
de sommets. Nous ne prouverons pas ce r esultat.
Remarquons pour terminer quune impl ementation efcace dun arbre AVLn ecessite quon
stocke quelque chose de plus dans chaque sommet, ` a savoir le facteur d equilibre: On ne
peut pas se permettre de le recalculer ` a chaque fois quon v erie l equilibre.
3.5 LE HACHAGE (HASHING)
Nous avons vu des m ethodes pour stocker des donn ees permettant une impl ementation efcace
des operations de recherche, dinsertion et deffacement. Dans ces m ethodes, chaque el ement
est identi e par une cl e unique. Cependant, seul un petit sous-ensemble K de lensemble K de
toutes les cl es possibles nest utilis e ` a un moment donn e.
83
Algorithmique - Semestre dAutomne 2010/2011
Les m ethodes vues jusqu` a pr esent proc` edent en comparant les cl es des el ements. Par contre,
les m ethodes de hachage (hash methods) tentent de trouver un el ement en calculant sa position
` a partir de sa cl e k. Les el ements sont stock es dans un tableau (array) lin eaire avec des indices
0, 1, . . . , m1, quon appelle la table de hachage (hash table).
D enition. La fonction de hachage (hash function) est une application
h: K 0, 1, . . . , m1,
qui fait correspondre ` a chaque cl e k un indice h(k), appel e ladresse de hachage (hash address).
Donc pour savoir o` u stocker un el ement avec cl e k dans la table de hachage, il suft de
calculer h(k) qui nous donnera lindice du tableau o` u mettre notre el ement. De m eme pour
rechercher un el ement on calcule son adresse de hachage h(k) puis on regarde la position corre-
spondante dans la table de hachage.
Cependant, mest en g en eral beaucoup plus petit que K. La fonction de hachage nest donc en
g en eral pas injective, cest-` a-dire que plusieurs cl es peuvent avoir la m eme adresse de hachage.
D enition. Soit h une fonction de hachage, et soient k, k
K. Si
k ,= k
et h(k) = h(k
).
alors on dit quon a une collision dadresse (address collision), et k et k
n
= Esp erance du nombre dentr ees visit ees dans une table de hachage lors dune
recherche qui echoue
Nous indiquerons toujours les distributions de probabilit e qui nous int eressent.
Une bonne fonction de hachage doit avoir les propri et es suivantes:
Elle doit etre calculable de mani` ere efcace,
Elle doit distribuer les el ements de mani` ere uniforme, m eme si les cl es ne le sont pas (par
exemple des noms de variables dans un programme)
M eme dans le meilleur des cas il est impossible d eviter les collisions.
Birthday Lemma. Si q 1.78
_
[M[, alors la probabilit e quune fonction al eatoire uniforme
f : 1, 2, . . . , q M
soit injective est inf erieure ` a 1/2.
Corollaire. Si plus de 23 personnes sont dans une pi` ece, alors la probabilit e quau moins deux
dentre elles aient le m eme anniversaire est sup erieure ` a 1/2.
Preuve du Birthday Lemma: On pose m = [M[. La probabilit e que la fonction soit injective
est
m(m1)(mq+1)
mmm
=
_
1
1
m
_
_
1
q1
m
_
< e
q(q1)
2m
Si q
1+
1+8 ln(2)
2
m, on a
e
q(q1)
2m
<
1
2
.
85
Algorithmique - Semestre dAutomne 2010/2011
Remarquons que
1+
1+8 ln(2)
2
1.78.
Nous supposons ` a partir de maintenant que lensemble K de toutes les cl es possibles est un
sous-ensemble de N. Si les cl es nous sont donn ees, par exemple sous la forme dune liste de
caract` eres (comme le nom dune variable en C), nous pouvons interpr eter les codes ASCII des
caract` eres comme des entiers positifs et ainsi faire correspondre ` a chaque liste de caract` eres un
entier.
La m ethode de division avec reste
Dans cette m ethode on choisit une valeur m qui sera la taille de la table de hachage. On
d enit la fonction de hachage f : K 0, 1, . . . , m1 comme suit:
h(k) := k mod m.
On a donc bien h(k) 0, 1, . . . , m1.
Le choix de m est crucial. Par exemple, si m est pair, alors le bit le moins signiant de k et
h(k) est le m eme (est en collision). On aura donc plus de collisions pour les el ements qui ont le
m eme bit le moins signiant. Avec le m eme raisonnement, on voit que m ne doit pas etre une
puissance de 2 puisque dans ce cas les el ements avec les m emes bits les moins signiants seraient
en collision. Plus concr` etement, si on choisissait m = 2
1
=
5 1
2
0, 6180339887
donne la distribution la plus uniforme. On obtient la fonction de hachage
h(k) :=
_
m
_
k
1
_
k
1
___
En particulier, la suite h(1), h(2), . . . , h(10) pour m = 10 est simplement une permutation
des entiers 0, 1, . . . , 9: 6, 2, 8, 4, 0, 7, 3, 9, 5, 1.
Lum, Suen, et Dodd ont etudi e le comportement de nombreuses fonctions de hachage, et ont
r ealis e que la m ethode de division avec reste donne les meilleurs r esultats en moyenne.
Dans les discussion qui suivent sur la r esolution de collisions, nous supposerons donc tou-
jours que cest cette m ethode de hachage qui est utilis ee.
Les Strategies pour la R esolution de Collisions
Supposons que nous avons une table de hachage qui contient la cl e k. Si nous voulons ins erer
dans cette table un synonyme k
avec
probabilit e 1/m, quel que soit j,
D enition. Si n est le nombre de cl es possibles et m la taille de la table de hachage, alors le
facteur doccupation est d eni comme suit:
:=
n
m
.
Analyse dune recherche qui echoue
Dans ce cas, ladresse h(k) est calcul ee, et tous les el ements dans la liste de synonymes sont
travers es.
La longueur moyenne de chaque liste est n/m = , et donc
C
n
=
Analyse dune recherche qui r eussit
Supposons quil faille visiter i el ements pour trouver la cl e recherch ee, i.e., le co ut de trouver
la cl e est i.
Quand nous ajoutons la j
` eme
cl e, la longueur moyenne de la liste est (j 1)/m; Donc, en
cherchant la j
` eme
cl e nous navons besoin de visiter que 1 + (j 1)/m el ements de la liste, si
les insertions dans la liste ne sont faites qu` a la n, et quil ny a aucun effacement. Le nombre
moyen de cl es visit ees dans le cas dune recherche r eussie est donc
C
n
=
1
n
n
j=1
_
1 +
j1
m
_
= 1 +
n1
2m
1 +
2
si chaque cl e est recherch ee avec la m eme probabilit e.
89
4
Construction dalgorithmes par
induction
La m ethode dinduction peut etre utilis ee pour construire des algorithmes, en r eduisant la reso-
lution dune instance dun probl` eme ` a la resolution dune ou plusieurs instances plus petites du
m eme probl` eme.
Deux points sont essentiels dans la conception dalgorithme par induction:
Il est possible de r esoudre une petite instance du probl` eme: le cas de base.
Une solution de chaque probl` eme peut etre construite ` a partir de solutions de plus petits
probl` emes: le pas dinduction.
Nous verrons des exemples de cette m ethode, et introduirons plusieurs classes dalgorithmes
bas ees sur cette m ethode, telles que la programmation dynamique et les algorithmes diviser-
pour-r egner (divide-and-conquer).
4.1 LA M
ETHODE DE HORNER
La m ethode de Horner est un algorithme efcace pour evaluer des polyn omes g en eriques en un
point donn e. Le probl` eme qui nous int eresse est donc le suivant:
Probl` eme: Evaluation de Polyn ome
Input: Polyn ome f(x) =
n
i=0
f
i
x
i
R[x], et R.
Output: f().
Lalgorithme qui suit pr esente une m ethode nave pour evaluer un polyn ome en un point
donn e.
90
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 18 NAIF(f(x), )
1: s 0 et i 0.
2: while i n do
3: Calculer
i
.
4: s s +f
i
.
5: i i + 1.
6: end while
7: return s
Si nous utilisons la m ethode nave pour calculer
i
` a la ligne 3, alors lalgorithme a besoin de
O(n
2
) op erations sur des nombres r eels. Si nous utilisons la m ethode binaire ` a la ligne 3, alors
lalgorithme a besoin de O(nlog(n)) op erations sur des nombres r eels.
Pouvons nous faire mieux? Oui. La m ethode de Horner simplie le probl` eme en utilisant
lobservation suivante:
f() = f
0
+g(),
o` u g(x) = f
1
+f
2
x + +f
n
x
n1
.
Nous utilisons donc le fait que f() est egal ` a
(( ((f
n
+f
n1
) +f
n2
) ) +f
1
) +f
0
.
En pseudo-code, nous d ecrivons la m ethode de Horner comme suit:
Algorithme 19 HORNER(f(x), )
1: s 0 and i n.
2: while i 0 do
3: s s +f
i
.
4: i i 1.
5: end while
6: return s
Sous cette forme nous voyons imm ediatement quil faut ` a cet algorithme n + 1 additions et
n + 1 multiplications pour calculer f() (nous ne comptons pas les op erations sur le compteur
i), ainsi nous avons un algorithme O(n).
La m ethode de Horner est-elle optimale? La r eponse est oui, pour des polym omes g en eriques
(preuve difcile). Pour des polyn omes sp eciques, la m ethode de Horner peut ne pas etre op-
timale (on peut, par exemple, evaluer le polyn ome f(x) = x
n
plus rapidement quen O(n)
op erations.)
91
Algorithmique - Semestre dAutomne 2010/2011
4.2 ELIMINATION DE GAUSS
Supposons que nous voulons r esoudre un syst` eme d equations lin eaires. Formellement nous
avons:
Probl` eme: Syst` eme d equations lin eaires
Input: Matrice A R
nn
, vecteur b R
n
Output: Vecteur x R
n
tel que A x = b.
Lalgorithme pour r esoudre un tel syst` eme est tr` es utilis e en alg` ebre lin eaire. On lappelle la
m ethode du pivot de Gau. Nous la pr esentons ici dans le cadre des algorithmes construits par
induction en insistant sur le caract` ere inductif de lalgorithme.
Nous pouvons ecrire la matrice A par blocs de la mani` ere suivante :
A =
a
11
A
12
A
21
A
22
,
o` u a
11
R, A
12
R
1(n1)
, A
21
R
(n1)1
, et A
22
R
(n1)(n1)
.
Nous appelons a
11
le pivot, et supposons que a
11
,= 0. Soit I
m
la matrice identit e de dimen-
sion m. Alors
X
..
_
_
1 0
A
21
a
11
I
n1
_
_
A
Y
..
_
_
1
A
12
a
11
0 I
n1
_
_
=
Z
..
_
_
a
11
0
0
A
_
_
, (4.1)
o` u
A = A
22
A
21
a
1
11
A
12
. (4.2)
92
Algorithmique - Semestre dAutomne 2010/2011
Cette matrice
Aest appel ee le compl ement de Schur de Apar rapport ` a a
11
. En utilisant X, Y
et Z denis ci-dessus nous avons:
A x = b X A x = X b
(X A Y ) Y
1
x = X b
Z Y
1
x = X b, (avec (4.1) ci dessus)
et nous obtenons donc le syst` eme d equations suivant:
_
_
a
11
0
0
A
_
_
_
_
1
A
12
a
11
0 I
n1
_
_
x =
_
_
1 0
A
21
a
11
I
n1
_
_
b. (4.3)
Denissons ` a pr esent
x =
_
_
_
_
_
x
1
x
2
.
.
.
x
n
_
_
_
_
_
, y =
_
_
_
_
_
x
2
x
3
.
.
.
x
n
_
_
_
_
_
, b =
_
_
_
_
_
b
1
b
2
.
.
.
b
n
_
_
_
_
_
, c =
_
_
_
_
_
b
2
b
3
.
.
.
b
n
_
_
_
_
_
.
En decomposant (4.3) nous voyons que
x
1
=
1
a
11
(b
1
A
12
y) (4.4)
A y = c
. (4.5)
o` u
c
=
b
1
a
11
A
21
+c. (4.6)
Ces identit es nous m` enent ` a lalgorithme suivant pour calculer x:
Analyse
Soit C
n
le nombre dop erations arithm etiques quil faut ` a cet algorithme pour r esoudre un
syst` eme de n equation ` a n inconnues (donc quand A est une matrice n n). Nous regardons
chaque etape de lalgorithme:
Calcul de
A (ligne 5): Nous savons que
A = A
22
A
21
a
1
11
A
12
(voir (4.2)). A
12
, A
21
et A
22
sont des sous-matrices de A elles sont donc toutes connues. Nous commencons par multiplier
A
12
par a
1
11
, il faudra (n 1) multiplications (puisque A
12
est un vecteur ` a (n 1) entr ees).
Ensuite nous multiplions le r esultat par A
21
, il faudra (n1)
2
multiplications (le r esultat est une
matrice (n 1) (n 1)). Finalement nous soustrayons le r esultat ` a A
22
, il faudra (n 1)
2
soustractions. Le nombre dop eration total est donc
(n 1) + (n 1)
2
+ (n 1)
2
= 2(n 1)
2
+ (n 1)
93
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 20 R ESOUDRE(A, b, n)
1: if n = 1 then
2: x
1
b
1
a
11
3: return (x
1
)
4: else
5: Calculer
A et c
6: y R ESOUDRE(
A, c
, n 1)
(donc trouver y = (x
2
, . . . , x
n
) tel que
A y = c
)
7: s A
12
y
8: x
1
1
a
11
(b
1
s)
9: return (x
1
, x
2
, . . . , x
n
)
10: end if
Calcul de c
=
b
1
a
11
A
21
+ c (void (4.6)). Nous commencons
donc par calculer
b
1
a
11
(1 division). Puis nous multiplions le r esultat par le vecteur A
21
, il faut
n 1 multiplications. Finalement nous ajoutons le r esultat ` a c (n 1 additions). Le nombre
dop eration total est donc
1 + (n 1) + (n 1) = 2(n 1) + 1
Calcul de y (ligne 6): Il faut r esoudre un syst` eme de n 1 equations ` a n 1 inconnues. Nous
utilisons de nouveau le pivot de Gau (cest ici que linduction est utilis ee dans la construction),
il faut donc C
n1
op erations.
Calcul de s (ligne 7): Nous multiplions le vecteur ligne A
12
par le vecteur colonne y, cest un
produit scalaire de vecteurs ` a n 1 entr ees, il faut donc n 1 multiplications et n 2 additions,
un total de 2n 3 op erations.
Calcul de x
1
(ligne 8): Il faut une soustraction et une division, donc 2 op erations.
Nous avons alors:
C
n
= C
n1
+ 2n
2
+n 1
= C
n1
+O(n
2
).
Nous pouvons en d eduire que C
n
= O(n
3
) (exercice).
Remarquons cependant quil est possible que lalgorithme ne puisse pas etre appliqu e de
facon r ecursive puisque la condition a
11
,= 0 nest pas forc ement v eri ee. Il se peut quun
changement de pivot doive etre r ealis e an dobtenir cette condition. On d emontre en alg` ebre
lin eaire que ceci est toujours r ealisable si la matrice A est non-singuli` ere. Il sagit de calculs
auxiliaires qui ne changent pas lordre du temps de calcul.
94
Algorithmique - Semestre dAutomne 2010/2011
4.3 LES ALGORITHMES DIVISER-POUR-R
EGNER
Lid ee des algorithmes diviser-pour-r egner (algorithmes DPR, divide-and-conquer) est de d e-
composer le probl` eme en deux ou plusieurs sous-probl` emes ind ependants qui peuvent ensuite
etre r esolus s epar ement. Les solutions de ces sous-probl` emes sont ensuite assembl ees (cest le
pas de combinaison), de facon ` a obtenir une solution au probl` eme original.
La technique diviser-pour-r egner est tr` es utile. Nous avons d ej` a rencontr e quelques algo-
rithmes de ce type dans ce cours: Les algorithmes de Karatsuba et de Strassen sont des algo-
rithmes DPR. Nous etudierons le paradigme g en eral des algorithmes DPR avant de voir quelques
exemples.
4.3.1 Le paradigme DPR general
Le concept g en eral est le suivant: etant donn e une instance du probl` eme ` a r esoudre, la d ecomposer
en plusieurs plus petites sous-instances (du m eme type), les r esoudre ind ependamment, et ensuite
combiner les solutions des sous-instances pour obtenir une solution du probl` eme original.
Cette description nous am` ene ` a une question importante: comment r esoudre les sous-instan-
ces? La r eponse ` a cette question est primordiale pour les algorithmes DPR et explique en effet
leur puissance. La forme pr ecise dun algorithme DPR est donn ee par:
La taille limite n
0
de linput, qui donne la taille au dessous de laquelle un probl` eme nest plus
divis e.
La taille n/a de sous-instances r esultant de la d ecomposition dune instance.
Le nombre c de telles sous-instances.
Lalgorithme utilis e pour recombiner les solutions des sous-instances.
La forme g en erale dun algorithme DPR sur un input de taille n qui a une taille limite n
0
et
qui divise le probl` eme original en c sous-instances de taille n/a est la suivante:
Algorithme 21 DPR
Input: de taille n
1: if n n
0
then
2: R esoudre le probl` eme sans le sous-diviser
3: else
4: D ecomposer en c sous-instances, chacune de taille n/a;
5: Appliquer lalgorithme r ecursivement ` a chacune des sous-instances;
6: Combiner les c sous-solutions r esultantes pour obtenir la solution du probl` eme original.
7: end if
95
Algorithmique - Semestre dAutomne 2010/2011
Analyse
Pour calculer le temps de parcours de cet algorithme g en erique, nous supposons que le co ut
de la ligne 6 est dn
b
(pour une certaine constante b et une certaine constante d). Soit T(n) le co ut
de lalgorithme sur un input de taille n. Alors pour n n
0
, nous avons
T(an) = cT(n) +dn
b
.
Nous supposons de plus que pour tout n N : T(n) T(n+1). Alors, par le Th eor` eme 2.1
du chapitre 2, nous avons
T(n) =
_
_
O
_
n
log
a
(c)
_
si a
b
< c,
O
_
n
log
a
(c)
log
a
(n)
_
si a
b
= c,
O
_
n
b
_
si a
b
> c.
(4.7)
Le temps de parcours dun algorithme DPR d epend donc de la taille et du nombre de sous-
instances, ainsi que du co ut n ecessaire pour les combiner.
4.3.2 Lalgorithme de Karatsuba
Pour des polyn omes f(x) et g(x) de degr e < n, lalgorithme de Karatsuba retourne le produit
f(x) g(x).
Algorithme 22 KARATSUBA(f(x), g(x))
1: if n = 1 then
2: return f
0
g
0
3: else
4: m n/2
5: f(x) = f
0
(x) +x
m
f
1
(x), g(x) = g
0
(x) +x
m
g
1
(x), deg(f
0
), deg(g
0
) < m
6: h
0
(x) Karatsuba(f
0
(x), g
0
(x))
7: h
2
(x) Karatsuba(f
0
(x) +f
1
(x), g
0
(x) +g
1
(x))
8: h
1
(x) Karatsuba(f
1
(x), g
1
(x))
9: h(x) = h
0
(x) +x
m
(h
2
(x) h
0
(x) h
1
(x)) +x
2m
h
1
(x)
10: return h(x)
11: end if
Analyse
Nous divisons notre probl` emes en sous-probl` emes plus petits jusqu` a ce que n 1 (ligne 1),
et donc n
0
= 1.
Le probl` eme est divis e en 3 sous-instances (lignes 6,7 et 8) donc c = 3.
La taille de chaque sous instance est ` a peu pr` es n/2, donc a = 2 (puisque les polyn omes
utilis es sont de degr e < m avec m = n/2).
96
Algorithmique - Semestre dAutomne 2010/2011
Lalgorithme pour combiner les sous-instances est d ecrit ` a la ligne 9. Son co ut est O(n), et
donc b = 1.
Ainsi, comme a
b
= 2 < c = 3, le co ut de lalgorithme est
O(n
log
2
(3)
).
4.3.3 Recherche binaire
Lalgorithme de recherche binaire que nous avons vu dans le chapitre 0 est aussi un algorithme
DPR. Nous rappelons dabord la d enition du probl` eme de localisation:
Probl` eme: Probl` eme de localisation
Input: Une suite dentiers S
0
< S
1
< < S
n1
, deux indices start
et end, et x Z
Output: Un indice i avec start i < end, et tel que S[i] = x, ou FALSE
si un tel indice nexiste pas
Lid ee de la recherche binaire et de diviser la suite en deux parties ` a peu pr` es de m eme
taille en posant une unique question. Lalgorithme BINSEARCH peut etre d ecrit comme suit en
pseudo-code:
Algorithme 23 BINSEARCH(S, start, end, x)
1: Length end start;
2: if Length = 1 then
3: if S[start] = x then
4: return start
5: else
6: return FALSE
7: end if
8: else
9: middle (end + start)/2;
10: if x < S[middle] then
11: return SEARCH(S, start, middle, x);
12: else
13: return SEARCH(S, middle, end, x);
14: end if
15: end if
Analyse
97
Algorithmique - Semestre dAutomne 2010/2011
Dans ce cas, le probl` eme est divis e en une seule sous-instance, et donc c = 1.
Le co ut de chaque sous-instance est ` a peu pr` es n/2, et donc a = 2.
Le co ut de combiner les sous-solutions est 0, donc b = 0.
Ainsi a
b
= 1 = c, et le co ut de lalgorithme est donc
O
_
n
log
a
(c)
log
a
(n)
_
= O(log(n)).
4.3.4 MergeSort
MERGESORT est un algorithme de tri qui utilise le fait que deux suites tri ees peuvent etre r eunies
(merged) en une seule suite ` a faible co ut. Cet algorithme divise les objets ` a trier en deux groupes,
puis trie chaque groupe et enn les r eunit en une suite nale et tri ee.
Nous commencons par etudier lalgorithme de r eunion.
Algorithme 24 MERGE(S
1
, S
2
)
Input: Suites tri ees S
1
et S
2
de tailles n et m
Output: Suite tri ee S de S
1
S
2
1: i 0, i
1
0, i
2
0
2: while i < n +m do
3: if i
2
= m then
4: S[i] = S
1
[i
1
]
5: i
1
i
1
+ 1
6: else if i
1
= n then
7: S[i] = S
2
[i
2
]
8: i
2
i
2
+ 1
9: else if S
1
[i
1
] < S
2
[i
2
] then
10: S[i] = S
1
[i
1
]
11: i
1
i
1
+ 1
12: else
13: S[i] = S
2
[i
2
]
14: i
2
i
2
+ 1
15: end if
16: i i + 1
17: end while
18: return S
Le nombre de comparaisons de cet algorithme est n+m qui est egal ` a la taille de linput. On
peut se servir de cet algorithme pour construire un algorithme de tri DPR.
Analyse
Le probl` eme est sous-divis e en 2 sous-instances (lignes 6 et 7), et donc c = 2.
Chaque sous-instance est de taille ` a peu pr` es egale n/2, donc a = 2.
98
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 25 MERGESORT(S)
Input: Suite S de n entiers
Output: Version tri ee S
de S
1: if n = 1 then
2: return S
3: else
4: m n/2
5: Soit S
1
la sous-suite de S compos ee des m premiers el ements de S, et S
2
la sous-suite
form ee des autres el ements.
6: S
1
MERGESORT(S
1
)
7: S
2
MERGESORT(S
2
)
8: return MERGE(S
1
, S
2
)
9: end if
Le co ut n ecessaire pour combiner les sous-solutions est le co ut de lop eration MERGE et est
donc egal ` a O(n), do` u b = 1.
Ainsi, a
b
= c, et le co ut de lalgorithme est donc
O
_
n
log
a
(c)
log
a
(n)
_
= O(nlog(n)).
4.3.5 La paire la plus proche
Supposons que nous voulons trouver la distance euclidienne minimale entre des points du plan
R
2
. Nous supposerons de plus que tous nos points ont des coordonn ees x et y diff erentes.
Formellement:
Probl` eme: La paire la plus proche
Input: Un ensemble de n points P
1
, . . . , P
n
dans le plan, avec P
i
=
(x
i
, y
i
) R
2
. Supposons de plus que i ,= j = x
i
,= x
j
et
y
i
,= y
j
.
Output: La distance euclidienne minimale entre deux points distincts de
cet ensemble.
Dans un premier temps, les coordonn ees x des points sont tri ees en ordre croissant. Ensuite,
une valeur x
0
est d etermin ee telle que n/2 des points ont une coordonn ee x plus petite que x
0
tandis que les autres points ont une coordonn ee x plus grande que x
0
. Les deux sous-ensembles
de points sont not es L
1
et L
2
; lalgorithme est appliqu e r ecursivement ` a ces sous-ensembles pour
obtenir les distances minimales
1
et
2
de ces ensembles.
99
Algorithmique - Semestre dAutomne 2010/2011
Il ny a que trois possibilit es en ce qui concerne la paire la plus proche dans lensemble : elle
est soit dans L
1
, soit dans L
2
ou le long de la fronti` ere. Il ne nous reste donc qu` a v erier les
points le long de la fronti` ere.
Nous d eterminons lensemble S de points dont la coordonn ee x est ` a une distance au plus
:= min
1
,
2
de x
0
.
Nous trions les coordonn ees y de ces points et nous parcourons les points dans lordre croissant
de la coordonn ee y. Pour chaque point Q nous mesurons sa distance par rapport ` a tous les points
dans S dont la coordonn ee y est au plus plus grande que la coordonn ee y de Q (tous les autres
points ont une distance ` a Q qui est plus grande que ). Il peut y avoir au plus 5 tels points dans
S, en plus de Q, avec cette propri et e. Voici une conguration de ces points:
Ainsi, pour un point quelconque dans S nous devons calculer au plus 5 distances.
Apr` es avoir trait e tous les points de S de cette mani` ere, nous saurons si la distance minimale
le long de la fronti` ere est plus petite que , et si cest le cas, nous aurons d etermin e la distance
minimale. Les algorithmes de tri des valeurs le long les coordonn ees x et y peuvent etre effectu es
une fois au d ebut des calculs avec co ut O(nlog(n)) (voir le Chapitre 6 pour les algorithmes de
tri).
100
Algorithmique - Semestre dAutomne 2010/2011
Le co ut n ecessaire pour combiner les sous-solutions (calculer la distance minimale le long
de la fronti` ere) est lin eaire en n. Ainsi, le co ut total de lalgorithme est O(nlog(n)).
4.3.6 Carrelage de formes L
Supposons que nous avons un carr e de taille 2
k
2
k
dans lequel nous enlevons un carr e de taille
1 1:
Le probl` eme est de carreler cette structure avec des pi` eces de taille 3 en forme de L:
Nous allons utiliser un algorithme DPR pour cette tache.
Si k = 1 (donc la structure originale est un carr e 2 2 avec un sous-carr e manquant), alors
la solution est triviale:
5
_
1 +
5
2
_
n
+
1
5
_
1
5
2
_
n
,
et comme 0 < (1
i=1
n
j=i
(j i) =
n (n + 1) (2n 2)
12
= (n
3
). (4.10)
La preuve de (4.10) est laiss ee en exercice. Ce temps de parcours est donc bien meilleur que
celui de lalgorithme naf, qui est exponentiel. On obtient au nal:
Exemple: Supposons que nous voulons multiplier les matrices A
1
, . . . , A
6
, de tailles suivantes:
Matrice Taille Matrice Taille
A
1
30 35 A
4
5 10
A
2
35 15 A
5
10 20
A
3
15 5 A
6
20 25
Nous avons donc
p
0
= 30
p
1
= 35
p
2
= 15
p
3
= 5
p
4
= 10
p
5
= 20
p
6
= 25.
106
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 27 MATRIX-CHAIN-ORDER(p)
Input: p = (p
0
, p
1
, . . . , p
n
) d ecrivant les tailles des matrices
Output: Matrices M et S comme d ecrites ci-dessus
1: n length(p) 1
2: for i = 1 . . . n do
3: M[i, i] = 0
4: end for
5: for = 2 . . . n do
6: for i = 1 . . . n + 1 do
7: j i + 1
8: M[i, j] =
9: for k = i . . . j 1 do
10: q M[i, k] +M[k + 1, j] +p
i1
p
k
p
j
11: if q < M[i, j] then
12: M[i, j] q
13: S[i, j] k
14: end if
15: end for
16: end for
17: end for
18: return M et S
Les matrices M et S sont alors:
M =
_
_
_
_
_
_
_
_
0 15750 7875 9375 11875 15125
0 2625 4375 7125 10500
0 750 2500 5375
0 1000 3500
0 5000
0
_
_
_
_
_
_
_
_
S =
_
_
_
_
_
_
_
_
0 1 1 3 3 3
0 2 3 3 3
0 3 3 3
0 4 5
0 5
0
_
_
_
_
_
_
_
_
Par exemple, M[1, 3] et M[2, 5] on et e calcul es en utilisant (4.8) comme suit:
M[1, 3] = min
_
M[1, 2] +M[3, 3] +p
0
p
2
p
3
= 15750 + 0 + 30 15 5 = 18000
M[1, 1] +M[2, 3] +p
0
p
1
p
3
= 0 + 2625 + 30 35 5 = 7875
= 7875
M[2, 5] = min
_
_
_
M[2, 2] +M[3, 5] +p
1
p
2
p
5
= 0 + 2500 + 35 15 20 = 13000
M[2, 3] +M[4, 5] +p
1
p
3
p
5
= 2625 + 1000 + 35 5 20 = 7125
M[2, 4] +M[5, 5] +p
1
p
4
p
5
= 4375 + 0 + 35 10 20 = 11375
= 7125
107
Algorithmique - Semestre dAutomne 2010/2011
Construction dune solution optimale
Nous utilisons la table S[i, j]. Remarquons que S[i, j] = k signie que A
i...j
est construit de
mani` ere optimale ` a partir de A
i...k
et A
k+1...j
.
Exemple: Pour les matrices A
1
, . . . , A
6
ci-dessus, nous obtenons
A
1...6
= ((A
1...3
) (A
4...6
)) [S[1, 6] = 3]
= ((A
1
(A
2
A
3
)) ((A
4
A
5
) A
6
))
[S[1, 3] = 1 et S[4, 6] = 5].
Ainsi
((A
1
(A
2
A
3
)) ((A
4
A
5
) A
6
))
est une disposition de parenth` eses de co ut minimal pour A
1
A
6
.
4.4.2 Le probl`eme LCS
Le probl` eme de la plus longue sous-suite (LCS, Longest Common Subsequence) est un autre
exemple pour lequel la DP est bien adapt ee. Nous introduisons les notations suivantes: Si X =
x
1
, . . . , x
m
) est une suite de longueur m, alors une suite Z = z
1
, . . . , z
k
) est appel ee une sous-
suite de X sil existe des indices 1 i
1
< i
2
< < i
k
m tels que pour tout 1 j k nous
avons
z
j
= x
i
j
.
Exemple: La suite
X = A, B, C, B, D, A, B)
a
Z = B, C, D, B)
comme sous-suite. La suite des indices correspondante est (2, 3, 5, 7).
Une suite Z est appel ee une sous-suite commune de X et Y si Z est ` a la fois sous-suite de X
et de Y . Lensemble des sous-suites communes de X et Y est not e CS(X, Y ). La longueur de
la plus longue sous-suite de X et Y est not ee
lcs(X, Y ),
et lensemble des sous-suites les plus longues de X et Y est not e par
LCS(X, Y ).
Nous nous int eressons aux probl` emes suivants, pour lesquels nous donnerons des solutions
DP:
108
Algorithmique - Semestre dAutomne 2010/2011
Calculer lcs(X, Y )
Construire un el ement de LCS(X, Y )
Nous commencons par donner quelques propri et es de LCS(X, Y ). Soit X = x
1
, . . . , x
m
)
une suite. Pour 1 j m, nous notons par X
j
le pr exe
X
j
:= x
1
, . . . , x
j
).
Th eor` eme 4.2 Soient X = x
1
, . . . , x
m
), Y = y
1
, . . . , y
n
) et soit Z = z
1
. . . , z
k
) LCS(X, Y ).
Alors:
(1) Si x
m
= y
n
, alors z
k
= x
m
= y
n
et Z
k1
LCS(X
m1
, Y
n1
).
(2) Si x
m
,= y
n
, alors z
k
,= x
m
implique Z LCS(X
m1
, Y ).
(3) Si x
m
,= y
n
, alors z
k
,= y
n
implique Z LCS(X, Y
n1
).
Preuve. (1) Si z
k
,= x
m
, alors nous pouvons acoller ` a Z x
m
= y
n
, ce qui donnerait une sous-
suite commune de X et Y de longueur k + 1, mais ceci contredit Z LCS(X, Y ). Donc,
z
k
= x
m
= y
n
et le pr exe Z
k1
est une sous-suite commune de X
m1
et Y
n1
.
Nous montrons ` a pr esent que Z
k1
LCS(X
m1
, Y
n1
). Supposons que W LCS(X
m1
, Y
n1
)
est de longueur k. Alors la juxtaposition
Wx
m
= Wy
n
est une sous-suite commune de X et Y de longueur k + 1, ce qui contredit lcs(X, Y ) = k.
Ainsi X
m1
et Y
n1
nont aucune sous-suite commune de longueur > k 1 et donc Z
k1
LCS(X
m1
, Y
n1
).
(2) Si z
k
,= x
m
, alors Z CS(X
m1
, Y ). Sil existait W LCS(X
m1
, Y ) de longueur
> k, alors W appartiendrait aussi ` a CS(X, Y ), ce qui contredirait lcs(X, Y ) = k.
(3) Sym etrique ` a (2).
Remarquons que dans le cas x
m
,= y
n
au moins lune des afrmations (2) ou (3) est vraie. Le
th eor` eme 4.2 permet un calcul r ecursif de lcs(X, Y ). Soit
c
ij
= lcs(X
i
, Y
j
). (4.11)
Alors le th eor` eme nous dit que
c
ij
=
_
_
_
0 si i = 0 ou j = 0,
c
i1,j1
+ 1 si x
i
= y
j
,
max(c
i,j1
, c
i1,j
) si x
i
,= y
j
.
(4.12)
109
Algorithmique - Semestre dAutomne 2010/2011
Ainsi, comme nous lavons fait dans les algorithmes DP pr ec edants nous pouvons calculer
et stocker les entr ees de la matrice c
ij
ligne par ligne, en utilisant ` a chaque fois les valeurs d ej` a
stock ees. Donc nous pouvons calculer chaque c
ij
avec un co ut constant puisque nous connaitrons
toutes les entr ees de la matrice c n ecessaires dans (4.12). Puisquil y a m n valeurs de c
ij
` a
calculer, le co ut total de lalgorithme sera (m n), et puisque la valeur que nous cherchons est
lentr ee en bas ` a droite de la matrice:
lcs(X, Y ) = c
mn
,
nous aurons bien trouv e la longueur de la plus grande LCS.
Nous pouvons aussi adapter cet algorithme pour quil retourne, en plus de la valeur de
lcs(X, Y ), un el ement de LCS(X, Y ). Pour ce, il nous faut une deuxi` eme matrice b, qui va
indiquer comment a et e obtenu c
ij
` a partir de c
i1,j1
, c
i,j1
, c
i1,j
avec (4.12)
En effet, si x
i
= y
j
alors cet el ement commun sera inclu dans une LCS (nous mettrons alors
b
ij
=
). Sinon si c
i1,j
c
i,j1
alors tout el ement de LCS(X
i
, Y
j
) sera aussi un el ement
de LCS(X
i1
, Y
j
), nous regardons donc lentr ee b
i1,j
(dans ce cas nous mettons b
ij
=
). Fi-
nalement si c
i1,j
< c
i,j1
cest le sym etrique du cas pr ec edant, et nous mettons donc b
ij
=
.
A partir de cette matrice b nous pourrons construire une suite dans LCS(X, Y ) (voir lexemple
ci-dessous pour une matrice b, et comment lutiliser pour trouver un el emet de LCS(X, Y )).
La proc edure suivante, LCS-LENGTH, calcule, pour deux suites X = x
1
, x
2
. . . x
m
) et
Y = y
1
, . . . , y
n
) donn ees, la valeur de lcs(X, Y ) et la matrice b d ecrite ci-dessus.
Exemple: Pour X = A, B, C, B, D, A, B) et Y = B, D, C, A, B, A) nous obtenons le tableau
suivant (les matrices b et c sont superpos ees):
j 0 1 2 3 4 5 6
i y
j
B D C A B A
0 x
i
0 0 0 0 0 0 0
1 A 0 0 0 0 1 1 1
2 B 0 1 1 1 1 2 2
3 C 0 1 1 2 2 2 2
4 B 0 1 1 2 2 3 3
5 D 0 1 2 2 2 3 3
6 A 0 1 2 2 3 3 4
7 B 0 1 2 2 3 4 4
110
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 28 LCS-LENGTH(X, Y )
Input: Suites X et Y
Output: lcs(X, Y ), et une matrice b d ecrivant un moyen de contruire un el ement dans
LCS(X, Y ).
1: m length[X]
2: n length[Y ]
3: for i 1 . . . m do
4: c[i, 0] 0
5: end for
6: for j 0 . . . n do
7: c[0, j] 0
8: end for
9: for i 1 . . . m do
10: for j 1 . . . n do
11: if x
i
= y
j
then
12: c[i, j] c[i 1, j 1] + 1
13: b[i, j]
14: else
15: if c[i 1, j] c[i, j 1] then
16: c[i, j] c[i 1, j]
17: b[i, j]
18: else
19: c[i, j] c[i, j 1]
20: b[i, j]
21: end if
22: end if
23: end for
24: end for
25: return c
mn
and b
111
Algorithmique - Semestre dAutomne 2010/2011
Comme c
mn
= 4 nous avons lcs(X, Y ) = 4. Les ` eches permettent de lire un LCS en
commencant ` a la position (m, n) et en suivant ensuite les ` eches. Pour chaque case
iS
v
i
est maximale, et tel que
iS
w
i
W.
Comment pouvons nous trouver la valeur optimale?
Lalgorithme naf regarderait tous les sous-ensembles de 1, . . . , n et aurait donc un temps
de parcours exponentiel (rappelons que le nombre de sous-ensembles possibles est 2
n
). Nous
pouvons utiliser ici un algorithme DP, car le probl` eme a la propri et e structurelle suivante:
Si nous retirons lobjet j de lensemble optimal, alors lensemble r esultant doit etre optimal
pour le poids maximal W w
j
.
En effet, dans le cas contraire, la solution originale ne serait pas optimale.
Soit c
iw
la valeur de la solution optimale en nutilisant que les objets 1, . . . , i, et si le poids
maximal est w. Nous avons alors
c
iw
=
_
_
_
0 si i = 0 ou w = 0,
c
i1,w
si w
i
> w,
maxv
i
+c
i1,ww
i
, c
i1,w
si i > 0 et w w
i
.
(4.14)
Comme pour les trois probl` emes pr ec edants, nous allons calculer et stocker les entr ees c
iw
ligne par ligne. A chaque fois la valeur de c
iw
sera calcul ee en utilisant (4.14) et les entr ees de c
d ej` a stock ees. Nous obtenons donc lalgorithme suivant:
116
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 30 KNAPSACK(w, v, W)
Input: w = (w
1
, . . . , w
n
), v = (v
1
, . . . , v
n
), W N
Output: Valeur V telle que V = max
iS
v
i
pour tout S 1, . . . , n avec
iS
w
i
W.
1: for w = 0 . . . W do
2: c
0,w
0
3: end for
4: for i = 1 . . . n do
5: c
i,0
0
6: for w = 1 . . . W do
7: if w
i
w then
8: if v
i
+c
i1,ww
i
> c
i1,w
then
9: c
iw
= v
i
+c
i1,ww
i
10: else
11: c
iw
= c
i1,w
12: end if
13: else
14: c
iw
= c
i1,w
15: end if
16: end for
17: end for
18: return c
nW
.
Le temps de parcours de cet algorithme est clairement O(nW) (boucles aux lignes 4 et 6). Il
est donc bien meilleur que lalgorithme naf qui est exponentiel en n.
Exemple: Supposons que notre poids maximal est W = 20, et que nous avons 5 objets avec les
poids et valeurs suivants:
Objet 1 2 3 4 5
Valeur 19 11 10 12 21
Poids 3 6 5 4 12
Le parcours de lalgorithme peut etre d ecrit par le graphique ci-dessous:
117
Algorithmique - Semestre dAutomne 2010/2011
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
0 0 0 19 19 19 19 19 19 30 30 30 30 30 30 30 30 30 30 30 30
0 0 0 19 19 19 19 19 29 40 40 40 40 40 40 40 30 30 30 30 30
0 0 0 19 19 19 19 31 31 31 31 31 41 42 42 42 42 42 52 52 52
0 0 0 19 19 19 19 31 31 31 31 31 41 42 42 42 42 42 52 52 52
Ligne 0 de C
Ligne 1 de C
Ligne 2 de C
Ligne 3 de C
Ligne 4 de C
Ligne 5 de C
Valeur 19, Poids 3
Valeur 11, Poids 6
Valeur 10, Poids 5
Valeur 12, Poids 4
Valeur 21, Poids 12
La valeur maximale est donc 52. Il y a deux ensembles dobjets qui atteignent ce maximum:
(19, 3), (11, 6), (10, 5), (12, 4) et (19, 3), (12, 4), (21, 12)
118
Algorithmique - Semestre dAutomne 2010/2011
4.5 UN ALGORITHME PLUS RAPIDE POUR LE PROBL
`
EME
LCS
Soient X et Y deux suites de longueur n et m respectivement, avec n m. Nous constru-
irons dans cette section un algorithme qui trouve un el ement de LCS(X, Y ) en temps et espace
O(mp), o` u m est la longueur de Y et p = lcs(X, Y ). Rappelons que lalgorithme pour le
probl` eme LCS vu dans la section 4.4.2 avait un temps de parcours O(mn).
Nous commencons par etudier lensemble M = (i, j) [ X
i
= Y
j
de tous les el ements qui
se correspondent dans X et Y .
Exemple: Si X = B, D, C, A, B, A) et Y = A, B, C, B, D, A, B) (Comme pour lexemple
de dans la section 4.4.2), lensemble M peut etre repr esent e par les points dans le diagramme
suivant:
A
B
C
B
D
A
B
3
C
4
A
5
B
6
A i
1
2
3
4
5
6
7
j 1
B
2
D
(suite X)
(suite Y)
Consid erons la relation sur (N N) d enie comme suit:
(k, l) (k
, l
) k < k
l < l
.
Cette relation d enit un ordre partiel sur lensemble M. (Rappelons quun ordre partiel est une
relation transitive et asym etrique.)
Remarque: Comme nest pas un ordre total, il se peut que M ait des el ements non-comparables.
Par exemple, pour (4, 1), (3, 3) M nous navons ni (4, 1) (3, 3), ni (3, 3) (4, 1).
Un sous-ensemble C M ne contenant que des el ements comparables sappelle une chane.
Une antichane A M est un sous-ensemble dans lequel il ny a pas deux el ements qui sont
comparables.
Exemple. Quelques chanes:
119
Algorithmique - Semestre dAutomne 2010/2011
A
B
C
B
D
A
B
3
C
4
A
5
B
6
A i
1
2
3
4
5
6
7
j 1
B
2
D
3
1
2
Il est clair quune chane correspond ` a un el ement dans CS(X, Y ). Ici nous avons
1 = B, D)
2 = B, C, A, B)
3 = A, B, A)
Exemple. Quelques antichanes:
A
B
C
B
D
A
B
3
C
4
A
5
B
6
A i
1
2
3
4
5
6
7
j 1
B
2
D
2
3
1
Notre but est donc de trouver une chane de longueur maximale. Nous regardons dabord
un lien int eressant entre chanes et antichanes. Pour expliquer ce lien, nous avons besoin de
la notion de d ecomposition dun ensemble ni et partiellement ordonn e. Cest un ensemble
dantichanes A
1
, A
2
, . . . , A
k
tel que chaque el ement de M est contenu dans au moins une des
A
i
:
M = A
1
A
k
.
Une d ecomposition minimale est une d ecomposition contenant aussi peu dantichanes que pos-
sible.
120
Algorithmique - Semestre dAutomne 2010/2011
Th eor` eme 4.3 Dans un ensemble ni et partiellement ordonn e M, la longueur p dune chane
maximale est egale ` a la taille dune d ecomposition minimale de M.
Preuve. Soit A
1
, . . . , A
k
une d ecomposition minimale de M, et soit C une chane maximale
avec p el ements. Si k < p, alors il existe c, c
C, c ,= c
, tels que c et c
), alors c et c
2: for k = 1 . . . n do
3: s[k] n + 1
4: A[k]
5: end for
6: for i = 1 . . . m do
7: l mink [ (i, k) M
8: k 1
9: while l n do
10: if l s[k] then
11: A[k] A[k] (i, j) M [ l j s[k]
12: temp s[k]
13: s[k] l
14: l minj [ (i, j) M j > temp
15: end if
16: k k + 1
17: end while
18: end for
19: p maxk [ s[k] n.
20: return (A[1], . . . , A[p]).
124
Algorithmique - Semestre dAutomne 2010/2011
Th eor` eme 4.4 Lalgorithme ci-dessus a un temps de parcours de O(mp), o` u p = lcs(X, Y ).
Preuve. Exercice.
Remarque: Une fois que nous avons trouv e cette d ecomposition minimale (A
1
, . . . , A
p
) de M
nous utilisons le Lemme 1 pour en d eduire une chane de longueur maximale. Nous la constru-
isons de la droite vers la gauche.
Dans lexemple ci-dessus nous commencons par prendre un el ement de A
p
= A
4
, disons (6, 6).
Puis le Lemme nous dit quil existe un el ement (i, j) A
3
avec (i, j) (6, 6), prenons par
exemple (4, 5). Ensuite il nous faut un el ement de A
2
, (prenons (3, 3)) et nalement un el ement
de A
2
(prenons (2, 1)).
Puisque nous lavons construite en commencant ` a droite, notre chaine est
_
(2, 1), (3, 3), (4, 5), (6, 6)
_
,
et donc la sous-suite commune correspondante est
B, C, B, A).
125
5
Algorithmes gloutons
Pour r esoudre certains probl` emes doptimisation, il suft de faire un choix localement optimal ` a
chaque pas de lalgorithme. En effet, dans certain cas, une famille de choix localement optimaux
m` ene ` a une solution globalement optimale. Ce fait est au cur des algorithmes gloutons: un
algorithme glouton fait toujours le choix qui lui semble le meilleur sur le moment. Apr` es l etude
dun exemple typique, nous etudierons les aspects principaux de strat egies glouton. Ces strat e-
gies seront illustr ees ` a laide des exemples du probl` eme de sac ` a dos et du code de Huffman,
utilis e dans la compression des donn ees.
5.1 EXEMPLE: HORAIRES DE SALLES DE COURS
Cet exemple concerne le probl` eme de lordonnancement de plusieurs activit es qui rivalisent pour
lutilisation exclusive dune ressource commune, lobjectif etant de s electionner un ensemble de
taille maximale dactivit es mutuellement compatibles.
Probl` eme: n professeurs veulent utiliser la m eme salle de cours. Chaque professeur a une
pr ef erence pour un intervalle de temps: Le professeur i veut utiliser la salle dans lintervalle
[s
i
, f
i
).
La t ache de lorganisateur est de trouver un plus grand sous-ensemble (c.` a.d. un ensemble de
taille maximale) A de S = 1, . . . , n tel que pour i, j A, i ,= j, on a
[s
i
, f
i
) [s
j
, f
j
) = . (5.1)
La strat egie gloutonne est la suivante:
Nous trions dabord les intervalles selon leur temps darr et f
i
, an davoir
f
1
f
2
f
n
.
On peut faire ce tri en temps O(nlog(n)). Puis lalgorithme op` ere de la mani` ere suivante:
Th eor` eme 5.1 Lalgorithme GREEDYSELECTOR satisfait le nombre maximal de pr ef erences.
126
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 32 GREEDYSELECTOR(s, f)
Call: GREEDYSELECTOR(s, f)
Input: s et f sont des tableaux de longueur n, f
1
f
n
.
Output: Sous-ensemble A de 1, . . . , n v eriant (5.1).
1: n length[s]
2: A 1
3: j 1
4: for i = 2, . . . , n do
5: if s
i
f
j
then
6: A A i
7: j i
8: end if
9: end for
10: return A
Nous donnons maintenant une preuve de ce th eor` eme.
Preuve. Soit S = 1, 2, . . . , n lensemble des indices des pr ef erences. La pr ef erence 1, r ealis ee
par lalgorithme, a le temps darr et le plus t ot f
1
. Nous montrons quil y a une solution optimale
avec le premier choix fait par lalgorithme, que nous appelons choix glouton 1.
Soit A S une solution optimale. Supposons que k A a le temps darret minimal dans
cette solution, i.e., k v erie f
k
f
j
j A. Si k = 1, nous avons ni. Si k > 1, nous pouvons
remplacer A par A
= (A k) 1, comme f
1
f
k
par hypoth` ese. Ainsi, il y a une solution
optimale avec le choix glouton 1 que nous noterons de nouveau avec A.
Apr` es ce choix, nous appliquons la m eme strat egie aux pr ef erences restantes.
S
:= i S [ s
i
f
1
.
Alors, A 1 est une solution optimale pour S
: si la solution optimale B
pour S
est plus
grande que A 1, alors B
EGIE GLOUTONNE
Un algorithme glouton est un algorithme qui maximise son prot ` a chaque etape. Ce nest
pas toujours la bonne m ethode pour r esoudre un probl` eme doptimisation. Exemple: les ux
de trafc! Si chaque conducteur optimise son propre prot ` a chaque point, alors la solution
convergente sera typiquement la pire pour tout le monde.
127
Algorithmique - Semestre dAutomne 2010/2011
Comment peut-on d ecider si un probl` eme doptimisation peut etre r esolu de mani` ere optimale
en utilisant une strat egie gloutonne? Il ny a pas de recette g en eral pour ce faire. N eanmoins, un
algorithme glouton se propose si les propri et es suivantes sont v eri ees:
Strat egie Gloutonne: loptimumglobal peut etre atteint par une suite doptima locaux. Ceci
doit etre prouv e dans chaque cas inviduel.
Sous-structure optimale: un probl` eme doptimisation poss` ede une sous-structure optimale
si une solution optimale est compos ee de solutions optimales de sous-probl` emes.
Cette deuxi` eme propri et e est exploit ee par la programmation dynamique ainsi que la m ethode
gloutonne. Dans lexemple de la section pr ec edente nous avons vu que pour une solution opti-
male A du probl` eme de la salle de cours, si 1 A, alors A
= i S [ s
i
f
i
.
5.3 GLOUTON COMPAR
E
`
A LA PROGRAMMATION DYNA-
MIQUE: LE PROBL
`
EME DU SAC
`
A DOS
Le probl` eme du sac ` a dos 0/1 a et e pr esent e au chapitre pr ec edent. Nous consid erons une version
affaiblie de ce probl` eme: le probl` eme du sac ` a dos rationnel. Supposons que nous ayons
n objets de poids w
1
, w
2
, . . . , w
n
de valeurs v
1
, v
2
, . . . , v
n
,
et un poids maximal W N.
La t ache est de trouver x
i
Q, 0 x
i
1, tel que
n
i=1
x
i
w
i
W et la somme
n
i=1
x
i
v
i
soit maximale. La diff erence entre le probl` eme du sac ` a dos 0/1 et celui du sac ` a dos rationnel
est donc que ce dernier permet dajouter des morceaux dobjets dans le sac ` a dos, tandis dans le
sac ` a dos 0/1, on choisit chaque objet soit en complet, soit pas du tout.
Le probl` eme du sac ` a dos rationnel peut etre r esolu ` a laide dun algorithme glouton:
Pour chaque i nous calculons la valeur relative v
i
/w
i
.
Trier (en un temps O(nlog(n))) les objets selon leurs valeures relatives. Apr` es re-indexation
nous aurons alors
v
1
w
1
v
2
w
2
v
n
w
n
.
128
Algorithmique - Semestre dAutomne 2010/2011
Trouver lincide m avec
m1
i=1
w
i
W <
m
i=1
w
i
.
On inclut alors les objets 1, . . . , m1 compl` etement, et de lobjet m la fraction
m
:=
W
m1
i=1
w
i
w
m
,
Les autres objets sont laiss es en dehors du sac ` a dos. En dautres termes, x
1
= =
x
m1
= 1, x
m
=
m
, et x
m+1
= = x
n
= 0.
Exercice: Prouver que ce choix des x
i
est optimal!
La m eme proc edure ne donne pas n ecessairement une solution optimale du probl` eme de sac
` a dos 0/1. Par exemple, consid erons linstance suivante:
i 1 2 3
w
i
10 20 30
v
i
60 100 120
v
i
/w
i
6 5 4
W = 50.
La solution optimale de cet exemple est donn e par le choix des objet 2 et 3 pour une valeur
totale de 220 et un poids de 50. Une solution incluant lobjet 1, dont la valeur relative est
maximal, ne peut pas etre optimale.
Pourquoi cela? Cest parce que dans le probl` eme du sac ` a dos 0/1, une solution optimale dun
sous-probl` eme ne s etend pas n ecessairement ` a une solution optimale du probl` eme plus grand.
La programmation dynamique prend en compte toutes les solutions des sous-probl` emes, et non
pas seulement les meilleures. Donc, la programmation dynamique fonctionne dans ce cas, alors
que la strat egie glouton echoue.
5.4 CODES DE HUFFMAN
Le codage de Huffman est une technique basique pour la compression sans perte (lossless com-
pression). Par la suite on parlera de code de longueur xe si tous les mots du code ont la m eme
longueur. Si ce nest pas le cas, on dira que le code est de longueur variable.
Exemple: Consid erons un chier w contenant 100000 lettres de lalphabet a, b, c, d, e, f. (I.e.,
w est un mot, appartenant ` a lensemble a, b, c, d, e, f
100000
.) Le mot w doit etre stock e en
repr esentation binaire.
129
Algorithmique - Semestre dAutomne 2010/2011
Si nous utilisons un code de longueur xe, alors nous devrions repr esenter chacune des six
lettres avec trois bits. Par exemple:
a = 000 c = 010 e = 100
b = 001 d = 011 f = 101.
Ceci r esultera en 300000 bits pour une repr esentation binaire de ce chier.
Un code de longueur variable est en g en eral bien meilleur quun code de longueur xe, parce
quil est possible dassigner des suites binaires plus courtes aux lettres qui apparaissent plus
souvent. Pour lutiliser, la fr equence des lettres doit etre connue. (La fr equence dune lettre est
sa probabilit e dapparition. Par exemple, si 25% de toutes les lettres du mot sont des A, alors la
fr equence de A est 0.25.)
Exemple:
Lettre a b c d e f
Fr equence 0.45 0.13 0.12 0.16 0.09 0.05
Repr esentation (code) 0 101 100 111 1101 1100
Ce code a seulement besoin de 224000 bits (45000 1 + 13000 3 + 12000 3 + 16000 3 +
9000 4 +5000 4) et est 25% plus efcace que le code de longueur xe comme d ecrit ci-dessus.
Par la suite, nous verrons une technique (la m ethode de Huffman) qui permettra de trouver
le code de longueur variable le plus efcace pour un alphabet avec fr equences des lettres donn e.
Mais dabord, il faut pr eciser la terminologie. Soit C un alphabet ni.
Un code binaire pour C est une application injective
E: C 0, 1
+
.
Comme d ej` a annonc e, si tous les mots binaires dans limage de E ont la m eme longueur, alors
on dit que le code est un code de longueur xe, sinon cest un code de longueur variable.
Dans cette section, on ecrira c
1
c
2
c
n
le mot de longueur n et de lettres c
i
C. Aussi, si a
et b sont deux mots quelconques, nous notons le mot obtenu en juxtaposant a et b par ab, ` a moins
quil y ait une ambiguit e.
Un codage via E est lapplication (aussi not ee par E) suivante:
E : C
+
0, 1
+
c
1
c
n
E(c
1
) E(c
n
).
Autrement dit, le codage du mot c
1
c
n
se fait en codant chaque lettre c
i
individuellement et en
juxtaposant les mots obtenus.
Si E est injective sur C
+
, alors on dit que E est uniquement d ecodable. Dans ce cas, chaque
mot de code E(c
1
) E(c
n
) poss` ede une unique pr eimage et lapplication
D: E(c
1
) E(c
n
) c
1
c
n
130
Algorithmique - Semestre dAutomne 2010/2011
sappelle un d ecodage pour E.
Un code sans pr exes (prex-code) est un code pour lequel aucun c Image(E) est le pr exe
dun autre el ement dans Image(E). Nous mentionnons le th eor` eme suivant sans preuve.
Th eor` eme 5.2 La compression optimale de donn ees sans perte est toujours possible en utilisant
un code sans pr exes.
Il est possible de repr esenter des codes binaires par des arbres binaires. Lexemple suivant
illustre comment ceci se fait, et le paragraphe suivant donnera ensuite une description pr ecise du
lien entre arbre et code.
Exemple: Code de longueur xe:
1
0.86 0.14
0.14 0.58 0.28
a : 0.45 b : 0.13 c : 0.12 d : 0.16 e : 0.09 f : 0.05
0 0
0
0 0
0
1 1 1
1
1
Larbre ci-dessus repr esente le code de longueur xe pour lalphabet a, b, c, d, e, f vu avant.
Le codage de la lettre a se lit sur les ar etes du chemin racine-a.
Nous avons vu que cet arbre nest pas optimal: le chier w etait plus long que n ecessaire.
Larbre du code de longueur variable de lexemple pr ec edent est repr esent e par larbre suivant:
131
Algorithmique - Semestre dAutomne 2010/2011
1
0.55
0.14
0.25 0.30
a : 0.45
b : 0.13 c : 0.12 d : 0.16
e : 0.09
f : 0.05
0
0
0 0
0
1
1 1
1
1
Nous verrons que ce code est optimal, dans un sens ` a pr eciser.
Mais que veut dire optimal, et comment prouve-t-on quun arbre (ou un code) donn e est
optimal?
Comment trouve-t-on des arbres optimaux, pour alphabet et fr equences donn es?
5.4.1 Codes representes par des arbres binaires
Un arbre binaire etiquet e est un arbre binaire racin e muni dun etiquetage de ses ar etes par 0 et 1
tel que les etiquettes le long des ar etes des descendants sont diff erentes pour chaque sommet.
Soit C un alphabet ni donn e avec les fr equences f(c), c C. Les fr equences sont des nom-
bres r eels entre 0 et 1 dont la somme vaut 1. (Donc, f() d enit une distribution de probabilit es
sur C.)
Un arbre de compression pour C est un arbre binaire etiquet e dont les feuilles sont en cor-
respondance biunivoque avec les el ements de lalphabet et dont les sommets ont des poids. Le
poids dune feuille est la fr equence de l el ement associ e dans lalphabet. Le poids dun sommet
interne est la somme des poids de tous ses descendants directs.
Le code associ e ` a un arbre de compression est lensemble de toutes les suites binaires obtenu
en juxtaposant les etiquettes des ar etes pour chaque chemin de la racine ` a une feuille.
Th eor` eme 5.3 Le code associ e ` a un arbre de compression est un code sans pr exes.
132
Algorithmique - Semestre dAutomne 2010/2011
Soit d
B
(c) la profondeur de l el ement c de lalphabet dans larbre de compression B. Alors
d
B
(c) est la longueur du mot de code associ e ` a c. La longueur moyenne dun mot de code est
alors
A(B) :=
cC
f(c)d
B
(c)
si lon choisit les lettres ` a encoder selon la loi f(c), i.e. une lettre c x ee est choisie avec proba-
bilit e f(c). La longueur moyenne A(B) est aussi appel ee le co ut de larbre de compression.
Un arbre de compression est optimal si son co ut est minimal pour lalphabet C et les fr equences
f(c), c C.
5.4.2 Le codage de Human
Le codage de Huffman est une m ethode de construction dun arbre de compression optimal pour
un alphabet avec des fr equences donn ees. Cette m ethode a et e invent ee par David Huffman en
1952 alors quil etait encore etudiant.
Cette m ethode construit larbre optimal de bas en haut (bottom-up), et cest un algorithme
glouton. Nous introduirons dabord cette construction. Ensuite nous prouverons loptimalit e de
la construction. Puis nous discuterons des structures de donn ees adapt ees ` a une impl ementation
de cet algorithme.
La technique de base:
1. Commencer avec autant darbres quil y a d el ements dans lalphabet: Associer aux arbres
(avec une seule feuille) l el ement correspondant de lalphabet et sa fr equence.
2. Tant quil y a plus dun arbre:
i. Trouver deux arbres de fr equence minimale.
ii. Combiner les arbres en un, en utilisant lun des arbres comme sous-arbre gauche et
lautre comme sous-arbre droit. Etiquetter le sous-arbre gauche avec 0, et le sous-arbre
droit avec 1. Etiquetter la racine du nouvel arbre avec la somme des co uts des deux
sous-arbres.
5.4.3 Implementation de lalgorithme de codage de Human
Nous utiliserons une queue ` a priorit e Qpour cette t ache. Qcontiendra les el ements de lalphabet
ainsi que leurs fr equences, (c, f(c)). Les el ements sont ordonn es par fr equence, de la plus petite
` a la plus grande.
La queue aura une fonction deletemin qui efface l el ement avec la plus petite fr equence.
La meilleure facon dimpl ementer cette structure de donn ees est dutiliser un binary heap. Nous
133
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 33 HUFFMAN(C, f)
Input: Un ensemble de caract` eres C de taille n = [C[. (Q est une queue ` a priorit e ordonn ee par
fr equence, initialement vide.)
Output: Arbre de compression Huffman T pour linput.
1: for c C do
2: Enqueue ((c, f(c)), Q).
3: end for
4: for i = 1, . . . , n 1 do
5: Cr eer un nouveau sommet z
6: left child = deletemin(Q)
7: right child = deletemin(Q)
8: f(z) = f(left child) +f(right child)
9: Les ls de z deviennent left child et right child
10: Enqueue ((z, f(z)), Q).
11: end for
verrons cette structure dans le chapitre suivant, dans lequel nous etudierons des algorithmes de
tri.
Le co ut de cet algorithme est egal au co ut des 2(n 1) deletemins et des n enqueue.
Si Q est implement ee par un binary heap, ces op erations co utent O(log(n)), le co ut total de
lalgorithme sera alors egal ` a O(nlog(n)).
Nous verrons des binary heaps dans le chapitre suivant, dans lequel nous etudierons des al-
gorithmes de tri.
Exemple: Voici comment lalgorithme op` ere sur lexemple pr esent e en d ebut de section:
1. Mise en place de Q:
d:0.16 a:0.45 f:0.05 e:0.09 c:0.12 b:0.13
134
Algorithmique - Semestre dAutomne 2010/2011
2. i = 1 avec f(z) = 0.14:
1 0
d:0.16 a:0.45
e:0.09 f:0.05
0.14
b:0.13 c:0.12
3. i = 2 avec f(z) = 0.25:
0
1
0 1
0.14
f:0.05 e:0.09
d:0.16
0.25
c:0.12 b:0.13
a:0.45
4. i = 3 avec f(z) = 0.30:
0
0
1
0 1
a:0.45
1
0.25
c:0.12 b:0.13
0.30
0.14
f:0.05 e:0.09
d:0.16
135
Algorithmique - Semestre dAutomne 2010/2011
5. i = 4 avec f(z) = 0.55:
0
0
c:0.12
1
1
1
d:0.16
0
1
0
f:0.05 e:0.09
0.14 b:0.13
0.30
0.55
0.25
a:0.45
6. i = 5 avec f(z) = 1:
0 1
0 1
0
1
c:0.12
0 1
d:0.16 0.14
0
1
e:0.09 f:0.05
b:0.13
0.25
0.55
a:0.45
1
0.30
136
Algorithmique - Semestre dAutomne 2010/2011
5.4.4 Optimalite de lalgorithme de codage de Human
Nous voulons montrer que larbre de compression Huffman obtenu avec une paire (C, f) o` u C
est un alphabet ni et f est une distribution de probabilit e a un co ut optimal.
Soit x l el ement de C qui a la plus petite fr equence et y l el ement de C qui a la seconde plus
petite fr equence. Nous montrons dans un premier temps quil existe un arbre de compression
optimal dans lequel x et y ont le m eme parent.
Soit T un arbre de compression optimal. Notons que T peut etre transform e en un arbre op-
timal T
1
dans lequel x a une profondeur maximale : si x na pas d ej` a une profondeur maximale
dans T, il existe un el ement a dans T qui a une profondeur maximale et d(a) > d(x). Par hy-
poth` ese f(x) f(a). En interchangeant x et a dans T, on obtient un autre arbre de compression
T
1
. On a
A(T) A(T
1
) = (f(a) f(x))(d(a) d(x)
. .
>0
) 0.
On constate que f(a) = f(x) et que A(T) = A(T
1
). Ensuite, nous montrons que x a un fr` ere z
dans T
1
. Dans le cas contraire, x peut etre mont e et a une profondeur plus petite, et donc r eduit
le co ut de T
1
, ce qui contredit loptimalit e de T
1
. Notons que par hypoth` ese sur y, nous avons
f(z) f(y). En interchangeant z et y, on obtient un autre arbre de compression T
2
. Nous avons
A(T
1
) A(T
2
) = (f(z) f(y))(d(z) d(y)) 0.
Comme d(z) d(y) (Notons que d(z) est la profondeur maximale dans T
1
), nous voyons que
A(T
1
) = A(T
2
). Finalement, on a construit un arbre de compression optimal dans lequel x et y
ont le m eme parent.
T
x
y
a z
T
1
x
y
a
z
T
2
x y
a
z
Pour montrer que larbre de Huffman est un arbre de compression optimal pour (C, f), nous
proc edons par induction sur n, le nombre de caract` eres dans C. Si [C[ = 2, il ny a rien ` a
montrer.
137
Algorithmique - Semestre dAutomne 2010/2011
Supposons maintenant que [C[ > 2. Soit le nouvel alphabet C = C x, y z, qui
contient [C[ 1 el ements et o` u f(z) = f(x) +f(y). Par hypoth` ese dinduction, lalgorithme de
Huffman construit un arbre de compression optimal T pour C. Supposons que le co ut de larbre
de Huffman sur C nest pas optimal, et soit T
1
un arbre de compression optimal pour C dans
lequel x et y ont le m eme parent (un tel arbre existe par la preuve ci-dessus). Comme x et y ont
le m eme p` ere dans T, on a
A(T) = A(T) d(z)(f(x) +f(y)) + (d(z) + 1)(f(x) +f(y))
= A(T) +f(x) +f(y).
De la m eme mani` ere, A(T
1
) = A(T
1
) +f(x) +f(y), o` u T
1
est obtenu de T
1
en enlevant x et y
et en donnant ` a lanc etre commun de x et y la valeur f(x) +f(y). Comme, par induction, A(T)
est optimal, on a
A(T) = A(T) +f(x) +f(y)
A(T
1
) +f(x) +f(y)
= A(T
1
).
Par optimalit e de T
1
, on voit que A(T) = A(T
1
), et donc T est un arbre de compression optimal.
138
6
Algorithmes de tri
On estime que plus de 25% du temps de calcul utilis e commercialement est pass e pour faire des
tris (sorting). Le d eveloppement de m ethodes de tri puissantes est donc tr` es utile et important.
Quest-ce que trier, et que signie etre efcace dans ce contexte? Le probl` eme du tri
peut etre enonc e de mani` ere pr ecise comme suit:
Probl` eme: Tri
Input: Des objets s
0
, . . . , s
N1
, dont chacun est muni dune cl e k
i
appar-
tenant ` a un ensemble totalement ordonn e (par exemple (Z, )).
Output: Permutation de 0, . . . , N 1 telle que k
(0)
k
(1)
k
(N1)
.
Nous d evelopperons des algorithmes de tri qui nutilisent que des comparaisons entre les
cl es. Nos algorithmes modieront linput an dobtenir un output pour lequel les cl es seront
tri ees dans lordre croissant.
De mani` ere g en erale, on distingue les algorithmes de tri internes et externes:
Les algorithmes de tri internes supposent que lacc` es al eatoire ` a chaque el ement est pos-
sible avec le m eme co ut. Cest le cas si les donn ees sont toutes stock ees dans la m emoire
vive.
Les algorithmes de tri externes supposent que objets sont stock es sur des m edia ext erieurs
et quils ne peuvent pas etre acc ed es avec le m eme temps.
Dans ce chapitre, nous regarderons uniquement des algorithmes de tri internes.
Nous supposons que les cl es sont des nombres entiers, et que les objets sont stock es dans un
tableau (array). Nous pouvons repr esenter les objets eux-m emes (que nous appelons aussi des
el ements) avec la structure
139
Algorithmique - Semestre dAutomne 2010/2011
typedef struct {
int key;
Payload P;
} element;
et nos objets sont stock es dans un tableau
element a[N];
6.1 ALGORITHMES
EL
EMENTAIRES
Dans cette section nous etudierons quatre algorithmes de tri :
Selection Sort
Insertion Sort
Shell Sort
Bubble Sort
Quand nous mesurons les temps de parcours de ces algorithmes nous regardons deux pro-
pri et es:
Le nombre de comparaisons de cl es C
Le nombre de mouvements M (d eplacements)
Dans les deux cas nous nous int eressons au meilleur des cas, au pire des cas et au comporte-
ment moyen. Typiquement, il faut aux m ethodes d ecrites dans cette section O(N
2
) comparaisons
de cl es pour trier N objets dans le pire des cas.
Remarque: Techniquement, un mouvement consiste ` a copier un el ement dun endroit vers un
autre (par exemple dune position dans le tableau a vers une position en m emoire). Cependant, la
plupart des algorithmes dans ce chapitre font exclusivement des echanges d el ements ( echanger
l el ement ` a la position a[i] avec celui ` a la position a[j]).
Formellement, pour faire un echange il faut 3 mouvements (on copie le contenu de a[i] vers une
position temporaire t en m emoire, on copie le contenu de a[j] vers a[i], et on copie nalement t
vers a[j]).
Cependant, nous compterons un echange comme un seul mouvement. En effet nous nous int eressons
surtout au comportement asymptotique des algorithmes (donc avec la notation O), et celui-ci
reste le m eme si le nombre de mouvements est multipli e par une constante.
140
Algorithmique - Semestre dAutomne 2010/2011
Soient C
min
(N), C
max
(N) et C
avg
(N) le nombre de comparaisons quutilise un algorithme
dans le meilleur cas, le pire des cas, et le cas moyen, respectivement. Par cas moyen, on entend
le comportement de lalgorithme en moyenne, en supposant que chaque permutation possible de
linput a la m eme probabilit e. C
avg
(N) est donc lesp erance du nombre de comparaisons.
De m eme, nous notons par M
min
(N), M
max
(N), et M
avg
(N) le nombre de mouvements
effectu es par un algorithme dans le meilleur cas, le pire des cas, et le cas moyen. (Nous rappelons
quun echange de deux el ements est consid er e comme un seul mouvement.)
Remarques:
(1) Quand nous parlons du temps de parcours dun algorithme de tri nous voulons en
g en eral dire la somme du nombre de mouvements et du nombre de comparaisons dont il a
besoin.
(2) Soit a[0], . . . , a[N 1] le tableau contenant nos objets. Nous abuserons parfois de la
notation en disant par exemple que l el ement a[i] est plus petit que l el ement a[j] (alors que
formellement il faudrait dire que la cl e de l el ement a[i] est plus petite que la cl e l el ement
a[j]).
(3) Soit a[0], . . . , a[N 1] le tableau contenant nos objets. Quand nous parlons du premier
el ement du tableau (ou de la suite) nous voulons dire a[0], quand nous parlons du deuxi` eme
el ement nous voulons dire a[1]. Donc de la m eme mani` ere quand nous parlons du i
` eme
el ement de la suite nous voulons dire a[i 1].
Dans tout le chapitre nous posons les hypoth` eses suivantes:
Les cl es sont les nombres 1, . . . , N.
Quand nous condid erons le comportement moyen de nos algorithmes, nous supposons que
les N! permutations possibles des cl es ont toutes la m eme probabilit e.
6.1.1 Selection Sort
Lid ee de cet algorithme est de trier une suite en d eterminant son plus petit el ement, puis son
deuxi` eme plus petit el ement, puis son troisi` eme plus petit, etc.
Plus pr ecis ement: Trouver la position j
0
du plus petit el ement dans la suite puis echanger a[0]
et a[j
0
]. Ensuite, d eterminer la position j
1
du plus petit l el ement parmi a[1], . . . , a[N 1], et
echanger a[1] et a[j
1
]. Nous continuons de cette mani` ere jusqu` a ce que tous les el ements soient
` a la bonne position.
141
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 34 SELECTIONSORT(a)
Input: Suite a d el ements avec des cl es enti` eres.
Output: Transformation de a telle que a[i].key a[i + 1].key pour 0 i < N 1
1: for i = 0, . . . , N 2 do
2: min i
3: for j = i + 1, . . . , N 1 do
4: if a[j].key < a[min].key then
5: min j
6: end if
7: end for
8: if min ,= i then
9: Echanger a[min] et a[i]
10: end if
11: end for
Analyse
Nombre de comparaisons: Pour trouver le plus petit el ement parmi possibilit es, il faut tou-
jours faire 1 comparaisons. Donc:
C
max
(N) = C
min
(N) = C
avg
(N) =
N2
i=0
(N 1 i) =
N(N 1)
2
= O(N
2
).
Nombre de mouvements: Nous rappelons dabord que les N! permutations possibles des cl es
ont toutes la m eme probabilit e. Donc chacun des nombres k, 1 k N apparat ` a une position
donn ee i avec probabilit e 1/N .
On obtient:
M
max
(N) = N 1.
M
min
(N) = 0 (la ligne 9 de lalgorithme neffectue l echange
que sil est n ecessaire).
M
avg
(N) =
N1
N
+
N2
N1
+ +
1
2
= N ln(N) (1) (exercice).
Exemple:
142
Algorithmique - Semestre dAutomne 2010/2011
Position
15 2 43 17 4 7 47
15 43 17 4 7 47
43 17 15 7 47
2 4 7 15
4 2
4 2
2 4 7 15 17 43
17
17 43 47
47 43 17
43 47
7 15
15 7
47
0 1 3 4 5 6
2 4
2
2
Est-il possible de rendre lalgorithme plus efcace en choisissant une meilleure m ethode pour
le calcul du minimum ` a chaque etape?
Th eor` eme 6.1 Nimporte quel algorithme pour le calcul du minimum de i cl es utilise au moins
i 1 comparaisons (si seulement des comparaisons de cl es sont admises).
Preuve (esquisse). On dessine le graphe qui a pour chacune des i entr ees un sommet, et qui a une
ar ete entre chaque paire de sommets qui sont compar es. Par la formule dEuler pour les arbres
(c.f. section 1.3.1), si on effectue moins que i 1 comparaisons, ce graphe nest pas connexe.
Mais alors une composante peut etre strictement plus grande que lautre ou aussi strictement plus
petite, sans inuence sur les r esultats des comparaisons.
Mais le minimum se trouvera alors forc ement dans des composantes diff erentes dans ces deux
cas. Il sen suit que dans un de ces cas au moins, loutput de lalgorithme sera faux.
6.1.2 Insertion Sort
Algorithme de base
Lid ee est dins erer les el ements un par un dans une suite tri ee. En ins erant a[i], il faut sassurer
que la suite a[0], . . . , a[i 1] est d ej` a tri ee et ins erer a[i] ` a la bonne position.
Cet algorithme peut etre vu comme la m ethode utilis ee par un joueur de cartes qui place avec
la main droite les cartes distribu ees, une ` a une, dans sa main gauche, en placant au bon endroit
chaque carte dans les cartes d ej` a tri ees quil tient dans la main gauche.
Exemple
143
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 35 INSERTIONSORT(a)
Input: Suite a dobjets avec des cl es enti` eres.
Output: Transformation de a telle que a[i].key a[i + 1].key pour 0 i < N 1
1: for i = 1, . . . , N 1 do
2: j i 1
3: t a[i]
4: while a[j].key > t.key and j 0 do
5: a[j + 1] a[j]
6: j j 1
7: end while
8: a[j + 1] t
9: end for
2
15
2 15
2 4 15 17 43
43 17 15 7 4 2
2 4 7 15 17 43 47
17 43
2 15
15
43
47
47 7
7 4
4 7 47
47
17
17 43
43 2 4 17 7
4 7 47
47
Position 0 1 2 3 4 5 6
Analyse
Nombre de comparaisons: Pour trouver ` a quelle position ajouter le i
` eme
el ement a[i 1] dans
a[0], . . . , a[i 2], nous avons au moins 1 et au plus i 1 comparaisons ` a faire. On a donc
C
max
(N) =
N
i=2
(i 1) = O(N
2
)
C
min
(N) = N 1.
Il est aussi possible de montrer que
C
avg
(N) = O(N
2
).
Nombre de mouvements: Pour ins erer le i
` eme
el ement a[i 1] dans a[0], . . . , a[i 2] nous avons
144
Algorithmique - Semestre dAutomne 2010/2011
au moins 2 et au plus 2 + (i 1) mouvements ` a effectuer (pourquoi?). Donc
M
max
(N) = 2(N 1) +
N
i=2
(i 1) = O(N
2
)
M
min
(N) = 2(N 1),
et il est aussi possible de montrer que
M
avg
(N) = O(N
2
).
Binary Insertion Sort
Dans la version de base de INSERTIONSORT, lalgorithme fait une recherche lin eaire pour trou-
ver dans a[0], . . . , a[i1] la position ` a laquelle a[i] doit etre ins er e. Cependant puisque a[0], . . . , a[i
1] est tri ee, nous pouvons aussi utiliser lalgorithme de recherche binaire (ce qui r eduit le nombre
de comparaisons n ecessaires, mais pas le nombre de mouvements).
Dans ce qui suit, nous supposons que la proc edure BINSEARCH(b, x) retourne, etant donn e
une suite tri ee b de longueur N, la position j ` a laquelle il faudrait ins erer x pour que b reste tri ee.
Plus formellement, loutput j doit v erier lune des 3 propri et es suivantes:
j ,= 0, N et b[j 1].key < x.key b[j].key.
j = 0 et x.key b[0].key.
j = N et b[N 1] < x.key.
Par ins erer x ` a la position j, nous entendons copier a[i] vers a[i + 1] pour tout i = N
1, . . . , j, puis copier x vers a[j + 1].
Algorithme 36 INSERTIONSORTBIN(a)
Input: Suite a d el ements avec des cl es enti` eres.
Output: Transformation de a telle que a[i].key a[i + 1].key pour 0 i < N 1
1: Poser a
(0)
:= (a[0])
2: for i = 1, . . . , N 1 do
3: Poser j BINSEARCH(a
(i1)
, a[i])
4: Ins erer a[i] dans a
(i1)
` a la position j, et appeler la suite r esultante a
(i)
5: end for
Analyse
Nombre de comparaisons: Nous supposons que toutes les cl es dans la suite sont distinctes. Pour
ins erer a[i] dans la suite a
(i1)
, il nous faut faire une recherche binaire. Le nombre minimum de
145
Algorithmique - Semestre dAutomne 2010/2011
comparaisons pour ins erer a[i] est donc log
2
(i). Le nombre maximum de comparaisons est
log
2
(i). Donc
C
min
(N) =
N1
i=1
log
2
(i)
log
2
((N 1)!)
= O(N log(N)).
Pour des N arbitrairement grands, il existe des suites qui atteignent cette borne. De la m eme
facon, poue le nombre maximal de comparaison on a
C
max
(N) = O(N log(N)).
Le nombre moyen de comparaisons de lalgorithme de recherche binaire est O(log(N)).
Ainsi:
C
avg
(N) = O(N log(N)).
Nombre de mouvements: Le nombre de mouvements ne change pas avec BINSEARCH. Les
calculs restent donc les m emes que pour la version de base de INSERTIONSORT.
6.1.3 Shell Sort
Cet algorithme de tri a et e d evelopp e en 1959 par D.L. Shell. La d enition suivante est la base
de SHELLSORT.
D enition. Soit 0 < N. On dit quune suite de cl es k
0
, . . . , k
N1
est -tri ee si pour tout
0 i < N on a k
i
k
i+
.
En particulier, une suite tri ee est donc la m eme chose quune suite 1-tri ee.
Lid ee est de choisir une suite dincr ements h
t
> h
t1
> > h
1
= 1, et dutiliser INSER-
TIONSORT pour transformer la suite originale en une suite h
t
-tri ee S
t
, puis dutiliser de nouveau
INSERTIONSORT pour tranformer S
t
en une suite h
t1
-tri ee S
t1
, etc, pour nalement obtenir
une suite h
1
-tri ee (donc tri ee) S
1
. Un bon choix dincr ements diminue le nombre de mouvements
n ecessaires par rapport ` a INSERTIONSORT.
Exemple
146
Algorithmique - Semestre dAutomne 2010/2011
2 15 43 4 7 47
3
2
1
osition P
h
h
h
47 7 4 17 43 2 15
7 2 43 17 4 15 47
47 43 4 17 15 2 7
17
=5
=3
=1
0 1 2 3 4 5 6
Quand h
3
= 5, on consid` ere les sous-suites suivantes obtenues par incr ement de 5:
15 7
InsertionSort
. . . 7 15
2 47
InsertionSort
. . . 2 47
43
17
4
Puis on remplace dans leur position originale les sous-suites tri ees:
7 2 43 17 4 15 47
Puis h
3
= 3 et on consid` ere les sous-suites suivantes obtenues par incr ement de 3:
7 17 47
InsertionSort
. . . 7 17 47
2 4
InsertionSort
. . . 2 4
43 15
InsertionSort
. . . 15 43
A nouveau, on remplace dans leur position originale les sous-suites tri ees:
7 2 15 17 4 43 47
Le cas h
1
= 1 revient ` a trier, avec INSERTIONSORT, la suite enti` ere.
Dans cet exemple, le nombre de mouvements est 6, par opposition aux 8 mouvements n ecessaires
si lon utilise le tri par insertion.
Analyse
La partie la plus importante est de trouver le meilleur choix des incr ements pour que le
nombre de mouvements aussi petit que possible. Une r eponse compl` ete ` a cette question nest
toujours pas connue. On peut cependant d emontrer les faits suivants:
147
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 37 SHELLSORT(a, h)
Input: Suite a d el ements avec des cl es enti` eres, suite dincr ements h
t
> h
t1
> > h
1
= 1.
Output: Transformation de a telle que a[i].key a[i + 1].key pour 0 i < N 1
1: for k = t, . . . , 1 do
2: h h
k
3: for i = h, . . . , N 1 do
4: v a[i]
5: j i
6: while j h and a[j h].key > v.key do
7: a[j] a[j h]
8: j j h
9: end while
10: a[j] v
11: end for
12: end for
Si une suite est k-tri ee et lalgorithme ci-dessus produit une suite h-tri ee pour h < k, alors
la nouvelle suite reste k-tri ee.
Si une suite de longueur N est 2-tri ee et 3-tri ee, alors on peut la trier avec un passage de
INSERTIONSORT en utilisant N comparaisons.
Pour tout n 1, si une suite de longueur N est 2n-tri ee et 3n-tri ee, alors la suite peut etre
n-tri ee en un passage de INSERTIONSORT en utilisant N comparaisons.
Soit 1 = h
1
< h
2
< h
3
< la suite contenant tous les entiers de la forme 2
a
3
b
pour
a, b 0. Le temps de parcours de lalgorithme SHELLSORT avec cette suite dincr ements
est O(N(log N)
2
) (nombre de comparaisons et de mouvements dans le pire des cas)
6.1.4 Bubble Sort
Lid ee de BUBBLESORT est tr` es simple: Lalgorithme proc` ede par etapes, o` u ` a chaque etape
nous parcourons la suite et comparons les el ements adjacents. Nous les echangeons sils ne
sont pas dans le bon ordre. Nous continuons ces etapes jusqu` a ce quil ny ait plus d echanges
n ecessaires.
Apr` es la premi` ere etape (aussi appel e premier passage), a[N1] est l el ement maximal de la
suite. Apr` es le deuxi` eme passage, a[N2] est l el ement maximal parmi a[0], . . . , a[N2] (donc
le 2
` eme
plus grand el ement de la suite). De m eme, apr` es la i
` eme
etape, a[N i] est l el ement
maximal parmi a[0], . . . , a[N i] (donc le i
` eme
plus grand el ement de la suite).
Donc apr` es l etape i, l el ement maximal parmi a[0], . . . , a[N i] a et e d eplac e jusqu` a la n
de cette suite (` a la position a[N i]); Comme une bulle qui monte ` a la surface de leau (et donc
le nom bubble sort).
148
Algorithmique - Semestre dAutomne 2010/2011
Exemple
Position 0 1 2 3 4 5 6
1
er
pass. 15 2 43 17 4 7 47
2 15 43 17 4 7 47
2 15 17 43 4 7 47
2 15 17 4 43 7 47
2 15 17 4 7 43 47
2
` eme
pass. 2 15 17 4 7 43 47
2 15 4 17 7 43 47
2 15 4 7 17 43 47
3
` eme
pass. 2 15 4 7 17 43 47
2 4 15 7 17 43 47
2 4 7 15 17 43 47
R esultat 2 4 7 15 17 43 47
Algorithme 38 BUBBLESORT(a)
Input: Suite a d el ements avec des cl es enti` eres.
Output: Transformation de a telle que a[i].key a[i + 1].key pour 0 i < N 1
1: Continue TRUE
2: r N 1;
3: while Continue est TRUE do
4: Continue FALSE
5: for i = 0, . . . , r 1 do
6: if a[i].key > a[i + 1].key then
7: Swap a[i] and a[i + 1]
8: Continue TRUE;
9: end if
10: end for
11: r r 1
12: end while
Analyse
Meilleur cas: N 1 comparaisons et pas de mouvements (si la suite est d ej` a tr ee).
C
min
(N) = N 1
M
min
(N) = 0.
149
Algorithmique - Semestre dAutomne 2010/2011
Pire des cas: Quand la suite est tri ee de facon d ecroissante (pourquoi?).
C
max
(N) =
N(N 1)
2
= O(N
2
),
M
max
(N) =
N
i=1
(i 1) = O(N
2
).
Cas moyen: On peut montrer (plus difcilement) que
C
avg
(N) = M
avg
(N) = O(N
2
).
Nous terminons ici notre discussion des algorithmes de tri el ementaires. Nous etudions main-
tenant des algorithmes de tri plus sophistiqu es avec des temps de parcours bien meilleurs.
150
Algorithmique - Semestre dAutomne 2010/2011
6.2 QUICKSORT
Lalgorithme QUICKSORT a et e invent e en 1962 par C.A.R. Hoare. Le nom quicksort est d u
au fait que cest lun des algorithmes de tri les plus rapides connus.
Dans des applications typiques de tri, les el ements associ es aux cl es peuvent etre tr` es grands.
Par exemple, il pourrait sagir dun site web form e de beaucoup dimages, de chiers de son et
de vid eo, etc. Donc, la quantit e de m emoire associ ee ` a un el ement est une ressource pr ecieuse
quil ne faut pas gaspiller. Nous appelons ce type de m emoire du m emoire el ement pour
pouvoir distinguer ce type de m emoire de celui quutilise un programme pour fonctionner. Nous
disons quun algorithme est in-place sil utilise seulement une quantit e de m emoire el ement
suppl ementaire O(1). QUICKSORT est un algorithme in-place et diviser-pour-r egner. Dans le
pire des cas son temps de parcours est O(N
2
) pour trier une suite de longueur N (donc pas
meilleur que les algorithmes de la section pr ec edante), mais son temps de parcours en moyenne
est
O(N log(N)).
Lid ee est de choisir un el ement arbitraire b appel e le pivot dans la suite a[0], . . . , a[N 1] et
de diviser la suite en deux sous-suites S
1
et S
2
avec les propri et es suivantes:
S
1
contient les el ements a[i] avec
a[i].key b.key,
S
2
contient les a[i] avec
a[i].key > b.key.
Lalgorithme QUICKSORT est ensuite appliqu e r ecursivement ` a ces deux sous suites.
Comment pouvons-nous construire une version in-place de cet algorithme?
Une sous-suite de la suite originale est sp eci ee de facon unique par deux indices (a[]
est l el ement le plus ` a gauche) et r (a[r 1] est l el ement le plus ` a droite). A chaque appel
r ecursif de QUICKSORT nous appelons la routine en sp eciant et r. L etape la plus importante
de limpl ementation de cet algorithme est la subdivision en sous-suites.
Ici: L el ement pivot est le dernier el ement de la suite, donc a[r 1].
Nous prenons deux pointeurs p et q; Au d ebut p pointe vers l el ement a[r 1] et q vers
l el ement a[]. p se d eplace vers la gauche jusqu` a ce quil trouve un el ement plus petit que
a[r 1] (le pivot); de la m eme facon, q se d eplace vers la droite jusqu` a ce quil trouve un
el ement plus grand que a[r 1] (le pivot). Les contenus de a[p] et a[q] sont echang es, et le
processus est r ep et e jusqu` a ce que p < q. Puis a[r 1] et a[q] sont echang es.
Exemple (de l etape de subdivision)
151
Algorithmique - Semestre dAutomne 2010/2011
Position ... 4 5 6 7 8 9 ...
5 7 3 1 6 4
Pivot
i j
...
1. i j
1 7 3 5 6 4
2. i
j
1 7 3 5 6 4
3. i j
1 7 3 5 6 4
...
...
...
...
...
...
...
Donc ici = 4 et r = 10 (attention, la suite qui nous int eresse est a[], a[ + 1], . . . , a[r 1],
soit r el ements). Le pivot est a[r 1], donc dans notre exemple on a pivot = a[9] = 4. Au
d epart p pointe vers a[r 1] (donc ici a[9]), et q vers a[] (donc ici a[4]).
Nous comparons a[p] avec le pivot et voyons que pivot a[p] (4 4), donc nous continuons
avec p.
Nous d eplacons p vers la gauche (donc maintenant p = 8) et comparons a[p] avec le pivot.
Puisque pivot a[p] (4 6) nous continuons avec p.
Nous d eplacons p vers la gauche (donc maintenant p = 7) et comparons a[p] avec le pivot.
Cette fois nous avons a[p] < pivot (1 < 4), nous laissons donc p en place et regardons q.
Nous comparons a[q] avec le pivot et voyons que pivot < a[q] (4 < 5) donc nous laissons q en
place.
Nous echangeons a pr esent a[q] et a[p]. Notre suite est donc maintentant 1, 7, 3, 5, 6, 4. Nous
recommencons.
Nous comparons a[p] (p = 7 toujours) avec le pivot et voyons que pivot a[p] (4 5), nous
continuons donc avec p.
Nous d eplacons p vers la gauche (donc maintenant p = 6). a[p] < pivot (3 < 4), nous laissons
donc p en place et regardons q.
Nous comparons a[q] (q = 4 toujours) avec le pivot et voyons que a[q] pivot (1 4) donc
nous continuons avec q.
Nous d eplacons q vers la droite (donc maintenant q = 5) et comparons a[q] avec le pivot. Cette
fois nous avons pivot < a[q] (4 < 7) nous laissons donc q en place.
Nous echangeons a pr esent a[q] et a[p]. Notre suite est donc maintentant 1, 3, 7, 5, 6, 4. Nous
recommencons.
Nous comparons a[p] (p = 6 toujours) avec le pivot et voyons que pivot a[p] (4 7), nous
continuons donc avec p.
152
Algorithmique - Semestre dAutomne 2010/2011
Nous d eplacons p vers la gauche (donc maintenant p = 5) a[p] < pivot (3 < 4), nous laissons
donc p en place et regardons q.
Nous comparons a[q] (q = 5 toujours) avec le pivot et voyons que a[q] pivot (3 4) donc
nous continuons avec q.
Nous d eplacons q vers la droite (donc maintenant q = 6) et comparons a[q] avec le pivot. Cette
fois nous avons pivot < a[q] (4 < 7) nous laissons donc q en place.
Comme p < q (5 < 6) ne n echangeons pas a[p] et a[q], mais sortons de la boucle principale.
Nous echangeons a[q] et a[r 1] (donc a[6] et a[9]) pour obtenir comme suite 1, 3, 4, 5, 6, 7.
Les deux sous-suites sont donc 1, 3 (a[4], a[5]) et 5, 6, 7 (a[7], a[8], a[9]) avec le pivot 4 au milieu.
Nous appelons donc QUICKSORT(a, 3, 6) et QUICKSORT(a, 7, 10)
Algorithme 39 QUICKSORT(a, , r)
Input: Suite a d el ements avec des cl es enti` eres, indices et r
Output: Transformation de a[], . . . , a[r1] telle que a[i].key a[i+1].key pour i < r1
1: if r + 1 then
2: return
3: end if
4: q
5: p r 1
6: pivot a[r 1].key
7: while p > q do
8: while a[p].key pivot and p > l do
9: p p 1
10: end while
11: while a[q].key pivot and q < r 1 do
12: q q + 1
13: end while
14: if p > q then
15:
Echanger a[p] et a[q]
16: end if
17: end while
18: if q ,= r 1 then
19: Echanger a[q] et a[r 1]
20: end if
21: QUICKSORT(a, , q)
22: QUICKSORT(a, q + 1, r)
153
Algorithmique - Semestre dAutomne 2010/2011
Exemple:
1 3 5 7
1 3 2 7 5 6
7 6 2 3 1 5 4
15 12
7 6 2 3 1 5 4 12 9 15 10
15
7 6 2 3 1 5 4 9
quicksort(a, 0, 11)
quicksort(a, 0, 8) quicksort(a, 9, 11)
quicksort(a, 0, 7)
quicksort(a, 0, 3) quicksort(a, 4, 7)
Analyse
On voit facilement que le temps de parcours est au plus O(N
2
). Pour une suite ordonn ee
de facon d ecroissante, le nombre de comparaisons et de d eplacements est (N
2
), si le pivot est
choisi comme pr ec edemment. Ainsi,
C
max
(N) = (N
2
),
M
max
(N) = (N
2
).
On voit facilement que le temps de parcours est (N), puisque chaque el ement de la suite
doit etre inspect e. Pour une suite ordonn ee de facon croissante, le nombre de mouvements est 0.
Le nombre de comparaisons doit satisfaire C
min
(N) = 2C
min
(N/2) + O(N). Donc en utilisant
le th eor` eme 2.1, on peut conclure que
C
min
(N) = O(N log(N))
M
min
(N) = 0.
154
Algorithmique - Semestre dAutomne 2010/2011
Analysons maintenant le comportement moyen de QUICKSORT. Soit T
k
(N) le co ut total
(comparaisons + mouvements) moyen de QUICKSORT si le pivot est le k
` eme
el ement le plus
petit, et T
avg
(N) le co ut moyen de QUICKSORT pour trier une suite de longueur N. Alors
T
avg
(N) =
1
N
N
k=1
T
k
(N),
et
T
k
(N) = bN
..
sousdivision
+ T
avg
(k 1) +T
avg
(N k),
pour une constante b.
T
avg
(N) = bN +
1
N
N
k=1
(T
avg
(k 1) +T
avg
(N k))
= bN +
2
N
N
k=1
T
avg
(k).
De l` a, on peut montrer (par induction) que
T
avg
(N) cN log(N),
pour une constante c ind ependante de N.
6.2.1 Variantes
Le choix du pivot est crucial pour la performance de lalgorithme QUICKSORT. Il y a plusieures
strat egies pour choisir le pivot, les plus connues sont 3-median strategy (strat egie 3-m edianes)
et randomized strategy (strat egie al eatoire):
3-Median Strategy: On choisit comme pivot la m ediane de 3 el ements de la suite (par
exemple la m ediane du premier, dernier et el ement du milieu).
Randomized Strategy: On choisit comme pivot un el ement al eatoire dans la suite. Avec
cette strat egie, la probabilit e que QUICKSORT ait une mauvaise performance sur une suite
donn ee est tr` es petite.
6.3 HEAP SORT
Heapsort est une technique de tri qui avec un temps de parcours moyen comparable ` a celui de
QUICKSORT (O(N log(N))), mais qui a aussi un temps de parcours O(N log(N)) dans le pire
des cas.
155
Algorithmique - Semestre dAutomne 2010/2011
Heapsort est aussi une methode in-place. Un array a de longueur N peut etre consid er e
comme un arbre binaire avec racine de la facon suivante (repr esentation implicite): Les sommets
de larbre correspondent aux positions 0, . . . , N 1. La racine est ` a la position 0, et les ls des
positions i sont aux positions 2i +1 et 2i + 2, ` a condition que ces valeurs soient plus petites que
N. Nous appelons un tel arbre un array-tree binaire.
Il est evident que la hauteur du array-tree binaire dun array de longueur N est O(log(N)).
(Pourquoi?)
Un tableau a satisfait la heap property (propri et e de monceau) si
a[i].key a[2i + 1].key pour tout i v eriant 2i + 1 < N
a[i].key a[2i + 2].key pour tout i v eriant 2i + 2 < N
On appelle un arbre binaire qui correspond ` a un tableau a un heap (monceau) si le tableau v erie
la propri et e heap.
Exemple: Le tableau [8,6,7,3,4,5,2,1] v erie la propri et e de heap, parce que
8 6, 8 7
6 3, 6 4; 7 5, 7 2
3 1.
a[0]
a[1]
a[2]
a[3] a[4] a[5] a[6]
a[7]
8
6 7
5 2 4 3
1
Comme d ej` a mentionn e, un heap contenant N sommets a une hauteur de O(log(N)).
6.3.1 Sifting
La proc edure de sift (le criblage en francais) est une proc edure efcace qui peut etre utilis ee pour
ins erer ou enlever des el ements dans un heap.
Nous apprendrons deux techniques de sifting: le sift up et le sift down. En utilisant la
terminologie des graphes, on peut d ecrire la proc edure de SIFTDOWN de l el ement dindice i
dans le tableau a de taille N comme suit:
156
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 40 SIFTDOWN(a, i)
Input: Suite a de N el ements ` a cl es enti` eres, et un entier i, 0 i < N pour lequel a[i +
1], . . . , a[N 1] v erie la propri et e de heap.
Output: Transformation de a telle que a[i], a[i + 1], . . . , a[N 1] v erie la propri et e de heap.
1: Swapped true
2: while Swapped = true and 2i + 1 < N do
3: Swapped false
4: Trouver le plus grand ls a[j] de a[i]
5: if a[j].key > a[i].key then
6: Echanger a[i] et a[j]
7: i j
8: Swapped true
9: end if
10: end while
Si le sommet i est une feuille ou sil est plus grand que ses ls on ne fait rien. Sinon
on echange le sommet i avec le plus grand de ses ls et on recommence ce proc ed e de facon
r ecursive sur le ls quon vient d echanger.
La performance de SIFTDOWN est facile ` a analyser:
Th eor` eme 6.2 SIFTDOWN utilise au plus O(log(N/i)) comparaisons et echanges.
Preuve. Remarquons dabord que le nombre de comparaisons est au plus deux fois la distance
entre le sommet i et le bas de larbre (deux comparaisons par niveau), et le nombre d echanges
est au plus egal ` a ce nombre. La diff erence entre la hauteur totale du heap et la hauteur du
sommet i est O(log(N) log(i)), et lafrmation sensuit.
La proc edure SIFTDOWN a un analogue appel e SIFTUP. La proc edure SIFTUP peut etre
appliqu ee au i-` eme sommet, si a[0], . . . , a[i1] v erient d ej` a la propri et e de heap; apr` es SIFTUP
on aura alors que a[0], . . . , a[i 1], a[i] v erient la propri et e de heap. Lid ee est d echanger a[i]
avec son parent si n ecessaire, et de continuer ensuite avec le parent.
Il est facile de montrer que le co ut de cette proc edure est O(log(i)) (Exercice.)
6.3.2 Creation dun heap
Comment transformer un tableau donn e en un heap? Nous verrons deux m ethodes pour cr eer un
heap: La m ethode top-down et la m ethode bottom-up.
La m ethode top-down consiste ` a traverser la suite a[0], . . . , a[N 1] de la gauche vers la
droite. Au pas i 1, nous effectuons un SIFTUP de l el ement a[i] dans le heap a[0], . . . , a[i 1]
d ej` a cr e e. Un argument dinduction montre que le r esultat nal est aussi un heap.
157
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 41 SIFTUP(a, i)
Input: Suite a de N el ements ` a cl es enti` eres, et un entier i, 0 i < N avec a[0], . . . , a[i 1]
v eriant la propri et e de heap.
Output: Transformation de a telle que a[0], . . . , a[i] verie la propri et e de heap.
1: Swapped true
2: while Swapped = true et i > 0 do
3: Swapped false
4: j (i 1)/2 (a[j] est alors le parent de a[i].)
5: if a[j].key < a[i].key then
6: Echanger a[j] et a[i]
7: i j
8: Swapped true
9: end if
10: end while
Algorithme 42 TOPDOWNHEAPCREATE(a)
Input: Suite a d el ements avec N cl es enti` eres.
Output: Transformation de a[0], . . . , a[N 1] en un heap.
1: for i = 1, . . . , N 1 do
2: SIFTUP(a, i)
3: end for
Le temps de parcours de cet algorithme peut etre facilement analys e. A l etape i, le co ut de
SIFTDOWN est O(log(i)), le co ut total de lalgorithme est donc
N
i=2
O(log(i)) = O(log(N!)) = O(N log(N)).
La deuxi` eme m ethode pour cr eer un heap sappelle bottom-up et consiste ` a cr eer plusieurs
petits heaps. Cette fois nous traversons a[0], . . . , a[N 1] de la droite vers la gauche. A chaque
etape i la condition heap est v eri ee pour les el ements a[i], a[i + 1], . . . , a[N 1]. L el ement
a[i 1] est ins er e dans le heap en le siftant dans larbre binaire original.
Exemple: Creation dun heap utilisant lapproche bottom-up. Dans cet exemple, les lettres en
gras indiquent la partie qui est d ej` a transform ee en heap. Valeurs sous-lign ees: Sift-down.
158
Algorithmique - Semestre dAutomne 2010/2011
Tableau: 2 1 5 3 4 8 7 6
a[3].key = 3: 2 1 5 6 4 8 7 3
a[2].key = 5: 2 1 8 6 4 5 7 3
a[1].key = 1: 2 6 8 3 4 5 7 1
a[0].key = 2: 8 6 7 3 4 5 2 1.
Algorithme 43 BOTTOMUPHEAPCREATE(a)
Input: Suite a ` a N el ements, avec cl es entiers.
Output: Transformation de a[0], . . . , a[N 1] en un heap.
1: for i = (N 2)/2, . . . , 0 do
2: SIFTDOWN(a, i);
3: end for
Le temps de parcours de cet algorithme est bien meilleur que celui de lapproche top-down:
pour chaque sommet dans larbre original, le co ut de SIFTDOWN est (au plus) proportionnel ` a la
distance du sommet au dernier niveau de larbre.
Pour un arbre complet binaire ` a 2
h
1 sommet (et de hauteur h 1), on peut montrer par
induction que la somme des distances des sommet au dernier niveau est
2
h
(h + 1).
Il sensuit que le temps de parcours de lapproche bottom-up est O(N).
6.3.3 Lalgorithme HEAPSORT
Nous sommes maintenant pr ets ` a d enir lalgorithme de tri HEAPSORT. La d emarche est la
suivante:
Nous commencons avec la suite a[0], . . . , a[N 1].
Nous la transformons en un heap en utilisant lapproche bottom-up ou top-down.
Pour chaque s = 1, . . . , N 1, nous echangeons la racine de larbre (a[0]) avec a[N s], puis
faisons un SIFTDOWN de a[0] dans larbre donn e par les el ements a[0], . . . , a[N s 1].
Analyse
Le temps de parcours de HEAPSORT est la somme des temps de parcours de la cr eation du
heap (en O(N)), et des N 1 op erations de sift (chacune en O(log i)). Donc, le temps de
159
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 44 HEAPSORT(a)
Input: Suite a de N el ements ` a cl es entiers
Output: Transformation de a[], . . . , a[r1] telle que a[i].key a[i+1].key pour i < r1
1: BOTTOMUPHEAPCREATE(a);
2: for i = N 1, . . . , 1 do
3: Echanger a[0] et a[i]
4: Swapped true
5: j 0
6: while Swapped = true and j < i do
7: Swapped false
8: if 2j + 1 i (a[j] na aucun ls avec indice < i) then
9: NEXT i
10: else
11: Soit a[] le plus grand ls de a[j] tel que < i
12: end if
13: if a[].key > a[j].key then
14: Echanger a[j] et a[]
15: j
16: Swapped true
17: end if
18: end while
19: end for
160
Algorithmique - Semestre dAutomne 2010/2011
parcours total dans le pire des cas est
O(N) +
N1
i=1
O(log(i)) = O(N) +O(log(N!))
= O(N log(N)).
Exemple:
8
7
2 5
6
4 3
1
0
1
4 3
7
2
5 6
1
7
2 5
6
4 3
0
1
4 3
2
5 6
8
7
7
1
2 5
6
4 3
0
1
4 3
2
5 6
8
7
7
5
2 1
6
4 3
0
1
4 3
2
5 6
8
7
6.3.4 Priority Queues
Les heaps impl ementent des queues ` a priorit e (Priority Queues) de mani` ere tr` es efcace. Une
queue ` a priorit e est une structure de donn ees abstraite pour stocker des objets avec des cl es. Deux
op erations sont possibles: ENQUEUE ajoute un el ement et DELETEMIN enl` eve l el ement avec la
cl e la plus petite.
De mani` ere analogue, il y a une queue max-priority queue qui impl emente les op erations
Enqueue et DeleteMax. Il est clair quune de ces structures de donn ees peut etre utilis ee pour
impl ementer lautre avec une modication triviale (Exercice). Dans limpl ementation, une queue
` a priorit e pourrait etre une paire consistant en un tableau (array) de longueur variable ainsi que
la longueur du tableau: de cette facon il est possible dajouter des el ements au tableau, ou den
161
Algorithmique - Semestre dAutomne 2010/2011
enlever. Dans certaines applications un tel tableau peut etre de longueur xe (par exemple pour
les codes de Huffman).
Pour une queue ` a priorit e P, on d enote par Array(P) le tableau correspondant ` a P, par P[i]
le i
eme
el ement du tableau, et par Length(P) la longueur du tableau.
Algorithme 45 ENQUEUE(P, a)
Input: Queue ` a priorit e P, el ement a;
Output: Addition de i ` a P de telle facon que le nouveau tableau reste une queue ` a priorit e
1: Length(P) Length(P) + 1
2: P[Length(P) 1] a
3: SIFTUP (Array(P), Length(P) 1)
Algorithme 46 DELETEMAX(P)
Input: Queue ` a priorit e P
Output: Effacement de l el ement maximal de P de telle facon que le nouveau tableau reste une
queue ` a priorit e; L el ement maximal est retourn e
1: a P[0]
2: P[0] P[Length(P) 1]
3: Length(P) Length(P) 1
4: SIFTDOWN (Array(P), 0)
5: return a
162
7
Algorithmes de graphes
Nous avons etudi e des structures de donn ees pour repr esenter des graphes dans le chapitre 3.
Nous verrons dans ce chapitre plusieurs probl` emes de graphes fondamentaux, et nous intro-
duirons des solutions algorithmiques pour ces probl` emes.
Dans ce chapitre, lensemble des sommets sera en g en eral not e V , celui des ar etes E et le
graphe G, i.e., G = (V, E).
7.1 PARCOURIR DES GRAPHES
Nous etudions dabord le probl` eme de parcours de graphe. Parcourir un graphe veut dire
enum erer tous les sommets atteignables depuis un sommet s donn e, en consid erant dabord les
voisins de s, et it erativement les voisins des voisins, les voisins des voisins des voisins, etc.
Le but est de visiter tous les sommets atteignables, i.e. deffectuer une op eration sur ces
sommets. Cette op eration d epend de lapplication concr` ete en question. Pour donner un exem-
ple simple, si nous voulons compter le nombre de sommets atteignables depuis un sommet s,
nous pouvons parcourir le graphe et la visite dun sommet consisterait alors ` a incr ementer un
compteur.
En g en eral, on veut visiter chaque sommet atteignable exactement une fois, et il faut alors
r esoudre deux probl` emes. Il faut dune part noublier aucun sommet, en sassurant dautre part
quaucun sommet ne soit visit e plus dune fois.
Nous verrons que le premier probl` eme peut etre r esolu en maintenant un ensemble T enum erant
les sommets d ej` a vus mais pas encore trait es. Pour r esoudre le deuxi` eme probl` eme, nous mar-
quons les sommets trait es de facon ` a savoir quels sommets sont encore ` a visiter.
Nous introduirons dabord une solution abstraite pour le probl` eme du parcours de graphe,
avant de sp ecialiser cette solution an dobtenir deux des algorithmes les plus utilis es: Depth
First Search (DFS, profondeur dabord) et Breadth First Search (BFS, largeur dabord). La
diff erence entre les solutions sp ecialis ees concerne lordre dans lequel le parcours a lieu.
Dans la m ethode abstraite nous maintenons un ensemble T qui contient des sommets qui sont
connus atteignables depuis s, mais qui nont pas encore et e visit es. Au d ebut le sommet s est le
seul el ement de lensemble T. Lalgorithme prend un sommet v dans T, le marque puis lenl` eve
163
Algorithmique - Semestre dAutomne 2010/2011
de T et ajoute ` a T tous ses voisins non marqu es. Dans cette section, N[v] d enote lensemble des
voisins dun sommet v (N comme neighbor, voisin).
Lalgorithme est d ecrit en pseudo-code ci-dessous.
Algorithme 47 ABSTRACTTRAVERSAL(G, s)
Input: Graphe G = (V, E), sommet s V .
Output: Visiter et marquer les sommets de V qui peuvent etre atteints depuis s.
1: T s.
2: Marquer s.
3: while T ,= do
4: Choisir v T.
5: Visiter v.
6: T T v
7: while N[v] ,= do
8: Choisir v
N[v]
9: N[v] N[v] v
10: if v
12: Marquer v
13: end if
14: end while
15: end while
Th eor` eme 7.1 Quand cet algorithme se termine, lensemble des sommets visit es est exactement
lensemble des sommets atteignables depuis s.
Preuve. Nous montrons que lensemble de sommets marqu es est egal ` a lensemble des sommets
atteignables depuis s. Le r esultat suivra alors parce que chaque sommet marqu e est mis dans
lensemble T juste apr` es quil est marqu e, et chaque sommet qui est mis dans T est aussi visit e,
etant donn e la condition darr et ` a la ligne 3.
Supposons par labsurde que v V soit atteignable depuis s, mais pas marqu e. Il existe un
chemin qui va de s a v, i.e, s = v
0
v
1
v
k1
v
k
= v. Soit le plus petit indice
pour lequel v
a d u etre choisi ` a la
ligne 8 ` a un certain moment, puis marqu e ` a la ligne 12, une contradiction.
Inversement, supposons par labsurde quil existe un sommet v
est
atteignable depuis s, une contradiction.
164
Algorithmique - Semestre dAutomne 2010/2011
Th eor` eme 7.2 Lalgorithme ci-dessus peut etre impl ement e de facon ` a ce que son temps de
parcours soit O([E[).
Preuve. Chaque sommet est ins er e dans T au plus une fois, puisque seuls des sommets non
marqu es sont ins er es dans T (ligne 10). Pour chaque sommet ins er e dans T, au plus tous ses
voisins seront consid ere s aux lignes 714.
D enissons d(v) comme etant le (out-)degree du sommet v. Le nombre de fois que la boucle
de la ligne 7 est execut ee est au plus
vV
d(v) =
_
[E[ si G est orient e,
2[E[ si G est non orient e.
Si les ensembles N[v] sont r ealis es avec une structure de donn ees qui permet dacc eder ` a v
en
temps constant (ligne 8), et denlever ce m eme el ement en temps constant (ligne 9), et de m eme
pour lensemble T, alors le temps de parcours de lalgorithme est O([E[).
Exercice: Quelles structures de donn ees doivent etre utilis ees pour stocker N[v] en permettant
dins erer et denlever des el ements en temps constant?
Nous navons pas sp eci e comment lensemble T devait etre g er e, et cest exactement dans ce
choix que se trouve la diff erence entre les algorithmes concrets de parcours de graphes.
Si nous utilisons un stack, nous obtenons alors lalgorithme Depth First Search (DFS).
Si nous utilisons une le dattente (queue), nous obtenons alors lalgorithme Breadth First
Search (BFS).
7.2 LALGORITHME DEPTH FIRST SEARCH (DFS)
Lalgorithme DFS est obtenu en r ealisant ABSTRACTTRAVERSAL avec T etant un stack. Rap-
pelons que lon peut effectuer sur un stack T les op erations suivantes:
Top(T) : Retourne l el ement sur le haut du stack.
Pop(T) : Enl` eve l el ement sur le haut du stack.
Push(T, v) : ins` ere v sur le haut du stack (push v onto T).
StackEmpty(T) : retourne vrai si T est vide, faux sinon.
7.3 LALGORITHME BREADTH FIRST SEARCH (BFS)
Lalgorithme BFS est la variante de ABSTRACTTRAVERSAL qui utilise pour T la structure de
donn ees queue. Rappelons que lon peut effectuer sur T les op erations suivantes:
165
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 48 DFS(G, s)
Input: Graphe G = (V, E), sommet s V .
Output: Visiter les sommets de V qui peuvent etre atteints depuis s.
1: Push(T, s)
2: Marquer s
3: while Not StackEmpty(T) do
4: v Top(T)
5: Visiter v
6: Pop(T)
7: while N[v] ,= do
8: Choisir v
N[v]
9: N[v] N[v] v
10: if v
)
12: Marquer v
13: end if
14: end while
15: end while
Head(T) retourne le premier el ement de la queue.
Dequeue(T) enl` eve le premier el ement de la queue.
Enqueue(T, v) ins` ere v ` a la n de la queue.
QueueEmpty(T) retourne vrai si et seulement si T est vide.
Exercices:
Modier lalgorithme BFS pour quil retourne pour chaque sommet sa distance par rapport
` a s.
Modier les algorithmes BFS et DFS pour quils retournent pour chaque sommet la taille
de sa composante connexe.
Construire une structure de donn ees qui peut maintenir la liste pr ec edente dans le cas
dun graphe dynamique auquel on peut ajouter des sommets (mais duquel on ne peut pas
enlever de sommets), en gardant pour chaque sommet un pointeur sur un autre sommet
dans la composante connexe. Quel est le temps de parcours de votre algorithme?
7.4 TRI TOPOLOGIQUE (TOPOLOGICAL SORTING)
Supposons que nous voulons ecrire un chapitre sur les algorithmes de graphes dans un sup-
port de cours dalgorithmique. Nous avons tout dabord une liste de sujets que nous aimerions
166
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 49 BFS(G, s)
Input: Graphe G = (V, E), sommet s V .
Output: Visiter les sommets de V qui peuvent etre atteints depuis s.
1: Enqueue(T, s)
2: Marquer s
3: while Not QueueEmpty(T) do
4: v Head(T)
5: Visiter v
6: Dequeue(T)
7: while N[v] ,= do
8: Choisir v
N[v]
9: N[v] N[v] v
10: if v
)
12: Marquer v
13: end if
14: end while
15: end while
traiter, comme lalgorithme BFS, le tri topologique, etc. Evidemment, nous ne pouvons pas
traiter les sujets dans nimporte quel ordre; par exemple avant d etudier lalgorithme BFS, il est
obligatoire de comprendre ce que cest quun parcourt de graphe; de mani` ere g en erale, les su-
jets ont comme pr ealable dautres sujets. Nous pouvons d ecrire ces d ependances ` a laide dun
graphe: chaque sommet correspond ` a un sujet, et on met une ar ete a b sil est n ec essaire (ou
souhaitable) de traiter le sujet a avant le sujet b.
Pour lexemple du livre dalgorithmique, on aura peut- etre un graphe comme le suivant:
167
Algorithmique - Semestre dAutomne 2010/2011
Parcourt de graphes
DFS BFS
Tri topologique
Dijkstra
MBF
Flux de rseau
Plus court chemin
Maximum Bipartite Matching
Le probl` eme que lauteur doit r esoudre, est le suivant: dans quel ordre dois-je traiter les sujets
an de ne jamais traiter un sujet avant davoir trait e les pr ealables n ecessaires. En termes du
graphe, la t ache est: trouver un ordre des sommets tel que pour toute paire de sommets a, b V ,
si a vient avant b, alors il ny a pas dar ete b a. Cest un probl` eme de tri topologique.
Plus formellement, le tri topologique dun graphe orient e acyclique G = (V, E) consiste ` a
donner un ordre aux sommets v
1
, . . . , v
n
de G tel que (v
i
, v
j
) E implique que i < j. Voici un
autre exemple:
6
9
8
10
2
3
7
5
4
1
Un tri topologique possible dun tel graphe est le suivant:
168
Algorithmique - Semestre dAutomne 2010/2011
10 9 2 3 7 1 8 4 5 6
Donc nous prenons les sommets de droite ` a gauche dans la gure ci-dessus pour obtenir
lordre voulu. Parmi les diff erentes applications de cette m ethode de tri, signalons les exemples
suivants :
Job scheduling : une famille de t aches (jobs) doit etre accomplie avec certaines contraintes
quant ` a lordre dans lequel ceci doit etre fait. On utilise alors un graphe orient e acyclique
o` u les sommets sont les t aches et une ar ete (u, v) repr esente la contrainte la t ache u doit
etre effectu ee avant la t ache v.
Les parenth` esements valables avec 3 paires de parenth` eses sont en bijection avec tous les
tris topologiques possibles du graphe suivant:
La bijection sobtient en associant aux sommets de gauche des parenth` eses ouvertes ` a droite
et aux sommets de droite des parenth` eses ouvertes ` a gauche. Ce cas est facile a g en eraliser.
Comment trouver un ordre topologique dun graphe? Pour reprendre lexemple du cours
dalgorithmique ci-dessus, une approche simple est de dabord traiter tous les sujets sans pr ealables,
ensuite les sujets qui ont juste comme pr ealables les sujets d ej` a trait es et ainsi de suite.
En effet, cette approche est lid ee de base de lalgorithme TOPSORT que nous discuterons
maintenant plus en d etails.
Dans lalgorithme suivant nous donnons des indices aux sommets v. Lindice du sommet
v est d enot e par v.label. Nous utiliserons une queue Q qui contiendra lensemble de tous les
sommets visit es jusqu` a pr esent qui pourraient etre utilis es en tant que prochain el ement dans le
tri topologique. Lalgorithme traverse les sommets d ej` a dans pr esents dans Q, et les enl` eve du
graphe. Si pendant cette proc edure le in-degr e dun sommet est r eduit ` a zero, alors ce sommet
est ajout e ` a Q.
169
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 50 TOPSORT(G)
Input: Graphe acyclique orient e G = (V, E).
Output: Tri topologique de G, donn e par les indices des sommets v.label.
1: Initialiser v.Indegree pour tout v V (e.g., via DFS).
2: t 0
3: for i = 1, . . . , n do
4: if v
i
.Indegree = 0 then
5: Enqueue(Q, v
i
)
6: end if
7: end for
8: while Not QueueEmpty(Q) do
9: v = Head(Q)
10: Dequeue(Q)
11: t t + 1
12: v.label = t
13: for w N[v] do
14: w.Indegree w.Indegree 1
15: if w.Indegree = 0 then
16: Enqueue(Q, w)
17: end if
18: end for
19: end while
170
Algorithmique - Semestre dAutomne 2010/2011
Rappelons que N[v] d enote lensemble des voisins du sommet v.
Th eor` eme 7.3 Le temps de parcours de TOPSORT est O([V [ + [E[), et il a besoin de O([V [)
m emoire en plus.
Preuve. Exercice.
Exercice. En quoi consiste la visite dun sommet si lon veut utiliser DFS pour initialiser
v.Indegree dans le pas 1 de TOPSORT?
7.5 CHEMINS LES PLUS COURTS
Supposons que nous disposons dune carte du r eseau routier du canton de Vaud. Nous nous
trouvons ` a Forel et nous aimerions trouver les plus courts chemins de Forel ` a tous les autres
villages du canton. Nous pouvons mod eliser ce probl` eme comme un probl` eme de graphe: chaque
village est un sommet et les routes sont des ar etes entre les villages. Chaque ar ete (route entre
villages) a une longueur. Le probl` eme est alors de trouver pour chaque sommet x, le chemin
du sommet de d epart (Forel dans lexemple) arrivant ` a x tel que la somme des distances sur le
chemin soit minimale.
Nous d ecrivons dabord le probl` eme plus formellement. Soit G = (V, E) un graphe orient e
avec une fonction poids c: E R
>0
. Donc chaque ar ete e a un certain poids c(e). Nous
voulons trouver les chemins les plus courts dun sommet s V donn e ` a tous les sommets v V
atteignables depuis s. Il faut pr eciser ici quelle notion nous attribuons ` a la d enition de plus
court. Le co ut dun chemin est la somme des poids des ar etes sur le chemin et par chemin le
plus court, on entend le chemin pour lequel le co ut est minimal.
Exemple: V = v
1
, . . . , v
7
; s = v
1
171
Algorithmique - Semestre dAutomne 2010/2011
1
1
1
1 2
2
3
3
3
4
4
5
5
6
7
7
(v): Longueur du chemin le plus court du sommet 1 au sommet v, (v) = si v nest pas
connect e ` a s.
(v
1
) = 0; (v
2
) = 1; (v
3
) = 1;
(v
4
) = ; (v
5
) = 3; (v
6
) = 12;
(v
7
) = 7;
Lalgorithme de programmation dynamique suivant, d u ` a Dijkstra (1959) calcule les chemins
les plus courts de s ` a tous les v V auxquels s est connect e. Il maintient un ensemble T qui,
` a la n du parcours de lalgorithme, contient tous les sommets dans V atteignables depuis s. A
chaque etape pour tout w T la valeur (w) sera la longueur du chemin le plus court de s ` a w.
Th eor` eme 7.4 Lalgorithme de Dijkstra est juste, i.e., la valeur (w) d etermin ee est en effet la
longueur du plus court chemin de s ` a w pour tout w V .
Preuve. Pour la preuve, notons
vrai
(v) la vraie longueur du plus court chemin de s ` a v. Il sagit
donc de montrer qu` a la n de lalgorithme, nous avons (v) =
vrai
(v) pour tout v V . Pour
simplier les notations, nous posons c(v, w) = si (v, w) / E.
Nous montrons dabord que lalgorithme ne se termine pas avant que T couvre toute la com-
posante connexe de s. Nous montrons ceci par labsurde. Notons S la composante connexe de
s. Si T est un sous-ensemble propre non-vide de S, alors il existe un voisin w de T. Soit v T
tel que (v, w) E. On a (v) < (puisqu aucun el ement v avec (v) = nest jamais ajout e
` a T) et c(v, w) < et donc (w) (v) + c(v, w) < . Donc w peut etre choisi ` a l etape 15,
et il ne sagit alors pas de lit eration nale. Donc ` a la n de lalgorithme, on a T = S.
172
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 51 DIJKSTRA(G, s)
Input: Graphe orient e G = (V, E) avec fonction de poids c: E R
>0
, sommet s V .
Output: Pour tout v V la distance la plus courte (v) entre s et v.
1: for v V s do
2: (v)
3: end for
4: (s) 0, T , v s
5: while v ,= NULL and (v) ,= do
6: T T v
7: for w V T do
8: if (v, w) E then
9: d (v) +c(v, w)
10: if d < (w) then
11: (w) d
12: end if
13: end if
14: end for
15: Choisir v dans V T de facon ` a ce que (v) soit minimal,
poser v := NULL si V T = .
16: end while
Montrons maintenant que pour tout v T, (v) est la longueur dun chemin de s ` a v; il sen
suivra que (v)
vrai
(v).
Pour montrer cela, on proc` ede par induction sur [T[. Il ny a rien ` a montrer pour [T[ = 0.
Supposons maintenant quun el ement w est ajout e ` a T. La propri et e est vraie sur T w par
hypoth` ese dinduction et il suft donc de la montrer pour w. La valeur de (w) vaut (w) =
(v) + c(v, w) pour un certain v T; par hypoth` ese dinduction, un chemin s v de
longueur (v) existe. Le chemin s v w est alors de longueur (v) +c(v, w) = (w),
comme voulu.
Pour la suite, nous aurons besoin de l egalit e
(w) = min
vT
_
(v) +c(v, w)
_
,
qui est vraie parce que la boucle des lignes 7 - 14 met ` a jour (w) pour chaque v ajout e ` a T.
Montrons que pour tout v T, (v)
vrai
(v) (et que alors (v) =
vrai
(v)). Nous proc edons
de nouveau par r ecurrence sur [T[. Nous consid erons l etape o` u w V est ajout e ` a T. Soit
s = w
0
w
1
w
m
= w un plus court chemin de s ` a w.
Il nous faut dabord voir que alors w
m1
T. (En fait nous montrerons m eme que w
0
, w
1
, . . . , w
m1
173
Algorithmique - Semestre dAutomne 2010/2011
T). Soit, par labsurde, 0 < k < m le plus petit indice avec w
k
/ T. Alors
(w)
vrai
(w)
>
vrai
(w
k
)
=
vrai
(w
k1
) +c(w
k1
, w
k
)
= (w
k1
) +c(w
k1
, w
k
) (par hypoth` ese dinduction)
min
vT
_
(v) +c(v, w
k
)
_
= (w
k
),
contradisant le choix de w ` a l etape 15: w
k
aurait et e un meilleur choix.
Donc w
m1
T, et alors
vrai
(w) =
vrai
(w
m1
) +c(w
m1
, w)
= (w
m1
) +c(w
m1
, w) (par hypoth` ese dinduction)
min
vT
_
(v) +c(v, w)
_
= (w),
comme voulu.
Voici le r esultat concernant la vitesse de lalgorithme:
Th eor` eme 7.5 Lalgorithme de Dijkstra a un temps de parcours O(n
2
) et a besoin de O(n) de
m emoire, o` u n = [V [.
Preuve. La boucle while ` a la ligne 5 est execut ee au plus n fois. A chaque etape tous les voisins
de v en dehors de T sont consid er es aux lignes 813. Le nombre de tels sommets est au plus
d(v), le out-degree de v. Ainsi, les lignes 813 sont execut ees [E[ fois au total.
Ligne 15: Sans une queue ` a priorit e, tous les el ements de V T doivent etre inspect es, le temps
de parcours de la ligne 15 sur tout lalgorithme est donc O(n
2
). Puisque [E[ = O(n
2
), le premier
r esultat sensuit.
Finalement, nous devons stocker (v) pour tout v V , il nous faut dont O(n) m emoire en
plus (puisque [V [ = n). Remarquons que nous ne prenons pas en compte le fait que les nombres
(v) deviendront plus grands quand n augmente, et n ecessiteront donc plus de m emoire.
Avec la bonne structure de donn ees (Fibonacci-Heaps), le temps de parcours peut etre r eduit
` a O(nlog(n) +[E[). (sans preuve)
Exercice: Modier lalgorithme de Dijkstra pour quil retourne pour chaque sommet son pr ed ecesseur
sur un chemin le plus court depuis s. (Au lieu de simplement retourner la longueur du chemin le
plus court). Indice: Ajouter un membre pred (pour m emoriser le pr ed ecesseur sur le plus court
chemin) aux sommets.
174
Algorithmique - Semestre dAutomne 2010/2011
7.6 LALGORITHME DE MOORE-BELLMAN-FORD
Le grand d esavantage de lalgorithme de Dijkstra est que les co uts des ar etes doivent etre non-
n egatifs.
Il existe un algorithme qui na pas cette restriction. Il sagit de lalgorithme de Moore-
Bellman-Ford dans lequel les co uts peuvent etre n egatifs. Cependant, la seule exigence est la
non-existence de cycles de longueur n egative.
Remarquons que cette derni` ere condition est en fait une restriction essentielle, plut ot quune
restriction de lalgorithme: sil y a un cycle de poids n egatif, alors le probl` eme nest pas bien
pos e; dans ce cas, un chemin de poids arbitrairement petit peut etre construit simplement en
tournant au rond dans ce cycle.
Algorithme 52 MBF(G, s)
Input: Graphe orient e G = (V, E) avec fonction poids c: E R qui ne contient pas de cycles
de longueur n egative, s V .
Output: Pour tout v V la distance la plus courte (v) entre s et v.
1: for v V s do
2: (v)
3: end for
4: (s) 0
5: for i = 1, . . . , n 1 do
6: for (v, w) E do
7: d (v) +c(v, w)
8: if d < (w) then
9: (w) d
10: end if
11: end for
12: end for
Th eor` eme 7.6 Lalgorithme de Moore-Bellman-Ford est correct et calcule son output en util-
isant O(mn) op erations, o` u m = [E[ et n = [V [.
Preuve. Lassertion sur le temps de parcours est evidente. Montrons ` a pr esent que lalgorithme
est correct:
Remarquons que pendant le parcours de lalgorithme, si (v) ,= , on a toujours quil existe
un chemin s v de longueur (v) pour nimporte quel v V . On voit cela par induction
sur le nombre de fois que l etape 9 est execut ee: il faut alors montrer que la mise ` a jour
(w) d = (v) +c(v, w)
175
Algorithmique - Semestre dAutomne 2010/2011
ninvalide pas lafrmation. Cest vrai parce que par hypoth` ese dinduction, on a un chemin
s v de longueur (v). Mais alors le chemin s v w est de longueur
(v) +c(v, w), comme d esir e.
Montrons maintenant que les longueurs trouv ees sont les plus courtes possibles.
Remarquons dabord quil suft de prouver que lalgorithme trouve la longueur du plus court
chemin passant par n 1 ar etes, car il existe toujours un chemin le plus court de s ` a w qui
utilise au plus n 1 ar etes. En effet si un chemin en avait plus que n 1, alors au moins un
sommet apparatrait au moins deux fois sur le chemin, il devrait donc contenir un cycle. Ce cycle
pourrait etre enlev e, sans augmenter le poids du chemin (puisquil ny a pas de cycles n egatifs).
Ce proc ed e pourrait etre continu e jusqu` a ce que chaque sommet sur le chemin apparaisse au
plus une fois, r esultant en un plus court chemin passant par au plus n 1 ar etes.
Etant donn e lafrmation pr ec edente, il suft de montrer que apr` es la i-` eme it eration de la
boucle des lignes 5-12, (v) est inf erieur o` u egal ` a la longueur du plus court chemin s v
passant par au plus i ar etes.
On prouvera cela par induction sur i. Soit
vrai,i
(v) la longueur du plus court chemin s
v passant par au plus i ar etes. Soit
i
(v) la valeur de (v) d etermin ee par lalgorithme ` a la
n de la i-` eme it eration.
Soit
i,w
(v) la valeur de (v) ` a la ligne 7 lorsque la variable w = w et i = i. Notons que
pendant la i-` eme it eration, on a alors toujours
i1
(v)
i,w
(v), vu que (v) naugmente jamais.
`
A la i-` eme it eration, on a
vrai,i
(w) = min
vrai,i1
(w), min
(v,w)E
vrai,i1
(v) +c(v, w)
min
i1
(w), min
(v,w)E
i1
(v) +c(v, w) (hyp. dinduction terme par terme)
min
i1
(w), min
(v,w)E
i,w
(v) +c(v, w) (comme
i1
(v)
i,w
(v))
=
i
(w),
prouvant lafrmation et terminant la preuve.
7.7 FLUX DE R
ESEAU
D enition. Un r eseau (network) (G, c, s, t) est un graphe orient e G = (V, E) avec une fonction
de capacit e c: E R
>0
et deux sommets distingu es s V et t V appel es respectivement
source et sink. Nous supposons que tout autre sommet dans V est sur un chemin de s vers t.
D enition. Un ux (ow) est une application f : E R
0
telle que:
176
Algorithmique - Semestre dAutomne 2010/2011
1. Pour tout e E on a f(e) c(e) (contrainte de capacit e)
2. Pour tout v V s, t:
eE(v,V \{v})
f(e) =
eE(V \{v},v)
f(e),
i.e., tout ce qui rentre dans le sommet v doit aussi en sortir (sauf pour s et t).
On peut par exemple avoir un r eseau de tuyaux (les ar etes). On veut faire couler de leau de
s vers t. La contrainte de capacit e (condition 1 dans la d enition de ow) exprime alors le fait
que chaque tuyau a un d ebit (capacit e) maximal (en litres par secondes), et la condition 2 dit que
` a chaque sommet (p.e. bifurcation de tuyaux), il entre autant deau par unit e de temps qui sort.
Dans le r eseau suivant, les sommets sont des villes et les capacit es des capacit es de transport
entre les villes. Ici, on a s = Liverpool et t = Istanbul.
London Milano
Eindhoven
Lyon
8
2
15
3
10
11
7
4
14
3
7
Liverpool Istanbul
Voici un ux possible sur ce r eseau:
London Milano
Eindhoven
Lyon
Liverpool Istanbul
1/10
3/3
6/7
8/8
3/11
14/14
4/7
0/2 2/4
12/15
2/3
177
Algorithmique - Semestre dAutomne 2010/2011
D enition. La valeur dun ux f est
[f[ =
eE(s,V \{s})
f(e)
eE(V \{s},s)
f(e).
Donc [f[ donne la quantit e nette transport ee de s ` a t.
Dans lexemple ci-dessus on a [f[ = 14.
D enition. Etant donn e un r eseau, un ux maximal est un ux qui a la plus grande valeur parmi
tous les ux possibles.
Remarquons quun ux maximal nest pas forc ement unique, cest-` a-dire quil peut y avoir
plusieurs ux qui ont la valeur maximale. Nous nous int eressons au probl` eme suivant:
Probl` eme. Etant donn e un r eseau, trouver un ux maximal.
La notion de cut nous fournira un crit` ere de maximalit e dun ux.
D enition. Un cut (S, T) avec S, T V est une partition de V : S T = , S T = V , avec
s S, t T. Lensemble des ar etes allant de S ` a T est
E(S, T) := (S T) E.
Pour x S on pose E(x, T) := E(x, T) (de m eme pour S et y T).
Dans lexemple ci-dessus, prenons pour S les villes en Angleterre et pour T les autres villes,
i.e., S = London, Liverpool et T = V S. La masse partant de Liverpool et arrivant ` a
Istanbul doit bien passer la fronti` ere anglaise ` a un moment donn e. Le lemme suivant exprime
cette observation.
Lemme 2 Soit (G, c, s, t) un r eseau, (S, T) un cut et f un ux. Alors
[f[ =
eE(S,T)
f(e)
eE(T,S)
f(e).
Preuve.
[f[ =
eE(s,V \{s})
f(e)
eE(V \{s},s)
f(e)
=
vS
_
_
eE(v,V \{v})
f(e)
eE(V \{v},v)
f(e)
_
_
178
Algorithmique - Semestre dAutomne 2010/2011
=
vS
_
_
_
_
xS
(v,x)E
f((v, x)) +
xT
(v,x)E
f((v, x))
xS
(x,v)E
f((x, v))
xT
(x,v)E
f((x, v))
_
_
_
_
=
v,xS
(v,x)E
f((v, x)) +
vS,xT
(v,x)E
f((v, x))
v,xS
(x,v)E
f((x, v))
vS,xT
(x,v)E
f((x, v))
=
vS,xT
(v,x)E
f((v, x))
vS,xT
(x,v)E
f((x, v))
=
eE(S,T)
f(e)
eE(T,S)
f(e)
Aussi, la capacit e transport e de Liverpool ` a Istanbul ne peut pas exc eder la capacit e de la
fronti` ere anglaise. Plus formellement,
Lemme 3 Soit (G, c, s, t) un r eseau, (S, T) un cut et f un ux. Alors
[f[
eE(S,T)
c(e).
Preuve. Suit du lemme pr ec edent, puisque
e E: 0 f(e) c(e).
e[ e E f(e) > 0.
En francais, on met une ar ete entre deux sommets pour chaque ar ete pour laquelle la capacit e
nest pas epuis ee par le ux, et on met une ar ete en sens inverse pour chaque ar ete de ux non-
nul. (Techniquement, le graphe r esiduel est un multigraphe, i.e. il peut y avoir plusieurs ar etes
entre deux sommets. Nous ignorons ce probl` eme ici.)
c
f(e
)
:=
_
c(e
) f(e
) si e
E,
f(e) si e
e pour un e E.
On a c
f
(e) > 0 pour tout e E
.
Le graphe r esiduel G
f
repr esente donc les diff erentes facons dont on peut modier le ux
f(e) sur chaque ar ete. Si f(e) < c(e) alors on peut augmenter f(e) puisquil na pas atteint la
capacit e de lar ete. Si f(e) > 0 alors on peut diminuer le ux sur lar ete e.
Un chemin f-augmentant P du r eseau (G, c, s, t) par rapport au ux f est un s-t-chemin dans
le graphe r esiduel G
f
. f est augment e par R
>0
via P, si pour toute ar ete e
de P on a la
propri et e suivante : si e
eE(S,T)
c(e).
Preuve. (a) (b): Supposons que G
f
contient un chemin augmentant P. Soit := min
e
E
c
f
(e
).
Par d enition de c
f
on a > 0. Donc, la valeur de f serait diminu ee en augmentant f via P de
, une contradiction.
(b) (c): G
f
ne contient pas de chemins augmentants, donc t nest pas atteignable depuis
s dans G
f
. Soit S lensemble des sommets atteignables dans G
f
depuis s, donc s S, t / S,
donc (S, T), T = V S, est un cut. Par d enition de c
f
:
e E(S, T) f(e) = c(e)
e E(T, S) f(e) = 0
En effet, si on navait pas f(e) = c(e) pour un certain e (S, T), alors il y aurait une ar ete dans
G
f
entre S et T, donc un sommet de T serait atteignable depuis s, une contradiction. De m eme
pour lautre egalit e. Par le Lemme 7.1: [f[ =
eE(S,T)
c(e).
(c) (a): Suit du Lemme 7.2.
Ce r esultat implique le c el` ebre Th eor` eme de Ford-Fulkerson qui suit:
Th eor` eme 7.8 (Ford-Fulkerson) La valeur du ux maximal dans un r eseau est egale ` a la
valeur du cut minimal du r eseau.
Lalgorithme suivant est d eriv e directemement de la preuve du th eor` eme de Ford-Fulkerson:
Algorithme 53 MAXFLOWMINCUT(G, c, s, t)
Input: R eseau (G, c, s, t)
Output: Flow maximal dans le r eseau de s ` a t.
1: for e E do
2: f(e) = 0
3: end for
4: Construire un chemin f-augmentant P; STOP si un tel chemin nexiste pas.
5: Poser := min
e
c
f
(e), o` u e parcourt toutes les ar etes de P.
6: Augmenter f via P de .
7: GOTO Etape 4.
Le temps de parcours de cet algorithme est probl ematique. Si les capacit es sont des valeurs
enti` eres, alors il est possible dobtenir un algorithme avec un temps de parcours exponentiel.
Voir lexemple ci-dessous.
182
Algorithmique - Semestre dAutomne 2010/2011
s
s
s
u
u
u
v
v
v
t
t
t
10
6
10
6
10
6
10
6
10
6
10
6
1
1
1
1
1
1
1
1
1
10
6
1
10
6
1
10
6
1
10
6
1
10
6
1
10
6
1
Quand des capacit es irrationnelles sont utilis ees, il nest m eme pas certain que lalgorithme
termine. Le probl` eme est que nous navons rien dit sur comment ces chemins peuvent etre
construits. Si nous utilisons un chemin augmentant le plus court ` a chaque etape (par exemple, en
utilisant lalgorithme BFS), alors on peut montrer que lalgorithme termine apr` es au plus mn/2
augmentations. Puisque chaque recherche BFS n ecessite un temps de parcours de lordre de
O(m), on obtient un temps de parcours O(m
2
n) pour lalgorithme.
Nous ne prouvons pas ce r esultat ici.
183
Algorithmique - Semestre dAutomne 2010/2011
Exemple: Maximiser le ux de s ` a t ci-dessous:
s
t
/3
/7
/5
/2
/2
/5 /4
/6
0
0
1
0
0
1
0
1
On trouve un chemin augmentant et lam elioration correspondante:
s
t
/3
/7
/5
/2
/2
/5 /4
/6
0
0
1
0
0
1
0
1
=
s
t
/3
/7
/5
/2
/2
/5 /4
/6 0
0
1
0
1
3
3
4
On r ep` ete la proc edure:
184
Algorithmique - Semestre dAutomne 2010/2011
s
t
/3
/7
/5
/2
/2
/5 /4
/6 0
0
1
0
1
3
3
4
=
s
t
/3
/7
/5
/2
/2
/5 /4
/6
1
0
3
3
4
3
2
2
Encore une fois:
s
t
/3
/7
/5
/2
/2
/5 /4
/6
1
0
3
3
4
3
2
2
=
s
t
/3
/7
/5
/2
/2
/5 /4
/6
4
3
4
4
0
0
3
3
Encore:
185
Algorithmique - Semestre dAutomne 2010/2011
s
t
/3
/7
/5
/2
/2
/5 /4
/6
4
3
4
4
0
0
3
3
=
s
t
/3
/7
/5
/2
/2
/5 /4
/6
4
3
0
5
5
1
4
4
Finalement, on obtient le ux optimal, comme le montre le cut:
s
t
/3
/7
/5
/2
/2
/5 /4
/6
4
3
0
5
5
1
4
4
Min Cut
186
Algorithmique - Semestre dAutomne 2010/2011
7.8 APPLICATION: MAXIMUM BIPARTITE MATCHING
Consid erons le probl` eme suivant: etant donn e un ensemble de m el` eves, et un ensemble de n
chambres, et pour chaque el` eve la liste des chambres qui lint eressent, donner ` a chaque el` eve
une chambre de telle facon quautant d el` eves que possible soient satisfaits. (Une chambre peut
contenir exactement un el` eve).
Cest le probl` eme de maximum bipartite matching.
En g en eral: etant donn e un graphe biparti avec m sommets sur la gauche et n sommets sur la
droite, un matching de taille dans le graphe consiste en
sommets de gauche,
sommets de droite,
un sous-ensemble de ar etes qui connecte chacun des sommets de gauche ` a un des
sommets de droite et vice versa.
Un maximum bipartite matching est un matching pour lequel est aussi grand que possible. Nous
exposons une solution a ce probl` eme bas e sur lalgorithme de ux de r eseau:
Soient L et R les ensembles de sommets sur la gauche et sur la droite. Ajouter des sommets
s et t, pour lesquels s est connect e a tous les sommets dans L, et tous les sommets dans R
sont connect es ` a t. On oriente tous les sommets de la gauche vers la droite, et on leur donne
une capacit e de 1. On peut alors appliquer lalgorithme MAXFLOWMINCUT du paragraphe
pr ec edent pour trouver un ux maximal auquel correspondra alors un matching maximal.
Exemple: Supposons que nous avons 4 etudiants et 5 chambres. Nous commencons avec un
graphe biparti qui indique quelles sont les chambres par lesquelles est int eress e chaque el` eve:
Etudiants
Chambres
187
Algorithmique - Semestre dAutomne 2010/2011
Nous ajoutons les sommets s et t, orientons le graphe et ajoutons les capacit es, comme d ecrit
ci-dessus. On obtient ainsi un r eseau:
1
1
1
Etudiants
Chambres
s
1
1
1
1
1
1
1
1
1
t
1
1
1
1
Nous construisons ensuite un ux f:
0/1
1/1
1/1
Etudiants
1/1
0/1
0/1
0/1
1/1
1/1
t
1/1
Chambres
0/1
1/1
1/1
1/1
s
0/1
0/1
Nous construisons le graphe r esiduel par rapport ` a f:
188
Algorithmique - Semestre dAutomne 2010/2011
1
1
1
1
1
1
1
1
s
1
1
1
Etudiants
Chambres
1
1
1
1
1
t
Nous trouvons un chemin f-augmentant:
1
s
1
1
1
1
1
1
1
1
Etudiants
Chambres
1
1
1
1
t
1
1
1
Et obtenons ainsi un nouveau ux:
189
Algorithmique - Semestre dAutomne 2010/2011
1/1
1/1
1/1
s
1/1
1
Etudiants
2
3
4
1/1
1/1
1/1
1/1
0/1
0/1
d
e
1/1
t
Chambres
1/1
a
b
c
1/1
1/1
0/1
Ce ux est maximal: Le cut S = s, T = V S le montre.
Le matching correspondant est le suivant:
el` eve chambre
1 c
2 a
3 b
4 e
7.9 ARBRES COUVRANTS MINIMAUX
Supposons que nous aimerions connecter des sites A, B et C par cable de telle facon que tout le
monde puisse communiquer avec tout le monde. Le co ut des liens est comme suit:
lien co ut
A B 35
B C 127
C A 50
Une solution evidente est de relier chaque site ` a chaque site, ce qui revient dans notre cas ` a un
co ut de 35 + 50 + 127 = 212.
On peut faire mieux. En ne liant que A et B, et A et C, on ne paye que 35 + 50 = 85, et le
probl` eme est aussi r esolu: si B veut parler ` a C, il suft de passer le message ` a A qui le passera ` a
C.
Le cas g en eral du probl` eme ci-dessus est un probl` eme de graphe, il sagit de trouver un
graphe connexe qui lie tous les sommets, tout en minimisant les co uts. Voici un enonc e formel
du probl` eme:
190
Algorithmique - Semestre dAutomne 2010/2011
Etant donn e un graphe G = (V, E) avec fonction de poids w: E R
>0
, trouver un arbre
T = (V, E
) avec E
E et tel que
eE
w(e)
est minimal. Un tel arbre est appel e un arbre couvrant minimal (minimum spanning tree, MST).
(Pourquoi cherche-t-on un arbre, et non pas un graphe quelconque connexe minimisant le co ut?
Cest simplement parce que le meilleur graphe est toujours un arbre.)
Nous voulons trouver un arbre couvrant minimal pour un graphe G donn e. Les arbres cou-
vrants minimaux sont tr` es importants en pratique, par exemple pour r esoudre le probl` eme de
connecter un ensemble de sites en utilisant aussi peu de cable que possible, comme donn e dans
lexemple ci-dessus.
Nous etudierons deux solutions ` a ce probleme: lalgorithme de Kruskal et lalgorithme de
Prim.
7.9.1 Lalgorithme de Kruskal
Lalgorithme glouton suivant est d u ` a Kruskal (1956). Soit E lensemble des ar etes de G.
Algorithme 54 MINSPANKRUSKAL(G, w)
Input: Graphe G = (V, E) avec fonction de poids w: E R
>0
Output: Ensemble E
3: for i = 1, . . . , m do
4: if le graphe (V, E
e
i
) est acyclique then
5: E
e
i
6: end if
7: end for
Encore une fois, et dailleurs ` a chaque fois quun nouvel algorithme apparat, les questions
essentielles auxquelles il faut r epondre sont : est-il juste? Comment limpl ementer de mani` ere
efcace? Quel est le temps de parcours?
Lemme 4 Soit G = (V, E) un graphe avec une de fonction de poids et E
E un ensemble
dar etes. Sil existe un arbre T = (V, E
T
) tel que E
E
T
, et e E est la plus petite ar ete
(cest-` a-dire lar ete de poids minimal) dans EE
= (V, E
T
) tel que E
e E
T
.
Notons que ce lemme prouve que lalgorithme de Kruskal est juste: lalgorithme utilise ce
lemme en commencant avec E
= .
191
Algorithmique - Semestre dAutomne 2010/2011
Preuve. Si e E
T
alors on peut prendre T
ne cr ee
pas de cycle par supposition). Ajouter e
1
` a E
E
T
, et
soit V
et y / V
, alors E
, v / V
.
196
Algorithmique - Semestre dAutomne 2010/2011
En effacant (u, v) et en le remplacant par (x, y), on obtient un autre arbre couvrant. Comme
w(u, v) w(x, y), le co ut de cet arbre couvrant est inf erieur ou egal au co ut de T.
Quel est le temps de parcours de lalgorithme de Prim? Cela d epend des structures de donn ees
utilis ees.
Limpl ementation la plus simple: marquer chaque sommet comme appartenant ` a larbre ou
non, et recommencer la recherche ` a chaque fois d` es le d ebut:
1: Choisir un sommet arbitraire pour commencer.
2: while il y a des sommets non-arbre do
3: Choisir une ar ete minimale avec une extremit e dans larbre et lautre hors larbre.
4: Ajouter lar ete choisie et le sommet correspondant ` a larbre.
5: end while
On peut r ealiser ceci en temps O([V [ [E[) en utilisant DFS/BFS pour parcourir toutes les
ar etes avec un temps constant par ar ete et un total de n it erations, n = [V [. Peut-on faire mieux?
OUI.
Lalgorithme am elior e r esultant ressemble ` a lalgorithme de Dijkstra. Nous ajoutons ` a larbre
T un sommet (et une ar ete) ` a chaque etape. Nous stockons lensemble Q des sommets qui ne
sont pas encore dans T. Les sommets de T sont donc ceux de V Q. Pour chaque sommet v Q,
nous stockons une cl e, qui, ` a nimporte quel point de lalgorithme est la distance minimale de v ` a
larbre actuel T. A la n de lalgorithme, lensemble Q est vide, T contient tous les sommets du
graphe, et est un arbre minimal couvrant. Nous impl ementons Q sous forme de queue ` a priorit e
(heap) par rapport aux cl es (les plus petits el ements etant prioritaires).
Remarquons que nous repr esentons les ar etes de T avec larray p. Pour un sommet v, p[v]
est le pr ed ecesseur de v, donc (p[v], v) est une ar ete de T. Notons que T a bien n 1 ar etes
puisque tous les sommets sauf s ont un pr ed ecesseur.
Pour montrer que lalgorithme fonctionne correctement, nous devons montrer que key[v] est
toujours la distance de v ` a V Q u, o` u u est choisi ` a l etape 8. Cest une simple preuve par
induction.
Pourquoi avons-nous besoin de l etape 13 (SiftUp)? Nous utilisons Q comme min-heap.
Dans l etape 12, la valeur de key[v] a et e r eduite. Donc, v doit trouver sa juste place dans le
heap, et il faut donc faire un SiftUp (cest SiftUp plut ot que SiftDown, parce que larbre est un
min-heap, i.e. la racine contient le plus petit el ement).
Th eor` eme 7.11 Le temps de parcours de lalgorithme MINSPANPRIM est O(mlog(n)), o` u m =
[E[, n = [V [.
Preuve. La queue est cr e ee en temps O(n) dans l etape 6 (BOTTOMUPHEAPCREATE, par ex-
emple). Le cout d etapes 8 dans lalgorithme entier est O(mlog(m)): Chaque sommet v est
inserer dans Qau plus deg(v) fois, donc Qa au plus m = [E[ elements. La boucle for de la ligne
197
Algorithmique - Semestre dAutomne 2010/2011
Algorithme 59 MINSPANPRIM(G, w)
Input: Graphe G = (V, E) avec fonction de poids w: E R
>0
Output: Ensemble E
(p[v], v) [ v V v ,= s.
198
Algorithmique - Semestre dAutomne 2010/2011
13 est parcourue au plus 2m fois, comme chaque ar ete est visit ee au plus une fois pour chacun
des sommets incidents. Lop eration ` a la ligne 16 est effectu ee en temps O(log(m)), donc le co ut
total de cette op eration pendant lex ecution compl` ete de lalgorithme est O(mlog(m)). Toutes
les autres op erations utilisent un temps O(m). Ainsi, le temps de parcours complet est
O(mlog(m) +n) = O(mlog(n)),
parce que m n
2
, donc log(m) 2 log(n).
7.10 D
i=1
_
[v
i1
] +w(v
i1
, v
i
)
_
i=1
[v
i
].
Comme
k
i=1
[v
i1
] =
k
i=1
[v
i
] (v
0
= v
k
), on peut enlever ces deux termes de la somme
ci-dessus pour obtenir:
k
i=1
w(v
i1
, v
i
) 0.
Donc, le cycle C est positif. Ainsi le graphe ne peut pas contenir de cycles n egatifs.
7.10.2 Lalgorithme de Karp pour trouver des cycles avec poids
moyen minimal
Soit C = (v
0
, v
1
, . . . , v
k
) un cycle dans le graphe G (donc v
0
= v
k
). Nous supposons que G est
orient e et connexe. Alors la quantit e
(C) :=
1
k
k
i=1
w(v
i1
, v
i
)
est le poids moyen de C. D` es lors,
(G) = min
C cycle dans G
(C)
est le poids moyen minimal dun cycle du graphe. Karp a construit en 1978 un algorithme pour
calculer cette quantit e.
Soit s un sommet arbitraire dans G = (V, E). Pour x V soit
F
k
(x) := min
_
k
i=1
w(v
i1
, v
i
)
v
0
= s, v
k
= x, (v
i1
, v
i
) E
_
la longueur du plus court chemin de s ` a x utilisant exactement k ar etes. Pour tout x V ,
0 k < n, nous pouvons calculer les valeurs F
k
(x) en utilisant la programmation dynamique:
200
Algorithmique - Semestre dAutomne 2010/2011
F
0
(s) = 0
x V s: F
0
(x) =
1 k n, x V :
F
k
(x) = min
uV (u,x)E
F
k1
(u) +w(u, x).
Exercice: Montrer que les r ecursions sont correctes et que les valeurs F
k
(x) peuvent etre cal-
cul ees en temps O(nm).
Th eor` eme 7.13 La quantit e
= min
xV
max
0k<n
F
n
(x) F
k
(x)
n k
.
Preuve. Nous consid erons dabord le th eor` eme dans le cas
= 0, il ny a pas de cycles n egatifs, les chemins simples sont donc les plus courts et on a donc
x V : (x) = min
0k<n
F
k
(x) F
n
(x).
Ceci implique que
x V : max
0k<n
F
n
(x) F
k
(x) 0,
donc en particulier:
min
xV
max
0k<n
F
n
(x) F
k
(x) 0.
Pour nir la preuve, nous devons montrer quil y a un sommet x tel que F
n
(x) = (x). Soit C un
cycle dans le graphe avec (C) = 0, et soit w C arbitraire (nous savons quun tel cycle existe
puisque
= 0).
Soit P un chemin minimal de s ` a w suivi par n it erations du cycle C. P contient au moins n
ar etes. Soit P
le chemin form e par les premi` eres n ar etes de P. Le co ut du chemin P est (w)
(comme (C) = 0 et il ny a pas de cycles n egatifs). Tout sous-chemin dun chemin de co ut
minimal est aussi de co ut minimal. Si E
eE
w(e) = (x) = F
n
(x).
201
Algorithmique - Semestre dAutomne 2010/2011
Donc, x est un sommet avec (x) = F
n
(x), ce qui montre lafrmation du th eor` eme pour
= 0.
Dans le cas g en eral, en r eduisant les poids des ar etes dune constante t, on r eduit
min
xV
max
0k<n
F
n
(x) F
k
(x)
n k
par t. (Pourquoi?) Choisir alors t =
.
Ces valeurs peuvent etre calcul ees est stock ees pendant le calcul de
EDUCTION POLYNOMIALE
But: Utiliser une solution dun probl` eme B pour r esoudre un probl` eme A.
Nous dirons que le probl` eme Aest polynomialement r eductible ` a un probl` eme B si nimporte
quel input a de A, peut etre transform e en temps polynomial en un input b de B tel que A est
solvable sur a si et seulement si B est solvable sur b. De plus, nous exigeons que la longueur de
b soit polynomiale en la longueur de a.
Nous notons ceci A
P
B. Cette relation entre probl` emes est en fait une relation transitive
: Si A
P
B et B
P
C, alors A
P
C. En effet, deux r eductions polynomiales forment une
r eduction polynomiale.
Exemple: Soit A le probl` eme maximum bipartite matching, et B le probl` eme du ux maximal.
Nous avons vu que A
P
B.
Si A
P
B, alors A est au plus aussi dur que B. Si A
P
B et B
P
A, nous ecrivons
A =
P
B. Dans ce cas, A et B sont ` a peu pr` es de m eme difcult e.
8.3 LA CLASSE NP
Pour de nombreux probl` emes, aucun algorithme en temps polynomial nest connu. Cependant,
pour de nombreux probl` emes de d ecision, on peut donner un algorithme qui v erie une solution
204
Algorithmique - Semestre dAutomne 2010/2011
en temps polynomial.
Exemple: Consid erons le probl` eme de d ecision suivant: Etant donn e un entier n, est-t-il com-
pos e? (i.e. non-premier).
Supposons que nous ne sachions pas comment r esoudre ce probl` eme en temps polynomial
(ce qui etait encore le cas avant la decouverte de lalgorithme AKS en 2002). Il est par contre
facile de convaincre quelquun quun nombre n est compos e en exhibant deux entiers a > 1 et
b > 1 tels que a b = n. Ce test se fait en temps polynomial en log
2
(n), i.e. en la longueur de
linput.
La classe NP consiste en tous les probl` emes de d ecision pour lesquels il existe une preuve en
temps polynomial. Par exemple, le probl` eme ci-dessus de savoir si un nombre est compos e est
dans NP.
Tous les probl` emes dans P sont aussi dans NP. (Pourquoi?)
Nous donnons ` a pr esent une liste dautres probl` emes dans NP.
INDEPENDENTSET: etant donn e un graphe G = (V, E), et un entier K, le graphe contient-il
un ensemble ind ependant de taille K?
Rappelons quun ensemble independant dans un graphe G = (V, E) est un sous-ensemble I
de V tel que deux el ements quelconques de I ne sont pas reli es par une ar ete de V .
CLIQUE: etant donn e un graphe G = (V, E) et un entier K, le graphe contient-il une clique
de taille K?
Rappelons quune clique dans un graphe G = (V, E) est un sous-ensemble C de V tel que
deux el ements quelconque de C sont reli es par une ar ete de V .
Nous avons que
INDEPENDENT SET(G, K) =
P
CLIQUE(
G, K).
En effet, un ensemble ind ependant est une clique dans le compl ement du graphe.
205
Algorithmique - Semestre dAutomne 2010/2011
Un node cover dans un graphe G = (V, E) est un sous-ensemble S V tel que chaque ar ete
a au moins un point terminal dans S. Le probl` eme NODE-COVER est comme suit: etant donn e
un entier K et le graphe G, existe-t-il un node cover dans G de taille K?
Remarquons que NODE-COVER =
P
INDEPENDENT-SET: Un sous-ensemble S de V est un
node cover si et seulement si I = V S est un ensemble ind ependant!
8.4 NP-COMPL
ETUDE
Un probl` eme A est appel e NP-complet si A NP et pour tous les probl` emes B dans NP on a
B
P
A.
Ainsi, si on peut r esoudre A en temps polynomial, alors on peut r esoudre tous les probl` emes
dans NP en temps polynomial! Donc, les probl` emes NP-complets peuvent etre consid er es
comme les probl` emes les plus difciles dans la classe NP. Nous avons le r esultat suivant:
Si A est NP-complet, B est dans NP, et A
P
B, alors B est aussi NP-complet.
La preuve est en fait triviale et sensuit des d enitions. Le premier probl` eme a avoir et e
identi e comme etant NP-complet est le satisability problem (SAT).
8.5 PROBL
`
EMES DE SATISFIABILIT
E
Consid erons les formules bool eennes suivantes:
Variables: x
1
, . . . , x
n
;
Litt eraux
i
: x
i
ou x
i
;
Clauses C
j
:
1
2
k
j
pour un certain k
j
> 0;
Formule F: C
1
C
2
C
t
pour un certain t > 0.
206
Algorithmique - Semestre dAutomne 2010/2011
Exemple:
(x
1
x
2
x
3
x
4
) (x
1
x
2
) (x
1
x
2
x
4
).
Le prob` eme SAT est alors le suivant :
SAT: Etant donn e une formule F, peut-on donner aux variables des valeurs dans 0, 1 telles
que F soit vraie?
Th eor` eme 8.1. (Th eor` eme de Cook-Levin) SAT est NP-complet.
Le probl` eme k-SAT est une variante de SAT dans laquelle chaque clause doit consister en
exactement k litt eraux.
Th eor` eme 8.2. 3-SAT est NP-complet.
Preuve. Nous allons montrer que SAT
P
3-SAT. Etant donn e une formule F comme input pour
SAT, nous introduisons pour chaque clause
C
i
=
1
s
une nouvelle variable x
i
, et divisons C
i
en deux clauses:
F
i
= (
1
s2
x
i
) (
s1
s
x
i
).
Clairement, F
i
est satisfaisable si et seulement si C
i
est satisfaisable.
Nous proc edons r ecursivement en coupant la clause la plus grande jusqu` a ce que toutes les
clauses aient trois litt eraux. Si F contient une clause avec deux litt eraux
1
et
2
, nous ajoutons
une nouvelle variable X et divisons la clause en
(
1
2
x) (
1
2
x).
Ceci termine la preuve.
On peut montrer de la m eme facon: k-SAT est NP-complet pour k 3. Cependant: 2-SAT
est dans P! Cest-` a-dire, il existe un algorithme pour r esoudre 2-SAT en temps polynomial.
Not-all-equal-3-SAT (NAE-3-SAT): Toutes les clauses ont trois litt eraux. Une clause est
satisfaite si et seulement sil existe deux litt eraux dans la clause avec des valeurs diff erentes.
Par exemple:
(x, y, z) , (1, 0, 1), (0, 1, 0)
satisfait la clause
x y z.
Th eor` eme 8.3. NAE-3-SAT est NP-complet.
207
Algorithmique - Semestre dAutomne 2010/2011
Preuve. Nous montrons que 3-SAT
P
NAE-SAT. Soit F = C
1
C
m
une formule dans
laquelle chaque clause contient exactement 3 litt eraux (donc F est un input pour le probl` eme 3-
SAT). Nous allons construire ` a partir de F une formule G de telle facon que F soit satisfaisable
si et seulement si G est NAE-satisfaisable.
Nous allons utiliser dans G les m emes variables x
1
, . . . , x
n
que dans F, en ajoutant en plus
m + 1 variables: w
1
, . . . , w
m
(donc un w
j
pour chaque clause C
j
), et une variable z. Ensuite
chaque clause
C
j
=
j1
j2
j3
dans F est transform ee en 2 nouvelles clauses:
C
1
j
..
(
j1
j2
w
j
)
C
2
j
..
(w
j
j3
z) .
dans G (G contient donc 2m clauses).
Si une attribution satisfait F, alors nous pouvons construire une attribution qui NAE-satisfait
G: Nous gardons les m emes valeurs pour x
1
, . . . , x
n
, puis nous posons z = 0, et j = 1, . . . , m :
w
j
=
j3
j1
. En effet:
Si
j3
= 1 alors C
2
j
est NAE-satisfaite (puisque z = 0), et comme w
j
,=
j1
, C
1
j
est aussi
NAE-satisfaite par notre attribution.
Si
j3
= 0 alors w
j
= 0, et donc w
j
= 1, ce qui implique que C
2
j
est NAE-satisfaite. De plus,
nous devons avoir
j1
= 1 ou
j2
= 1 (puisque
j3
= 0 et lattribution doit satisfaire C
j
) et donc
C
1
j
est aussi NAE-satisfaite.
R eciproquement, si une attribution NAE-satisfait G, alors nous allons montrer que cette
m eme attribution (restrainte aux variables x
1
, . . . , x
n
) satisfait aussi F. Supposons sans perdre
de g en eralit e que z = 0 (sinon nous prenons le compl ement de lattribution, qui NAE-satisfait
aussi G). Nous voyons que pour chaque clause C
j
:
Si
j3
= 1 alors C
j
est clairement satisfaite.
Si
j3
= 0 alors nous devons avoir w
j
= 1 (pour que C
2
j
soit NAE-satisfaite), et donc
w
j
= 0 ce qui implique que soit
j1
= 1 ou
j2
= 1 (puisque C
1
j
est NAE-satisfaite) et donc
C
j
=
j1
j2
j3
est aussi satisfaite.
Un autre probl` eme de satisabilit e NP-complet est
MAX-2-SAT: Etant donn e une formule dont toutes les clauses ont au plus deux litt eraux,
trouver une attribution des variables qui maximise le nombre de clauses satisfaites.
Exemple fondamental:
x y z w
(x y) (y z) (z x)
(x w) (y w) (z w).
Lemme 8.1. Si x y z = 1, alors il existe une attribution pour w qui satisfait sept des clauses
208
Algorithmique - Semestre dAutomne 2010/2011
ci-dessus. Si x = y = z = 0, alors pour nimporte quelle valeur de w, la formule ci-dessus aura
au plus 6 clauses satisfaites.
Preuve. Exercice.
En utilisant cette construction, nous pouvons montrer que MAX-2-SAT est NP-complet.
Th eor` eme 8.4. MAX-2-SAT est NP-complet.
Preuve. Nous r eduisons 3-SAT ` a ce probl` eme. Etant donn e la formule 3-SAT C
1
C
m
,
nous introduisons pour chaque clause une nouvelle variable w
i
et remplacons la clause C
i
par les
10 clauses ci-dessus (avec w remplac e par w
i
et x, y et z remplac e par les lit eraux de C
i
).
La nouvelle formule a 10m clauses. Nous montrerons que la formule a 7m attributions
satisfaisantes si et seulement si la formule originale est satisfaisable. Dans chaque groupe de 10
nouvelles clauses, il peut y en avoir au plus 7 qui sont satisfaisantes. Ainsi, sil y en a 7m qui
sont satisfaites, le nombre de clauses satisfaites est exactement 7m, et par le lemme ci-dessus
toutes les clauses dans la formule 3-SAT originale sont satisfaites. Sil y a moins que 7m clauses
satisfaites, alors il y a un groupe qui a moins que 7 clauses satisfaites, et donc la formule originale
nest pas satisfaisable.
8.6 QUELQUES PROBL
`
EMES DE GRAPHE NP-COMPLETS
On rappelle dabord que INDEPENDENT-SET est le probl` eme suivant: Etant donn e un graphe G
et un nombre t N, d eterminer sil existe dans G un ensemble ind ependant de taille t
Th eor` eme 8.5. INDEPENDENT-SET est NP-complet.
Preuve. Nous allons montrer que 3-SAT
P
INDEPENDENT-SET. Etant donn e une formule
3-SAT avec t clauses, nous construisons un graphe qui a un ensemble ind ependant de taille t
si et seulement si la formule est satisfaisable. La construction de ce graphe se fait comme suit:
Chaque clause correspond ` a un triangle.
Les litt eraux compl ementaires sont reli es par une arr ete.
(x
1
x
2
x
3
) (x
1
x
2
x
3
) (x
1
x
2
x
3
)
x
1
x
2
x
2
x
3
x
3
x
1
x
1
x
2
x
3
209
Algorithmique - Semestre dAutomne 2010/2011
Une attribution valable dans une formule 3-SAT avec t clauses donne un ensemble ind ependant
de taille t:
Nous commencons par mettre dans notre ensemble tous les sommets correspondant ` a des
litt eraux qui sont vrais dans lattribution. Dans chaque triangle, sil y a plus que deux sommets
dans notre lensemble, nous en enlevons un ou deux pour r eduire le nombre ` a un.
Lensemble r esultant est ind ependant: Un sommet dans un triangle ne peut pas etre connect e
a un sommet dans un autre triangle, puisque le litt eral et son compl ement ne peuvent pas tous
les deux valoir un. Deux sommets dans lensemble ind ependant ne peuvent pas etre dans un
triangle, puisque le proc ed e sen est assur e.
De plus, comme toutes les clauses sont vraies, il y a au moins un litt eral par clause qui est
vrai, et donc un moins un sommet par triangle qui est dans notre ensemble. Comme il y a t
triangles, la taille de lensemble est t.
Un ensemble ind ependant de taille t dans le graphe m` ene ` a une attribution valable de la
formule originale:
Clairement, si la formule originale a t clauses, alors le graphe a t triangles, et lensemble
ind ependant maximal est donc de taille t. Nous donnons ` a chaque litt eral dans lensemble
ind ependant la valeur 1, et aux autres litt eraux la valeur 0.
Alors chaque clause dans la formule est satisfaisable, et il ny a pas de contradiction entre
les litt eraux et leurs compl ements puisquils sont connect es dans le graphe (donc les deux ne
peuvent pas etre dans lensemble ind ependant).
Corollaire 8.1. CLIQUE et NODE-COVER sont NP-complets.
Cest parce que
INDEPENDENT-SET =
P
CLIQUE =
P
NODE-COVER.
Un cut dans un graphe G = (V, E) est une paire (S, V S), o` u S V . La taille dun cut est
le nombre darr etes entre S et V S.
MAX-CUT: Etant donn e un graphe G et un entier n, existe-t-il un cut de taille n?
Th eor` eme 8.6. MAX-CUT est NP-complet.
Preuve. Nous allons montrer que NAE-3-SAT
P
MAX-CUT. Etant donn e une formule NAE-
3-SAT F, nous construisons un graphe Get une valeur K tels que F est NAE-3-satisfaisable ssi
G a un cut de taille K. Soit m le nombre de clauses dans F, et soient x
1
, . . . , x
n
les variables.
On commence par poser K = 5m. Ensuite, notre graphe G a comme sommets x
1
, . . . , x
n
,
x
1
, . . . , x
n
. Pour chaque clause C
i
= , on ajoute le triangle [, , ] aux ar etes de
G. Pour chaque i, soit n
i
nombre doccurrences de x
i
ou x
i
dans F. Ajouter n
i
ar etes entre x
i
et x
i
dans G. G devient un graphe avec plusieurs ar etes entre ses sommets (un tel graphe est
appel e un multigraphe). Remarquons que G a 2n sommets, et 6m ar etes.
210
Algorithmique - Semestre dAutomne 2010/2011
Supposons quil y a un cut (S, V S) de taille 5m dans G. Sans perte de g en eralit e, les
variables et leurs n egations ont des c ot es diff erents dun cut. Autrement, si x
i
et x
i
se trouvent
du m eme c ot e, ils contribuent ensemble au plus n
i
ar etes au cut. Si on les met de deux c ot es
diff erents, on augment la valeur du cut par n
i
(grace a lar ete entre x
i
et sa negation), et au m eme
temps, on diminu la valeur par au plus n
i
: on pert la valeur 1 pour chaque occurrences de x
i
dans
un clause. Alors, mettre x
i
et x
i
a deux c ot es differents diminu pas la valeur du cut.
Nous consid erons les litt eraux de S comme vrai et ceux dans V S comme faux.
Les ar etes entre des variables et leurs n egations contribuent au plus 3m au cut (autant quil
y a doccurrences de litt eraux). Les 2m ar etes restantes doivent venir des triangles. Un triangle
contribue soit 0 (si les 3 sommets sont du m eme cot e) soit 2 (sil y a 2 sommets dun cot e et un
de lautre) au cut. Comme il y a mtriangles qui doivent contribuer au moins 2m, chaque triangle
doit contribuer 2 au cut, et donc dans chaque triangle il y a 2 sommets dun cot e du cut et un de
lautre). Ainsi, dans chaque triangle, au moins un lit eral est vrai et un est faux, i.e., la formule
originale est NAE-satisfaisable.
Inversement, il est facile de traduire lattribution de v erit e qui satisfait toutes les clauses dun
cut de taille 5m.
Remarquons que le probl` eme de minimiser le cut est dans P! Donc, les probl` emes de minimi-
sation et de maximisation sont compl` etement diff erents.
8.7 QUELQUES AUTRES PROBLEMES DE GRAPHE
NP-COMPLETS
Un cycle Hamiltonien dans un graphe G = (V, E) est un chemin (v
0
, v
1
, . . . , v
n
) tel que v
n
= v
0
et tel que V = v
0
, . . . , v
n1
. Le probl` eme HAMILTONIAN-CYCLE demande si un graphe
donn e poss` ede un cycle Hamiltonien.
Th eor` eme 8.7. HAMILTONIAN-CYCLE est NP-complet.
Preuve. Nous ne la verrons pas ici. Il y a une preuve qui proc` ede en montrant que 3-SAT
P
HAMILTONIAN-CYCLE.
Notons que le probl` eme HAMILTONIAN-PATH, qui demande sil existe un chemin Hamil-
tonien dans un graphe donn e (i.e. la condition v
n
= v
0
est relax ee) est aussi NP-complet.
Voyons maintenant le probl` eme du Voyageur de Commerce (Travelling Salesman Problem)
TSP. Etant donn e n villes 1, . . . , n, des distances enti` eres et non n egatives d
ij
entre chaque paire
de villes telles que d
ij
= d
ji
et une borne enti` ere B. On se demande sil y a un tour des villes tel
que la distance totale parcourue est inf erieure ` a B. En dautres mots, existe-t-il une permutation
telle que
n1
i=1
d
(i),(i+1)
+d
(n),(1)
B.
Th eor` eme 8.8. TSP est NP-complet.
Preuve. Nous montrons que HAMILTONIAN-CYCLE
P
TSP. Pour un graphe donn e G avec n
211
Algorithmique - Semestre dAutomne 2010/2011
sommets, nous construisons la matrice des distances d
ij
et un budget B tel que G a un chemin
Hamiltonien si et seulement sil existe un tour de longueur B.
Il y a n villes correspondant aux n sommets du graphe et
d
ij
=
_
1 si (i, j) E,
n + 1 sinon.
De plus, B = n + 1. Clairement, sil y a un tour de longueur B, alors le tour doit utiliser les
ar etes dans le graphe et doit visiter chaque ville une fois, donc cest un parcours Hamiltonien.
R eciproquement, un chemin Hamiltonien dans le graphe m` enera ` a un tour de co ut B.
Supposons que nous devons colorier les sommets dun graphe donn e avec k couleurs de
telle facon quil ny ait pas deux sommets adjacents de m eme couleur. Ce probl` eme sappelle le
probl` eme de k-coloriage (k-coloring). Pour k = 2, ce probl` eme est assez facile ` a r esoudre. Pour
k = 3, cest diff erent.
Th eor` eme 8.9. 3-COLORING est NP-complet.
Preuve. Nous ne la verrons pas ici. On peut utiliser une r eduction de NAE-SAT.
Il y a de nombreux autres probl` emes de th eorie des graphes qui sont NP-complets. Pour en
savoir plus sur les probl` emes NP-complets en g en eral:
M.R. Garey and D.S. Johnson, Computers and Interactibility: A Guide to the Theory of
NP-Completeness, Freeman Publishers, 1979.
C.H. Papadimitriou, Computational Complexity, Addison-Wesley, 1994
8.8 PROBL
`
EMES DE TH
iS
w
i
W
and
iS
v
i
T.
Chapitre 4: Solution de programmation dynamique en temps O(nW). Or, ce temps de par-
cours nest pas polynomial en la longueur de linput O(nlog(W)). Existe-t-il un algorithme en
temps polynomial pour KNAPSACK? Cest peu probable.
Th eor` eme 8.12. KNAPSACK est NP-complet.
Preuve. Nous montrons que
EXACT COVER BY 3-SETS
P
KNAPSACK.
Soit S
1
, . . . , S
n
et U = 0, . . . , 3m 1 un input pour EXACT COVER BY 3-SETS. Nous
voulons le transformer en un input de KNAPSACK
Soit
w
i
= v
i
=
jS
i
(n + 1)
j
et
W = T =
3m1
j=0
(n + 1)
j
.
Noter que pour chaque I 1, . . . , n on a
iI
w
i
=
3m1
i=0
(n + 1)
j
j
,
o u
j
= [i I [ j S
i
[. On peut voir que il y a un sous ensemble I de 1, . . . , n telle que
iI
w
i
W et
iI
v
i
T si et seulement si
iI
w
i
= W (parce que w
i
= v
i
et W = V .)
On en d eduit que pour chaque j U, il y a exactement un i I telle que j S
i
; a montre que
[I[ = m, et que en plus
iI
S
i
= U.
213