Algorithmique IN102-01
Michel Mauny
ENSTA
Michel Mauny (ENSTA) Algorithmique IN102-01 Pr´[email protected] 1 / 1
1 Pr´eliminaires Organisation
Evaluation, supports de cours´ Objectifs
2 Cours 1 – Notions de complexit´e
Algorithmes et mesures de complexit´e Suite de Fibonacci
Algorithmes de tri Efficacit´e
Groupes
Deux types de groupes : Groupes «A» et «B»
Mˆemes exigences, mˆeme ´evaluation Seuls les TD/PC diff`erent
Les groupes B1,2 (resp. B3,4) dans des salles attenantes
Michel Mauny (ENSTA) Algorithmique IN102-01 Pr´[email protected] 3 / 1
Programme
02/12 Complexit´e [PC]
09/12 Structures de donn´ees simples 16/12 Recherche en table [PC]
— —
— —
06/01 Arbres 13/01 Graphes
20/01 Analyse syntaxique [PC]
27/01 Contrˆole
Evaluation, supports de cours ´
Contrˆole de 3 heures le 27 janvier 2006
petits exercices (fonctions de 10 lignes — voir `a la fin du poly) documents de cours autoris´es
Supports de cours
Poly de Guillaume Poupard Planches
Sujets de PC/TP
Page web `a http://www.mauny.net/cours/ensta/algo/
Michel Mauny (ENSTA) Algorithmique IN102-01 Pr´[email protected] 5 / 1
Objectifs
Motivation : prendre du recul par rapport `a la programmation identification du probl`eme
recherche d’un algorithme analyse de complexit´e mise en œuvre
D´efinition du terme «algorithme»
Suite d’op´erations ´el´ementaires constituant un sch´ema de calcul ou de r´esolution d’un probl`eme
(Petit Larousse)
Complexit´ e d’algorithmes
But : mesurer l’efficacit´e intrins`eque d’un algorithme en fonction de la taille des donn´ees `a traiter
par d´enombrement d’op´erations ´el´ementaires repr´esentatives mesure asymptotique
complexit´e dans le cas le pire ou en moyenne complexit´e temporelle ou spatiale
Michel Mauny (ENSTA) Algorithmique IN102-01 Pr´[email protected] 7 / 1
Exemple classique : le tri
But : trier un tableau de n entiers d´enombrement des comparaisons
performance des algorithmes ´el´ementaires : «de l’ordre de» n2 comparaisons
algorithmes plus sophistiqu´es font passer de n2 `a n×log(n)
Notations de complexit´ e
D´efinitions :
f(n) = O(g(n)) ssi 0 ≤ f(n) ≤ c×g(n)
f(n) = Θ(g(n)) ssi c×g(n) ≤ f(n) ≤ c0×g(n) Exemples :
n2 + 3n+ 1 = Θ(n2) = Θ(50n2 + 12345) n/ln(n) = O(n)
50n10 = O(n10,01) 2n = O(exp(n)) exp(n) = O(n!)
Michel Mauny (ENSTA) Algorithmique IN102-01 Pr´[email protected] 9 / 1
Hi´ erarchie de fonctions
On peut ´etablir une hi´erarchie entre les fonctions usuelles : log(n) √
n n n2 n3 2n exp(n) n!
log(n) 3,3 6,6 10
p(n) 3,1 10 32
n 10 100 1000
n×log(n) 33 664 104
n2 100 104 106
n3 103 106 109
2n 103 1030 10300 exp(n) 2×104 1043 10434
n! 3,6×106 10158 102568
Note : nombre de particules dans l’univers ≈ 1080.
Suite de Fibonacci, version 1
F0 = F1 = 1
Fn = Fn−1 +Fn−2 si n > 1 1, 1, 2, 3, 5, 8, 13, 21, 34, . . .
Code r´ ecursif en C
int fibo1 (int n) { if (n ≤ 1)
return 1;
else
return fibo1(n−1)+fibo1(n−2);
}
Complexit´e : Θ(((1 +√
5)/2)n)
Michel Mauny (ENSTA) Algorithmique IN102-01 Pr´[email protected] 11 / 1
Suite de Fibonacci, version 1
Calcul de F
5.....................
........
........
........
........
........
......
K F0
F1
F2
.....................
........
........
........
........
........
......
K
.....................
........
........
........
........
........
......
K
F0
F1
F2
F3
F1
@
@@ I
.....................
........
........
........
........
........
......
K
.....................
........
........
........
........
........
......
K *
H HH H Y F4
F1 F0
F2 F1
F5
F3
Complexit´e : Θ(((1 +√
5)/2)n)
Suite de Fibonacci, version 2
Calcul de F
8F0 F1 F2 F3 F4 F5 F6 F7 F8
1 1 2 3 5 8 13 21 34
Complexit´e Θ(n)
Complexit´e spatiale Θ(n)
Michel Mauny (ENSTA) Algorithmique IN102-01 Pr´[email protected] 13 / 1
Suite de Fibonacci, version 2
Code it´ eratif en C, avec tableau auxiliaire
int fibo2 (int n) {
int ∗t; int i, int res;
t = new int[n+1];
t[0] = 1; t[1] = 1;
for (i=2; i≤n; i++) t[i] = t[i−1]+t[i−2];
res=t[n]; free(t);
return res;
}
Complexit´e Θ(n)
Complexit´e spatiale Θ(n)
Suite de Fibonacci, version 3
Calcul de F
8-
- -
1 1 2
F2 F3 F4
2 3 5
1 2 3 F5 F6 F7 F8
8 13 21 34
5 3
F4
Complexit´e Θ(n)
Complexit´e spatiale Θ(1) (constante)
Michel Mauny (ENSTA) Algorithmique IN102-01 Pr´[email protected] 15 / 1
Suite de Fibonacci, version 3
Code it´ eratif en C, espace constant
int fibo3 (int n) { int f1, f2, t, i;
f1=1; f2=1;
for (i=2; i≤n; i++) { t=f2; f2=f1+f2; f1=t;
}
return f2; }
Complexit´e Θ(n)
Complexit´e spatiale Θ(1) (constante)
Suite de Fibonnacci, version 4
Fn+1 = 1×Fn + 1×Fn−1 Fn = 1×Fn + 0×Fn−1
Fn
Fn−1
=
1 1
1 0
×
Fn−1
Fn−2
=
1 1
1 0
n−1
×
F1
F0
On se ram`ene `a un probl`eme «d’exponentiation matricielle» (voir PC)
Complexit´e : Θ(log(n))
Complexit´e spatiale : Θ(1) (constante)
Michel Mauny (ENSTA) Algorithmique IN102-01 Pr´[email protected] 17 / 1
Pratique et th´ eorie sont d’accord
Temps de calcul
n 40 5.107 2.108 2.109 fibo1(n) 31 s calcul irr´ealisable fibo2(n) 0 s 18 s erreur d’ex´ecution fibo3(n) 0 s 4 s 19 s 3 min 15 s fibo4(n) 0 s 0 s 0 s 0 s
Le tri
But : trier un tableau de n ´el´ements (entiers, par exemple) D´enombrement de comparaisons
Algorithmes ´el´ementaires en O(n2)
Algorithmes plus sophistiqu´es font passer de O(n2) `a O(n×log(n))
Michel Mauny (ENSTA) Algorithmique IN102-01 Pr´[email protected] 19 / 1
Tri par insertion
Tri du tableau
tabde n entiers
void triInsertion(int ∗tab, int n) { int i,j, clef;
for (i=1; i<n; i++) { clef = tab[i]; j = i−1;
while ( (j≥0) && (tab[j]>clef) ) { tab[j+1] = tab[j]; j = j−1; } tab[j+1]=clef; }
}
L’´el´ement au rang k est rang´e parmi ses k−1 pr´ed´ecesseurs.
Complexit´e Θ(n2) dans le cas le pire : tableau inversement tri´e Complexit´e Θ(n2) en moyenne.
Le tri par fusion
Diviser,
(diviser, (...), et fusionner), et fusionner
......
R
. .. .. .. .. .. .. .. . .. .. ..
. .. .. .. .. .. .. .. . .. .. .. ......
R
@
@@R
.. . .. .. .. .. . .. .. .. .. .
.. . .. .. .. .. . .. .. .. .. ...... .
R
......
R
@@R
Tri r´ecursif ... ...
...
...
Fusion
r (p+r)/2
p
p r
Michel Mauny (ENSTA) Algorithmique IN102-01 Pr´[email protected] 21 / 1
Tri par fusion
Tri du tableau
tabentre les indices
pet
rvoid triFusion(int ∗tab, int p,r) { if (p<r) {
int q = (p+r)/2;
triFusion(tab, p, q);
triFusion(tab, q+1, r);
fusion(tab, p, q, r);
}
Tri rapide (quicksort)
Quicksort : tri r´ecursif bas´e sur un partitionnement.
Tri du tableau
tabentre les indices
pet
rvoid triRapide(int ∗tab, int p,r) { if (p<r) {
int q = partitionner(tab, p, r);
triRapide(tab, p, q−1);
triRapide(tab, q+1, r);
}
Complexit´e dans le cas le pire : Θ(n2) Complexit´e en moyenne : Θ(n×log(n))
Michel Mauny (ENSTA) Algorithmique IN102-01 Pr´[email protected] 23 / 1
Complexit´ e compar´ ee
Algorithme Cas le pire En moyenne Tri par insertion
Tri `a bulle Θ(n2) Θ(n2)
Tri rapide Θ(n2) Θ(n×log(n)) Tri par fusion Θ(n×log(n)) Θ(n×log(n))
Th´ eorie et pratique sont d’accord
Temps de calcul :
Michel Mauny (ENSTA) Algorithmique IN102-01 Pr´[email protected] 25 / 1
Th´ eorie et pratique sont d’accord
Th´ eorie et pratique. . .
Michel Mauny (ENSTA) Algorithmique IN102-01 Pr´[email protected] 27 / 1
Th´ eorie et pratique. . .
Exemple : produit matriciel
But : multiplier 2 matrices n×n
D´enombrement des additions et multiplications entre ´el´ements de base Algorithmes ´el´ementaires en O(n3)
Algorithmes tr`es sophistiqu´es en O(n2,376)
Michel Mauny (ENSTA) Algorithmique IN102-01 Pr´[email protected] 29 / 1
Qu’est-ce qu’un algorithme efficace ?
Complexit´e en moyenne
Complexit´e dans le pire des cas Facilit´e de mise en œuvre
Efficacit´e en pratique Algorithmes hybrides