Académique Documents
Professionnel Documents
Culture Documents
Hicham Bensaid
Plan
Prliminaires
Algorithmique et analyse des algorithmes
Structures de donnes
Stratgies
Premire partie
Prliminaires
Plan
Motivations
Qu'est ce qu'un algorithme ?
Algorithmique
Introduction
Plan
Motivations
Qu'est ce qu'un algorithme ?
Algorithmique
(premire
formalisation
de
mthodes systmatiques
de
ax 2
ax 2
bx
ax 2 + bx
ax 2 + c
bx + c
=
=
=
=
=
=
bx
c
c
c
bx
ax 2
Algorithmes probabilistes
Algorithmes approximatifs
Heuristiques
bonne approximation
souvent avec un
l'optimisme
s'appelle
et
Plan
Motivations
Qu'est ce qu'un algorithme ?
Algorithmique
Algorithmique (1)
Algorithmique (2)
La mthode classique
1
9
2
2
9
8
1
1
3
9
6
1
0
9
2
9
4
2
8
3
2
3
1
4
4
La multiplication l'amricaine
(et la marocaine)
9
1
8
9
2
1
1
6
9
3
0
9
2
2
4
9
5
8
3
3
2
5
1
4
4
4
La multiplication l'anglaise
1234
2468
4936
9872
19744
39488
78976
157952
315904
631808
1234
4936
19744
78976
157952
315904
631808
1210554
981 1234
L'ide :
=
=
=
=
=
=
...
((490 2) + 1) 1234
(490 (2 1234)) + 1234
((245 2) (2 1234)) + 1234
(245 (4 1234)) + 1234
((122 2 + 1) (4 1234)) + 1234
(122 (8 1234)) + (4 1234) + 1234
En
gnral :
n
n
n
A.10 2 + B C .10 2 + D = A.C .10n + (A.D + B.C ) .10 2 + B D
c'est mieux ?)
(pourquoi
i
ii
iii
iv
Multiplier Dcaler
09
09
81
81
12
34
12
34
Rsultat
1 0 8
3 0 6
9 7 2
2 7
1 2 1 0 5
4
2
2
0
5
5
4
4
i
ii
iii
iv
Multiplier Dcaler
0
0
9
9
1
2
1
2
2
1
1
0
Rsultat
0
0
9
1
1 0
8
8
Preuve de correction
Deuxime partie
Algorithmique et analyse des algorithmes
Plan
Algorithmique lmentaire
Problmes et instances
Correction des algorithmes
L'ecacit des algorithmes
Notations asymptotique
Notation asymptotique standard
Notation asymptotique conditionnelle
Analyse des algorithmes
Analyse des structures de contrle
Rsolution des formules de rcurrence
Rcurrences homognes
Changement de variable
Problmes et instances
contre-exemple
algo incorrect.
1
2
3
4
5
6
7
x = T [i ]
j = i 1
while j > 0 et x < T [ j ]
T [ j + 1] = T [ j ]
j = j 1
T [ j + 1] = x
do
Invariants de boucle
Invariant de boucle P : Au dbut de chaque itration (les lignes
entre 2 et 5) T [1..i 1]contient les lments initiaux de T [1..i 1]
mais dans le bon ordre
Les invariants de boucle pour prouver qu'un algorithme est
correct
3 choses dmontrer propos d'un invariant de boucle P :
Initialisation P est vrai avant la premire itration
Maintenance Si P est vrai avant une itration alors P reste vrai
avant la prochaine itration
Terminaison la sortie de la boucle, P fournit une proprit utile
pour prouver la correction de l'algorithme
Dmonstration.
preuve en utilisant l'invariant de boucle P
Initialisation i = 2. T [1..i 1] = T [1]. P est trivialement vrie
(T [1..1] est tri et est l'lment initial de T [1..1])
Maintenance de manire informelle la boucle for dcale vers la
droite les lments T [i 1], T [i 2], T [i 3], . . . et
remplace le trou par T [i ]
Terminaison la n i = n + 1 donc T [1..n] contient exactement les
lments initiaux de T tris dans le bon ordre, CQFD.
comment choisir la
meilleure ?
Approches
Empirique (a posteriori)
Thorique (a priori)
dterminer
mathmatiquement
a priori vs a posteriori
Principe d'invariance
et
t 2 (n) d .t 1 (n)
Le modle RAM
1
2
3
4
5
6
7
8
9
10
do
end
T [ j + 1] = x
end
end
end
T [mi n j ] = T [i ]
T [i ] = mi n x
end
: ordre croissant
= [7, 6, 5, 4, 3, 2, 1] : ordre dcroissant
U = [1, 2, 3, 4, 5, 6, 7]
C'est la
le test if
T [ j ] < mi n x
la cong
: ordre croissant
= [7, 6, 5, 4, 3, 2, 1] : ordre dcroissant
U = [1, 2, 3, 4, 5, 6, 7]
tremps quadratique
Pn
i =1 (i
1) = a.n 2 + b.n.c
1
2
3
4
5
6
7
8
9
for i = 2 to n do
/* cot : c1 n
x = T [i ] ;
/* cot : c2 (n 1)
j = i 1 ;
/* cot : c3 (n 1)
P
while j > 0 et x < T [ j ] do
/* cot : c4 ni=2 t j
Pn
T [ j + 1] = T [ j ] ;
/* cot : c5 i =2 (t j 1)
P
j = j 1 ;
/* cot : c6 ni=2 (t j 1)
end
T [ j + 1] = x ;
/* cot : c8 (n 1)
end
Algorithme 4 : Tri par insertion
*/
*/
*/
*/
*/
*/
*/
T (n) = c 1 n + c 2 (n 1) + c 3 (n 1) + c 4
P
c 6 ni=2 (t j 1) + c 8 (n 1)
Pn
i =2 t j
+ c5
Pn
i =2 (t j
1) +
n+C
2
comme n
lim BAn
2 = 0 : B n +C = o(A.n ) et peut tre ignor
(pour n assez grands)
par principe d'invariance, A peut galement tre ignor.
On dira que T (n) = (n )
Un algorithme T1 est plus ecace qu'un algorithme T2 si le
temps d'excution dans le cas le plus dfavorable de T1 a un
ordre de croissance infrieur celui de T2
Ecacit asymptotique
Plan
Algorithmique lmentaire
Problmes et instances
Correction des algorithmes
L'ecacit des algorithmes
Notations asymptotique
Notation asymptotique standard
Notation asymptotique conditionnelle
Analyse des algorithmes
Analyse des structures de contrle
Rsolution des formules de rcurrence
Rcurrences homognes
Changement de variable
Notation asymptotique
Fonctions de domaine N
La notation
(g (n)) = { f (n)|c 1 , c 2 constanteset n 0 , 0 c 1 .g (n) f (n)
c 2 .g (n), n n 0 }
La notation O
La notation borne une fonction par le haut et par le bas
Quand nous n'avons qu'une borne suprieure asymptotique,
nous utilisons la notation O
O(g (n)) = { f (n)|c constanteet n 0 , f (n) c.g (n), n n 0 }
On crit f (n) = O(g (n)) pour signier f (n) O(g (n)) ( f (n) est dans
dans l'ordre de g (n))
La notation
Thorme
Soient f (n), g (n) deux fonctions. f (n) = (g (n)) ssi f = O(g (n)) et
f (n) = (g (n)).
o et
ou bien
ou bien
f (n) (g (n))
ssi
g (n) o( f (n))
Symtrie
f (n) = (g (n))
ssi
g (n) = ( f (n))
Rexivit
f (n) = ( f (n))
f (n) = O( f (n))
f (n) = ( f (n))
Symtrie transpose
exemple de la multiplication
(
T (n) =
si
4 T (dn/2e) + b.n
sinon
des entiers :
n=1
T (n) n 2 |n 2N
f (n) |P (n) =
f (n) |P (n) =
O f (n) |P (n) =
Croissance borne
2. f (b.n) O f (n)
f (b.n) c. f (n)
Croissance borne
Croissance borne
Proprit de la croissance borne
Si f est croissance b -borne (pour un entier b 2) alors f est
croissance borne.
Dmonstration.
Soient a, b 2 deux entiers et f une fonction croissance
b -borne. Nous montrons que f est croissance a -borne.
Soit c une constante et n0 tels que f (bn) c f (n) et
f (n) f (n + 1) n n 0 .
Exemple
Dans la multiplication
des entiers il est plus simple d'obtenir
Donc
t (n) O f (n) .
Plan
Algorithmique lmentaire
Problmes et instances
Correction des algorithmes
L'ecacit des algorithmes
Notations asymptotique
Notation asymptotique standard
Notation asymptotique conditionnelle
Analyse des algorithmes
Analyse des structures de contrle
Rsolution des formules de rcurrence
Rcurrences homognes
Changement de variable
L'algorithmique c'est :
Comment concevoir un
bon
problme
Le squencement
P1
pour
t1
et t2 .
Calculer donc
tre erron ...
t2
indpendamment de
t1
Boucle For
1
2
for i = 1 to m do
P (i )
Taille de l'instance : n 6= m
Le cas le plus simple : T (P (i )) ne dpend pas de i
T (P (i )) = m t
Boucle For
Formulation quivalente
1 i =1
2 while i = 1 m
3
P (i )
4
i = i +1
do
(t + 3c)m + 2c
l = (m.t )
m=0
Pm
i =1 t (i )
1 function boIter(n )
2 i =1
3 j =0
4 for k = 1 to n do
5
j =i +j
6
i = j i
7
return
contrle de
Appels rcursifs
1
2
3
4
5
function boRec(n )
if n 2 then
return n
else
return boRec(n 1) + boRec(n 2)
si n {0, 1}
T (n 1) + T (n 2) + h (n) sinon
h (n) le temps ncessaire l'addition et au contrle
T (n) = f n (on verra aprs pourquoi) et donc complexit
exponentielle . . .
(
T (n) =
f 0
comment f
dcrot
function
rechercheDicho(T [1..n], x )
2 i =1
3 j =n
4 while i < j do
5
// T [i ] x T [ j ]
6
k = i + j 2
7
switch x T [k] do
8
case 1
9
j = k 1
10
case 0
11
i = j =k
12
return k
13
14
15
case 1
i = k +1
return i
f i, j = d = j i +1
f i , j : de n 0 (quand i j )
d,i, j
itration
=
d, i, j
( j i +1) = d
(i + j )
i + j 2i 2 i
2
2
d = j i + 1 = j i + j 2 j (i + j 1) = ( j i +1) =
2
2
1 d2
d
2
si
x < T [k]
si
x > T [k]
si
x = T [k]
d0 = n
1
n (par induction) donc il y a [lg (n)] + 1 itrations au
2l
plus (la boucle s'arrte quand l 1)
dl
complexit en lg (n)
La mthode intuitive
si n = 0
3T (n 2) + n sinon
Problme : dicult traiter la partie entire . . .
Solution : se restreindre 2N et utiliser la rgle de croissance
borne ...
Exemple : T (n) =
(
0
16
32
T (n)
19
65
211
665
T (1) = 0 + 1 et T (2) = 3 1 + 2 et
T (4) = 3 T (2) + 4 = 3 (3 1 + 2) + 4 = 32 1 + 3 2 + 4
T (n)
1
31+2
32 1 + 3 2 + 22
33 1 + 32 2 + 3 22 + 23
34 1 + 33 2 + 32 22 + 3 23 + 24
35 1 + 34 2 + 33 22 + 32 23 + 3 24 + 25
P
P i
T 2k = ki=0 3ki 2i = 3k ki=0 32 donc
k+1
/ 1 32
T 2k = 3k 1 23
Finalement : T 2k = 3k+1 2k+1
n = 2k donc k = lg (n) et T (n) = 3lg(n)+1 2lg(n)+1 = 3n lg 3 2n
ln(n)
ln(3)
(lg n = ln(n)
ln(2) = ln(3) ln(2) = lg3 (n) lg 3 et donc
Donc T (n) = n lg 3 |n 2N
soit T (n) =
lg 3
n
Rcurrences homognes
quation caractristique
p (x) = a 0 x k + a 1 x k1 + . . . + a k
la rcurrence.
p (x) =
Qk
p (x)
(il n'
Racines distinctes
Pk
n
i =1 c i r i
si n {0, 1}
f n1 + f n2 sinon
f n f n1 f n2 = 0 donc p (x) = x 2 x + 1 qui admet deux
racinespdistinctes : p
r 1 = 1+2 5 et r 2 = 12 5
La solution gnrale est f n = c1 r 1n + c2 r 2n
n
comme
fn =
p1
5
f0 = 0
et
f1 = 1
on a
p n p n i
1+ 5
12 5
2
c1
r 1 c1
+ c2
+ r 2 c2
= 0
= 1
Racines multiples
u n (x) = a 0 x n + a 1 x n1 + . . . + a k x nk = x nk p (x)
v n (x) = a 0 nx n + a 1 (n 1) x n1 + . . . + a k (n k) x nk
v n (x) = x.u n0 (x)
0
u n0 (x) = (x r )2 x nk q (x) =
0
(x r ) 2x nk q (x) + (x r ) x nk q (x)
u n0 (r ) = 0 et v n (r ) = 0 :
a 0 nr + a 1 (n 1) r n1 + . . . + a k (n k) r nk = 0
n
ainsi t n = nr est aussi une solution
En fait si la multiplicit de r est m alors
t n = r n , t n = nr n , t n = n 2 r n , . . . , t n = n m1 r n sont
donc
toutes des
Racines multiples
i 1
c i j n j r in
La solution gnrale : tn = li =1 mj =0
Les constantes ci j , 1 i l et 0 j mi 1 sont dtermines
grce aux k conditions initiales
Il y a k constantes ci j :
i =1
|
{z
}
m 1 +. . .+m l = k
i =2
+
...
|
{z
}
i =l
Exemple
tn =
(
n
5t n1 8t n2 + 4t n3
si n {0, 1, 2}
sinon
+ c2
+ 2c 2
+ 4c 2
+ 2c 3
+ 8c 3
= 0
= 1
= 2
n=0
n=1
n=2
La rsolution donne : c1 = 1, c2 = 2 et c3 = 21
Donc : tn = 2n+1 n2n1 2
constante
p (n) polynme de degr d
La partie gauche est identique au cas homogne
Pour rsoudre la rcurrence
on utilise le polynme
Exemple
tn =
si n = 0
4t n1 2
sinon
La rcurrence s'crit :
(
1
ici
b=2
et
t n 4t n1 = 2n
p (x) = 1 (d = 0)
Le polynme caractristique : (x 4) (x 2)
La solution gnrale : tn = c1 4n + c2 2n
Changement de variable
n 0 1, l 1, b 2
T : N R+
(n > n 0 ) n n 0 .b N
Changement de variable
(n > n 0 ) n n 0 .b N
On a ti l ti 1 = cn0k b k
On retrouve la forme des rcurrences non homognes a i p (i )
avec a = b k et p (i ) = cn0k (polynme constant de degr 0)
La solution gnrale de ti : ti = c1 l i + c2 b k
Il faut revenir T (n) : i = logb (n/n0 ) et donc d i = (n/n0 )logb d
d > 0
ti = T b i n0
donc
T (n) =
logb l
c1/n 0
n logb l + c 2 /n 0k n k
= c 3 n logb l + c 4 n k
Changement de variable
c
1 blk
T (n) = n k logb n
n logb l
si l < b k
si l = b k
si l > b k
Changement de variable
T (n) = n k |n n 0 b N
et donc
T (n) = n k
(par rgle de
croissance borne)
c3
T (n) < 0)
et donc
T (n) = n logb l
Solution :
soit
Inquation de rcurrence
Si au lieu d'avoir
On a :
(n > n 0 ) n n 0 .b N
(n > n 0 ) n n 0 .b N
O n
T (n) = O n k logb n
O n logb l
si l < b k
si l = b k
si l > b k
on a
(n > n 0 )
Alors :
k
T (n) = n k logb n
n logb l
si l < b k
si l = b k
si l > b k
Troisime partie
Structures de donnes
Plan
Introduction
Tableaux, piles et les
Listes
Graphes
Arbres
Arbres binaires de recherche et tri par ABR
Arbres AVL et tris par AVL
Files de priorit et tas
Tas et le de priorit
Tas et tri par tas
Dictionnaire et tables de hachage
Introduction
ensembles dynamiques
les oprations les plus frquentes :
exemple : le dictionnaire
Plan
Introduction
Tableaux, piles et les
Listes
Graphes
Arbres
Arbres binaires de recherche et tri par ABR
Arbres AVL et tris par AVL
Files de priorit et tas
Tas et le de priorit
Tas et tri par tas
Dictionnaire et tables de hachage
Tableau
TDA Pile
i ni t : St ack
push : E St ack St ack
t op : St ack ; E
pop : St ack ; E
empt y : St ack {vr ai , f aux}
si ze : St ack N
TDA File
i ni t : Queue
enqueue : E Queue St ack
head : Queue ; E
d equeue : Queue ; E
empt y : Queue {vr ai , f aux}
si ze : Queue N
Plan
Introduction
Tableaux, piles et les
Listes
Graphes
Arbres
Arbres binaires de recherche et tri par ABR
Arbres AVL et tris par AVL
Files de priorit et tas
Tas et le de priorit
Tas et tri par tas
Dictionnaire et tables de hachage
TDA Liste
i ni t : Li st (constructeur)
empt y : Li st E
conc at enat e : E Li st Li st
append : Li st Li st Li st
head : Li st {nil} E
t ai l : Li st {nil} Li st
Listes chaines
Suppression :
Recherche :
(n)
(n)
O(1)
Plan
Introduction
Tableaux, piles et les
Listes
Graphes
Arbres
Arbres binaires de recherche et tri par ABR
Arbres AVL et tris par AVL
Files de priorit et tas
Tas et le de priorit
Tas et tri par tas
Dictionnaire et tables de hachage
Graphes
est orient
Matrice d'adjacence
Si V
alors :
Listes d'adjacence
Exemple
Plan
Introduction
Tableaux, piles et les
Listes
Graphes
Arbres
Arbres binaires de recherche et tri par ABR
Arbres AVL et tris par AVL
Files de priorit et tas
Tas et le de priorit
Tas et tri par tas
Dictionnaire et tables de hachage
le de priorit
Soit
et
ABR : exemple
Un ABR : {6, 4, 7, 2, 5, 8}
Un contre-exemple :
p 6 >>
ppp
>>
p
p
>>
pp
p
p
p
>
p
p
pw
7>
4>
>>
>>
>>
>>
>>
>>
2
5
8
2>
>>
>>
>>
4 NNN
NNN
NNN
NNN
NN'
7>
>>
>>
pp 6 >>
>>
ppp
p
p
>>
p
p
p
p
>
wppp
7>
4>
>>
>>
>>
>>
>>
>>
8
1
2
3
4
5
complexit en (n)
La recherche
1
2
3
4
5
6
7
Version rcursive :
Entre : un ABR (noeud) x et une cl k
Resultat : un noeud de cl k ou nil sinon
function rechercherABR(x, k )
if x = nil or k == x.cl e then
return x
if k < x.cl e then
return rechercherABR(x.g auche(x), k )
else
return rechercherABR(x.d r oi t e(x), k )
Algorithme 6 : rechercherABR
La recherche
Version itrative (plus ecace en pratique) :
1
2
3
4
5
6
7
else
x = x.d r oi t e(x)
return x
Algorithme 7 : rechercherIterABR
Le minimum et le maximum
Les deux oprations en (h)
1
2
3
4
1
2
3
4
return x
Algorithme 8 : minimumABR
return x
Algorithme 9 : maximumABR
Le successeur et le prdcesseur
Complexit en O(h)
1
2
3
` e
4 y = x.p er
5 while y 6= nil and x == y.d r oi t e(x)
6
x=y
` e(x)
7
y = y.p er
8
return
do
Algorithme 10 : maximumABR
L'insertion
1
2
3
4
5
6
then
else
x = x.d r oi t e
11
` e=y
z.p er
y == nil then // A est vide
A.r aci ne = z
12
else if
9
10
13
14
15
if
else
then
y.d r oi t e = z
Algorithme 11 : insererABR
La suppression
La suppression : le remplacement
Algorithme de remplacement d'un sous arbre u par un sous arbre
1
2
3
remplacer et un
A.r aci ne = v
4
5
6
7
else if
8
9
if
` e.g auche
u == u.p er
`
u.p er e.g auche = v
then //
else
` e.d r oi t e = v
u.p er
v 6= nil then
` e = u.p er
` e
v.p er
Algorithme 12 : remplacer
La suppression
(a)
(b)
(d)
(c,d)
remplacer( A, z, y )
Algorithme 13 : remplacer
Arbres AVL
arbre linaire en
O lg(n)
O(n)
Arbres AVL
Proprit
AVL : pour chaque noeud n ,
Theorem
?>=<
89:;
3
@ABC
GFED
21
BB
~
BB
~
~
BB
~~
BB
~
~
~
89:;
?>=<
@ABC
GFED
5
25
@@
@@
@@
@@
@ABC
GFED
19
A aprs insertion de 15
@ABC
GFED
21
BB
|
BB
|
|
BB
||
BB
|
|
|
~
h=2 ?>=<
h=0
@ABC
GFED
89:;
25
5 B
BB
~
~
BB
~~
BB
~~
B
~
~~
89:;
?>=<
@ABC
GFED
3
19
|
|
||
||
|
~|
GFED
@ABC
15
A aprs suppression de 25
@ABC
GFED
@ABC
GFED
21
21
AA
BB
}
|
A
BB
}
|
AA
}
|
BB
}
AA
}
||
BB
}
|
A
}
|
~
}
~|
h=2 ?>=<
h=0
?>=<
89:;
GFED
@ABC
89:;
@ABC
GFED
5
25
5 B
25
AA
B
B
~
BB
AA
BB
~~
BB
~~
AA
BB
~~
BB
~~
~
A
BB
~
~
B
A
~ ~
~~
?>=<
89:;
@ABC
GFED
GFED
@ABC
89:;
?>=<
@ABC
GFED
3
19
30
3
19
}
|
}
|
}}
||
}}
||
|
~}}
~|
@ABC
GFED
@ABC
GFED
15
15
Procdure de rotation
?>=<
89:;
x
??
??
??
??
<<
<<
<<
<<
ks _
_ _
_ _
_ _
_ _
_ _
_ __ __ __
r ot at i onG auche(A,x)
_ _ _ _ _ _ _ _ _ +3
r ot at i onDr oi t e(A,x)
?>=<
89:;
x
>
1
2
3
4
5
6
7
if
then
` e = x.p er
` e
y.p er
8
9
10
11
12
13
14
else
` e.d r oi t e = y
x.p er
y.g auche = x
` e=y
x.p er
Algorithme 14 : rotationGauche
// TODO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if
then
` e = y.p er
` e
x.p er
` e == nil
y.p er
A.r aci ne = x
if
then
else if
else
` e.d r oi t e
y == y.p er
`
y.p er e.d r oi t e = x
then
` e.g auche = x
y.p er
x.d r oi t e = y
` e=x
y.p er
Algorithme 15 : rotationDroite
// TODO
quilibrage
Pour insrer dans un AVL, on insre le nud comme dans un
ABR puis on quilibre partir de ce nud en remontant vers
la racine
Entre : un sous-arbre x tel que x.g auche et x.d r oi t e sont quilibrs mais
else
1
2
3
4
5
6
9
10
11
12
13
if
else
then
Insertion
Entre : un arbre AVL
else
if
7
8
else
return equilibrer( A )
Algorithme 17 : equilibrer
Plan
Introduction
Tableaux, piles et les
Listes
Graphes
Arbres
Arbres binaires de recherche et tri par ABR
Arbres AVL et tris par AVL
Files de priorit et tas
Tas et le de priorit
Tas et tri par tas
Dictionnaire et tables de hachage
Le tas (Heap)
14
10
Le tas
son pre :
son ls
la hauteur est en
(lg(n))
maxHeapify
Entre : un tableau T et un noeud i tel que f g (i ) et f d (i ) sont
des max-heap mais T [i ] peut tre infrieur ses ls
Resultat : T est rendu tas
procedure maxHeapify(T, i )
1
2 g = g auche(i )
3 d = d r oi t e(i )
4 if l T.heapSi ze and T [g ] > T [i ]
5
pl usGr and = g
6 else
7
pl usGr and = i
then
8
9
if
10
11
12
if
then
Algorithme 18 : maxHeapify
maxHeapify
Files de priorit
: augmente la cl de l'lment
x.
Sa
1
2
maximum : O(1)
Entre : un tas T
Resultat : le maximum de T
function heapMaximum(T )
return T [1]
extraireMax : O(lg(n))
Entre : un tas T
Resultat : T est modi en en supprimant le max
function heapExtraireMax(T )
if T.t ai l l eTas < 1 then error "le tas est vide" ;
1
2
3 max = T [1]
4 T [1] = T [T.t ai l l eTas]
5 T.t ai l l eTas = T.t ai l l eTas
6 maxHeapify(T, 1)
7 return max
1
2
3
augmenterCle : O(lg(n))
4 T [x].cl e = k
5 while x > 1 and T [per e(x)].cl e < T [x].cl e
6
changer T [per e(x)] et T [x]
7
x = per e(x)
do
insererMax : O(lg(n))
1
2 T.t ai l l eTas = T.t ai l l eTas + 1 T [T.t ai l l eTas] =
Construire un tas
commence
1
2 T.t ai l l eTas = T.t ai l l e
3
4
Complexit de buildMaxHeap
O(h)
hauteur du nud
n lments = lg(n)
h+1
chaque hauteur h au plus [n/2
]+
nuds (pourquoi ?)
1P
P[lg(n)]
[lg(n)] h
h+1
C (n) =
[n/2
]
+
1
.O(h)
=
O
n.
h
h=0 2
h=0
P
x
k
(
k.x
=
si |x| < 1)
2
h=0
P(1x)
h
C (n) = O n.
= O(2.n) = O(n)
h=0 2h
la
1
2
3 T.t ai l l eTas = T.t ai l l e
4 for i = T.t ai l l e downto 2 do
5
echanger T [1] avec T [i ]
6
T.t ai l l eTas = T.t ai l l eTas 1
7
maxHeapify(T, 1)
Algorithme 20 : heapsort
Complexit en O(n lg(n)) :
complexit de build-max-heap en O(n)
complexit de max-heapify en O(lg(n))
max-heapify est appele n 1 fois
Heapsort est un excellent algorithme mais moins bon en
pratique que Quicksort ...
Plan
Introduction
Tableaux, piles et les
Listes
Graphes
Arbres
Arbres binaires de recherche et tri par ABR
Arbres AVL et tris par AVL
Files de priorit et tas
Tas et le de priorit
Tas et tri par tas
Dictionnaire et tables de hachage
et un ensemble d'objets
d'associer
E,
nil E
une cl de
un
Oprations :
i ni t : Di c t i onnar y (constructeur)
i nser er : K E Di c t i onnar y
r echer cher : K Di c t i onnar y E
suppr i mer : K Di c t i onnar y Di c t i onnar y
mod i f i er : K Di c t i onnar y Di c t i onnar y
Table de hachage
Si
K 6 [0..m 1]
Si
et
Oprations
1
2
1
2
3
Insertion :
Recherche :
Oprations
1
2
1
2
3
Suppression
Modication
= E [N ]
liste (chaine)
n = n 0 + n 1 + . . . + n m1
E [n j ] = = n/m
la taille de la liste T [ j ]
avec cl
dans
T [h(k)]
examins
X i j = I {h(k i ) = h(k j )}
E [X i j ] = 1/m
=
=
=
=
h P
1 n
Pn
j =i +1 X i j
n i =1
Pn
1 Pn
1
+
E
[X
]
i
j
j =i +1
n i =1
1
n
Pn
i =1
1
1 + nm
1+
1+
1
j =i +1 m
Pn
1
i =1 (n i ) = 1 + nm
Pn
Pn1
k=0
1
1 + 2nm
.n(n 1) = 1 + n1
2m
1 + /2 + /(2n)
(1 + )
Fonctions de hachage
h(k) = bk.mc
vrie l'hypothse
La mthode de division
h(k) = k mod m
plus
Un bon exemple
= n/m = 3
Un mauvais exemple
Mais attention, les choses ne sont pas toujours simples . . .
m = 2p 1
k une chaine de
P
k 0 = nj=0 a j 2 j p
En eet, a j 2 j p = a j (2 j p 1 + 1) = a j + a j (2p ) j 1
P j 1
a j 2 j p = a j + (2p 1)( i =0 (2p )i ) et donc a j 2 j p
mod (2p 1) = a j mod (2p 1)
P
P
k 0 = nj=0 a j 2 j p donc k 0 mod (2p 1) = nj=0 a j mod (2p 1)
La mthode de multiplication
A ]0, 1[
une constante
Hypothse :
la taille d'un mot sur la machine est w bits et k tient dans un
seul mot
On prend A = sw o s ]0..2w [ (s est un entier)
2
La mthode de multiplication
La mthode de multiplication
p
D. Knuth suggre que A 5 1 /2 est un bon choix
s = 2654435769
et
k.s = 327706022297664
32
k.s = 76300
+ 17612864
| {z }.2
| {z }
r1
r0
r 0 = 00000001000011
{z
}001100000001000000
|
00000001000011 3 + 64 = 67
h(k) = 67
14
bits
w = 32
Adressage ouvert
Insertion
U
|{z}
{0, 1, . . . , m 1}
{z
}
|
{0, 1, . . . , m 1}
|
{z
}
Insertion
Entre : un tableau T et une cl k
Resultat : k insre dans T si non prsente
procedure openAddressHashInsert(T, k )
1
2 i =0
3 repeat
4
j = h(k, i )
5
if T [ j ] == nil
6
T [j] = k
7
return j
8
9
10
11
then
else
i = i +1
until i == m ;
error "dbordement de la table de hachage"
Algorithme 25 : openAddressHashInsert
Recherche
1
2 i =0
3 repeat
4
j = h(k, i )
5
if T [ j ] == k
6
return j
7
8
9
i = i +1
then
until T [ j ] == nilori == m ;
return nil
Algorithme 26 : openAddressHashSearch
Suppression
Cl k supprime la case
Sinon
parmi
h 0 : U {0, 1, . . . , m 1}
Examen linaire
(i + 1)/m
Examen quadratique
Double hachage
La squence dpend de
examen linaire/quadratique)
h 2 (k)
exemple :
proche
m0
Exemple
m = 13
h 1 (k) = k mod 13
h 2 (k) = 1 + k mod 11
14 1[13]
et 14 3 mod [11]
h(14, 0) = 1 (la case 1 occupe
on passe)
h(14, 1) = (1 + 1.4) mod 13 (la
case 5 occupe on passe)
h(14, 2) = 9 la case est vide on y
insre 14
Pour rsumer
Adressage ouvert :
meilleure utilisation de la mmoire (pas de pointeurs en plus)
Chainage :
moins sensible aux fonctions de hachage
AO se dgrade pour
> 0.7
et ne peut dpasser
=1
Quatrime partie
Stratgies
Plan
Programmation dynamique
Algorithmes gloutons
Diviser pour rgner
Tri par fusion
Tri rapide (quicksort)
Exploration des graphes
Stratgies
Programmation dynamique
Algorithmes gloutons
Diviser pour rgner
Nous avons dj vu d'autres techniques :
Approche incrmentale (tri par insertion)
Exploitation des proprits des S.D.
Rcurrence
des
Plan
Programmation dynamique
Algorithmes gloutons
Diviser pour rgner
Tri par fusion
Tri rapide (quicksort)
Exploration des graphes
Programmation dynamique
1.
2.
3.
4.
1 2 3 4 5 6 7 8 9 10
1 5 8 9 10 17 17 20 24 30
Dcoupe optimale
Exemple : des tiges de taille = 4
Dcoupe optimale
n1
Problme : complexit exponentielle. Il y a 2
= 2n /2
Pk=n k k nk
n
C x y
dcoupage possibles ... (x + y) =
k=0 n
r n = max p n , r 1 + r n1 , r 2 + r n2 , . . . , r n1 + r 1
structure optimale
rn
p i + r ni
Solution rcursive
La formule r n = max p i + r ni suggre d'utiliser diviser pour
rgner (solution rcursive)
1
2
3
4 q =
5 for i = 1 to n do
6
q = max q, p[i ] + couperTigeRec(p, n i )
7
return q
Complexit ?
Algorithme 27 : couperTigeRec
Pn1
i =0
Pn1
i =0
T (i )
T (i ) = 1 + 2.
Pn1
i =0
T (i )
Complexit exponentielle
Pn1
i =0
Pn1
i =0
T (i ) = 2n 1
T (i ) = T (n))
89:;
?>=<
jjj 4 <U<UUUUUUU
j
j
j
UUUU
<
jj
UUUU
jjjj
j
j
u
*?>=<
89:;
?>=<
89:;
?>=<
89:;
3 I
2
1
m
m
I
<
m
II
m
<
m
m
<
I
m
m
I
$
vmmm
89:;
?>=<
?>=<
89:;
89:;
?>=<
89:;
?>=<
?>=<
89:;
89:;
?>=<
0
0
0
2
1
1
<<<
89:;
?>=<
?>=<
89:;
?>=<
89:;
89:;
?>=<
0
0
0
1
?>=<
89:;
0
&?>=<
89:;
0
Approches
ri
tels que
on calcule
r0
rk
ncessite le calcul de
i <k
ensuite
r1
puis
r2
puis
r3,
...
Version mmoise
1
2
3
4
5
6
7
8
9
else
q =
for i = 1 to n do
10 r [n] = q
11 return q
Algorithme 28 : couperTigeMemAux
Version mmoise
1
2
3
4
5
return couperTigeMemAux(p, n, r )
Algorithme 29 : couperTigeMem
Complexit en O
2
n
Version bottom-up
Entre : un tableau p et un entier n indiquant la taille de la tige
Resultat : le gain maximum
function couperTigeBotUp(p, n, r )
Soit r [0..n] un nouveau tableau
1
2
3 r [0] = 0
4 for j = 1 to n do
5
q =
6
for i = 1 to j do
7
q = max q, p[i ] + r [ j 1]
8
r [j] = q
return r [n]
Algorithme 30 : couperTigeBotUp
Complexit en O
2
n
Plan
Programmation dynamique
Algorithmes gloutons
Diviser pour rgner
Tri par fusion
Tri rapide (quicksort)
Exploration des graphes
Algorithmes gloutons
Instance du problme
10
11
si
fi
1
4
3
5
0
6
5
7
3
9
5
9
6
10
8
11
8
12
2
14
12
16
{a 3 , a 9 , a 11 }
optimale
{a 1 , a 4 , a 8 , a 11 }
Rsolution du problme
On va rsoudre le problme en plusieurs tapes
1. Essayer de rchir une solution de type programmation
dynamique
le choix glouton
Si j
ai
et
S i j = ak | f i sk f k s j
|A i j | = |A i k | + |A k j | + 1
Sinon on aurait
Ai j
A i k {a k } A k j
solution de
Si j
et suprieure
c i , j = c (i , k) + c k, j + 1
0
max {c (i , k) + c (i , k) + 1}
a k S i j
ak
choisir :
si S i j = ;
sinon
Correction de l'intuition
Theorem
Dmonstration.
|A k | = |A k |
a i 6= a j
fm )
et donc
Ak
est maximal
de
Ak
Ak
le sont et a j est
dmarrent aprs
fj
et
1
2 m = k +1
3 while m n and s[m] < f [k]
4
m = m +1
5
6
7
8
if
do
then
return am tchesCompatiblesMax( f , s, m, n )
else
return ;
Algorithme 31 : tchesCompatiblesMax
On appelle tchesCompatiblesMax( f , s, 0, n )
Si les f i sont tris alors complexit en (n) (durant tous les
appels rcursifs, une tche n'est traite qu'une seule fois)
mn
Un ensemble
Un ensemble
1
2
3 S = ; // Le sous-ensemble solution
4 while C 6= ; and not sol ut i on(S) do
5
x = sel ec t i on(C )
6
C =C x
7
if f ai sabl e(S x) then
8
S =Sx
9
10
11
12
if
sol ut i on(S)
return S
then
else
return "Pas de solution"
Algorithme 32 : gloutonIteratif
C = {a 1 , . . . , a n }
encore traite
f ai sabl e
ai 1 , . . . , ai l
ssi les
a i j mutuellement
compatibles
Pn
i =1 x i v i
sous la contrainte P
avec
maximiser
P
ni=1 x i p i
v i > 0, p i > 0 et 0 x i 1
Algorithme glouton
1
2
3
4
5
6
7
8
9
10
11
12
else
13
14
15
do
d'articles
// Le sous-ensemble solution est construit dans S
// initialisation
return x
Algorithme 33 : sacADosGlouton
Algorithme glouton
v i /p i
10 20 30 40 50
20 30 66 40 60
2.0 1.5 2.2 1.0 1.2
slection
max v i
min p i
max v i /p i
valeur
xi
0
1
1
0
1
1
1
1
1
0.5
1
0
1
0
0.8
146
156
164
Solution optimale
Theorem
Dmonstration.
On suppose (s.p.g.) que v 1 /p 1 v 2 /p 2 . . . v n /p n .
X = (x 1 , . . . , x n ) solution optimale.
Solution optimale
Dmonstration.
(suite)
Si tous les x i = 1 alors la solution est optimale
Sinon, soit j le plus petit indice tq x j < 1
Pn
i < j x i = 1 et i > j x i = 0 et
i =1 x i p i = P
Pn
Soit Y = y 1 , . . . , y n une solution ralisable. donc
i =1 y i p i P
Pn
et i =1 (xi y i )p i 0
Pn
y i )p i . pv ii
V (X ) V (Y ) =
Si
Si
si
i =1 (x i
i < j , x i = 1 et donc (x i y i ) 0 et v i /p i v j /p j
i > j , x i = 0 et donc (x i y i ) 0 et v i /p i v j /p j
i = j , x i = y i et donc (x i y i )(v i /p i ) = (x i y i )(v j /p j )
V (X ) V (Y ) (v j /p j )
Pn
i =1 (x i
y i )p i 0
10 20
30
60 100 120
6
5
4
ou bien 1 + 2 : valeur =
ou bien 1 + 3 : valeur =
Plan
Programmation dynamique
Algorithmes gloutons
Diviser pour rgner
Tri par fusion
Tri rapide (quicksort)
Exploration des graphes
tels que
T [p..q]
sont tris
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for
to do
if
then
else
T [k] = D[ j + +]
Algorithme 34 : fusion
et
T [q + 1, r ]
1
2
3
4
5
6
triFusion(T, p, q )
triFusion(T, q + 1, r )
fusion(T, p, q, r )
Algorithme 35 : triFusion
Quicksort
complexit moyenne en
(n lg(n))
Quicksort : l'algorithme
1
2
3
4
5
Quicksort : partitionner
Entre : un tableau T , deux indices p, r
Resultat : q la position du pivot
function partitionner(T, p, r )
1
2 x = T [r ]
3 i = p 1
4 for j = 1 to r 1 do
5
if T [ j ] x then
6
i = i +1
7
changer T [i ]
8 q = i +1
9 changer T [q]
10 return q
et T [ j ]
et T [r ]
Algorithme 37 : partitionner
Exemple
est le pivot x
Les lments en gris clair =
premire partition (tous x )
Les lments en gris fonc =
deuxime partition (tous > x )
Les autres ne sont pas encore
traits
(Le dernier lment est le pivot)
A la dernire tape on change
T [r ] et T [i + 1]
T [r ]
Si T [ j ] > x , on incrmente j
Si T [ j ] x on incrmente i , puis on change T [i ] et T [ j ]
enn on incrmente j
T (n) = max
0qn1
S. q. T (k) ck 2
T (q) + T (n q 1) + (n)
k n 1
T (n) = max
0qn1
S. q. T (k) d k 2
T (q) + T (n q 1) + (n)
k n 1
T (n) = min
0qn1
T (q) + T (n q 1) + (n)
S. q. T (k) c.k lg k
avec
T (n)
c. ((n 1)/2) lg ((n 1)/2) + c. ((n 1)/2) lg ((n 1)/2) + (n)
T (q) + T (n q 1) + (n)
T (n) = min
S. q. T (k) c.k lg k
0qn1
0qn1
lim f 0 (q) =
q0+
et
lim f 0 (q) = +
qn1
et
donc
f 0 : % 0 %+
T (n)
c. ((n 1)/2) lg ((n 1)/2) + c. ((n 1)/2) lg ((n 1)/2) + (n)
Donc T (n) = (n lg n)
1/n
to r 1 do
if T [ j ] x then
i = i +1
changer T [i ] et T [ j ]
q = i +1
changer T [q] et T [r ]
return q
Algorithme 38 : partitionner
Lemme
Soit X le nombre de comparaisons excutes dans la ligne 5 de
par t i t i on durant toute la dure d'une excution de qui cksor t
sur un tableau de taille n
Le temps d'excution de qui cksor t est O(n + X )
Dmonstration.
Preuve immdiate
Quicksort : valuation de X
Zi j = {z i , z i +1 , . . . , z j }
et
de l'vnement comparaison de
zi
Quicksort : valuation de X
hP
i
n1 Pn
X
E [X ] = E
i
j
i =1
j =i +1
Pn1 Pn
E [X ] = i =1 j =i +1 E X i j
P
Pn
E [X ] = n1
i =1
j =i +1 P r z i est
compar z j
z i est compar z j ssi z i ou z j est le pivot de Zi j
Pn1 Pn
E [X ] = 2.
E [X ] = O(n lg n)
i =1
Plan
Programmation dynamique
Algorithmes gloutons
Diviser pour rgner
Tri par fusion
Tri rapide (quicksort)
Exploration des graphes