Algorithmes 2
Algorithmes 2
1
Piles
et
Files
2
LIFO
et
FIFO
• Listes
par>culières
– Accès
aux
éléments
aux
extrémités
• LIFO
– Last
In
First
Out
– C’est
une
pile
• FIFO
– First
In
First
Out
– C’est
une
file
3
Exemple
de
pile
• Pile
d’assieLe
ou
boite
de
comprimés
• On
peut
– Ajouter
au
sommet
(empiler)
– Supprimer
du
sommet
(dépiler)
4
Type
abstrait
Pile
• Opéra>ons
possibles
– estPlein(),
estVide()
– empiler()
(ou
push())
– depiler()
(ou
pop())
5
Exemple
:
expressions
posVixées
• Une
expression
est
posVixée
si
l’opérateur
suit
les
opérandes
– Reverse
Polish
Nota>on
– L’opérateur
suit
toujours
le
deuxième
opérande
• Exemples
:
– 7
*
2
=>
7
2
*
– 7
*
(2
+
5)
=>
7
2
5
+
*
• Très
pra>que
car
non
ambigue
6
Évalua>on
des
expressions
posVixées
• On
u>lise
une
pile
• On
lit
l’expression
de
gauche
à
droite
– Si
opérande,
on
l’empile
– Si
opérateur,
on
dépile
deux
opérandes,
on
fait
le
calcule,
on
empile
le
résultat
7
Algorithme
en>er
evalPosVix(caractère
expression[1..N])
{
pile
p
vide;
pour
(i
de
1
à
N)
{
si
(estNombre(expression[i]))
empiler(p,
nombre(expression[i]));
sinon
si
(estOpérateur(expression[i])
{
op1
<-‐
dépiler(p);
op2
<-‐
dépiler(p);
résultat
<-‐
opère(op1,
op2,
expression[i]);
empiler(p,
résultat);
}
}
retourner
(dépiler(p));
}
8
Implémenta>on
d’une
pile
• Avec
une
liste
chainée
– Ajout/suppression
en
tête
– Très
facile
• Avec
un
tableau
– Sommet
de
la
pile
à
la
fin
– Ajout/suppression
en
fin
de
tableau
– Très
facile,
sauf
si
empiler
dans
tableau
plein
9
Type
abstrait
file
(FIFO)
• Opéra>ons
possibles
– estVide()
– ajouterQueue()
– supprimerTete()
10
Implémenta>on
d’une
file
(FIFO)
11
Arbres
12
Défini>on
et
vocabulaire
• Un
arbre
est
un
ensemble
d’éléments
appelés
nœuds
organisés
par
niveaux
de
façon
hiérarchique
à
par>r
d’un
nœud
dis>ngué
appelé́
racine
• Soit
a
un
arbre
et
x
un
nœud
de
a
– Les
nœuds
reliés
à
x
au
niveau
immédiatement
inférieur
s’appellent
les
fils
de
x
– Si
f
est
un
fils
de
x,
x
est
son
père
– Le
nœud
s’il
existe
immédiatement
à
droite
de
x
et
de
même
père
que
x
s’appelle
le
frère
(ou
alternant)
de
x
– Un
nœud
sans
fils
est
une
feuille
– Le
fils
le
plus
à
gauche
d’un
nœud
s’appelle
le
successeur
du
nœud
• On
u>lise
souvent
un
vocabulaire
imagé
– Père,
grand-‐père,
oncle,
frère,
pe>t
fils…
13
Défini>on
et
vocabulaire
• Soit
a
un
arbre
– Un
sous
arbre
de
a
est
un
arbre
de
racine
un
nœud
quelconque
de
a
– Une
branche
de
a
est
une
suite
de
nœuds
reliés
de
la
racine
à
une
feuille
– Si
a
est
tel
que
chaque
nœud
a
au
plus
n
fils,
a
est
dit
n-‐aire
– Un
arbre
2-‐aire
s’appelle
un
arbre
binaire
– Dans
un
arbre
binaire,
on
parle
de
fils
droit
et
de
fils
gauche
d’un
nœud
14
Définitions, vocabulaire
Défini>on
e t
vocabulaire
La figure suivante résume l’ensemble de ces
définitions
5.28
15
Arbres
n-‐aires
vs
arbres
binaires
• Il
y
a
une
rela>on
étroite
entre
arbres
n-‐aires
et
binaires,
plus
précisément
tout
arbre
n-‐aire
peut
se
représenter
par
un
seul
arbre
binaire
et
la
correspondance
est
bijec>ve
• chaque
nœud
x
de
l’arbre
binaire
est
un
nœud
y
de
l’arbre
n-‐aire
de
sorte
que
– Le
fils
gauche
de
y
est
le
fils
gauche
de
x
– Le
frère
de
y
est
le
fils
droit
de
x
• L’étude
des
arbres
binaire
est
donc
primordiale
• Une
liste
est
un
arbre
1-‐aire
!
16
Arbres
n-‐aires
vs
arbres
binaires
hLp://en.wikipedia.org/wiki/Binary_tree
17
Arbres
binaires
18
Défini>on
et
vocabulaire
• Un
arbre
binaire
est
défini
par
l’équa>on
récurrente
B = φ ∪ (Bg , a, Bd )
• Autrement
dit,
un
arbre
binaire
est
soit
– Vide
– Soit
formé
d’un
nœud
(racine)
et
de
deux
sous-‐
arbres
binaires
gauche
et
droit
19
Profondeur
-‐
Niveau
• La
profondeur
d’un
nœud
x
est
le
nombre
de
nœuds
rencontrés
depuis
la
racine
sur
l’unique
branche
menant
à
x
– Profondeur
de
la
racine
=
0
• Le
niveau
d’un
arbre
est
Profondeur
=
0
l’ensemble
des
nœuds
se
trouvant
à
la
même
Profondeur
=
1
profondeur
Profondeur
=
3
20
Hauteur
• La
hauteur
d’un
arbre
est
la
profondeur
maximum
de
ses
nœuds
• Exemple
:
– Hauteur
=
3
21
Arbres
par>culiers
• Un
arbre
est
filiforme
si
chaque
père
n’a
qu’un
fils
– Un
arbre
filiforme
de
n
nœuds
a
une
hauteur
de
n-‐1
• Un
arbre
est
complet
si
tout
ses
niveaux
sont
remplis
22
Propriétés
d’un
arbre
binaire
complet
• Proposi;on
:
un
arbre
complet
de
hauteur
h
a
2h+1
-‐1
nœuds
• Preuve
:
– Il
y
a
1
nœud
(racine)
au
niveau
0
– Il
y
a
2
nœuds
au
niveau
1,
4
au
niveau
2…
– Total
=
1+
2+
3+
…
+
2h
=
2h+1
-‐1
23
Propriétés
d’un
arbre
binaire
complet
• Proposi;on
:
un
arbre
complet
de
n
nœuds
est
de
hauteur
log2(n+1)-‐1
• Preuve
:
– On
u>lise
la
proposi>on
précédente
– n
=
2h+1
-‐1
=>n+1=2h+1
…
24
Propriétés
d’un
arbre
binaire
• Proposi;on
:
pour
tout
arbre
binaire
de
n
nœuds
et
de
hauteur
h,
on
a
h +1 ≤ n ≤ 2 h+1 −1
#$log 2 (n)%& ≤ h ≤ n −1
• Preuve
:
pour
n
nœuds,
la
hauteur
max
est
pour
l’arbre
filiforme,
la
hauteur
min
pour
l’arbre
complet
25
Implémenta>on
d’un
arbre
binaire
• S’implémente
de
deux
façons
– Tableau
ou
chainage
• Tableau
– Chaque
élément
du
tableau
mémorise
l’élément,
et
les
indices
des
fils
gauche
et
droit
– Ges>on
des
indices
«
à
la
main
»
26
Implémenta>on
d’un
arbre
binaire
• Exemple
Indice
0
1
2
3
4
5
6
7
8
A
Element
F
E
A
D
B
C
G
Fg
5
4
B C
Fd
8
6
2
1
D E F
27
Implémenta>on
d’un
arbre
binaire
• Chainage
– Structure
récursive,
comme
pour
les
listes
B C B C
D D
A D
A A
B C
B C B C
D D
29
Inser>on/Suppression
de
nœuds
• Suppression
• Plusieurs
cas
à
considérer
suivant
le
nœud
qu’on
supprime
– 0
fils
(facile)
– 1
fils
(facile)
– 2
fils
(moins
facile)
• On
y
reviendra…
30
Parcours
d’un
arbre
• Parcourir
un
arbre
consiste
à
visiter
tout
ses
nœuds
avec
une
stratégie
de
parcours
• 2
familles
de
parcours
– En
largeur
(breadth
first
search)
• On
visite
tous
les
nœuds
d’un
niveau
avant
de
passer
au
suivant
– En
profondeur
(depth
first
search)
• On
visite
les
fils
d’un
nœud
avant
de
passer
au
frère
31
Parcours
en
profondeur
• 3
variantes
suivant
l’ordre
de
visite
du
nœud
(racine)
• Préfixé
:
racine,
fg,
fd
A
• Infixé
:
fg,
racine,
fd
• PosVixé
:
fg,
fd,
racine
B C
• Exemple
:
D
E
– Préfixé
:
A,
B,
D,
C,
E
– Infixé
:
D,
B,
A,
E,
C
– PosVixé
:
D,
B,
E,
C,
A
32
Exemple
:
parcours
infixe
• Facile
à
écrire
en
récursif
parcours_infixe(nœud
n)
{
si
(n
=
NIL)
retourner;
parcours_infixe(n.fg);
afficher(n.element)
parcours_infixe(n.fd);
}
33
Recherche
• Comment
savoir
si
un
élément
est
dans
un
arbre?
– Il
faut
regarder
tous
les
nœuds
• Donc
complexité
en
O(n)
L
– Pas
mieux
qu’une
liste
chainée
ou
qu’un
tableau
en
vrac
• Justement,
si
on
ne
meLait
pas
tout
en
vrac
?
34
Arbres
binaires
de
recherche
35
Défini>on
• Ajout
d’une
propriété
aux
arbres
binaires
Pour
chaque
nœud
x,
tous
les
éléments
du
sous
arbre
gauche
(resp.
droit)
ont
des
valeurs
inférieures
(resp.
supérieurs)
ou
égales
à
celle
de
x.
• Successeur
– Le
successeur
de
x
est
le
plus
pe;t
y
tel
que
y
>
x
• La
recherche
se
fait
par
dichotomie!
36
Cherchez
l’ABR
• Des
arbres
suivants,
lesquels
sont
des
ABR?
5
7
5
2 7 2 5 2 7
1 3 6 8 1 3 6 8 1 6 8
5 5 5
2 9 4 7
1
3
3
10
1
6
6
8
Recherche
• La
recherche
se
fait
par
dichotomie
rechercher(noeud
x,
element
k)
{
si
x
=
NIL
ou
x.element
=
k
alors
retourner
x;
si
k
<
x.element
rechercher(x.fg,k);
sinon
rechercher(x.fd,k);
}
5
2
7
Rechercher
3:
5
→
2
→
3
Rechercher
6:
5
→
7
→
6
1
3
6
8
Recherche
-‐
2
• Proposi>on
:
la
complexité
de
la
recherche
dans
un
arbre
binaire
de
recherche
pour
le
pire
des
cas
est
O(h)
avec
h
hauteur
de
l’arbre
• Preuve
:
Dans
le
pire
des
cas,
l’élément
à
trouver
est
sur
une
feuille
de
l’arbre,
il
faut
donc
parcourir
un
chemin
de
l’arbre
partant
de
la
racine
jusqu’à
ceLe
feuille,
soit
h
recherches.
Inser>on
-‐
1
• Permet
d’ajouter
un
nouveau
nœud
à
un
arbre
• L’inser>on
modifie
la
structure
de
l’arbre
et
doit
donc
s’assurer
de
la
conserva>on
de
sa
propriété
5
5
Inserer(15)
2
7
2
7
Inserer(9)
1
3
6
8
1
3
6
8
15
9
Inser>on
–
2
inserer(arbre
T,
nœud
z)
{
y
←
NIL
x
←
T.racine
tant
que
x
≠
NIL
faire
y
←
x
On
cherche
un
nœud
qui
n’a
pas
si
z.clé
<
x.clé
de
fils
pour
y
ajouter
z
alors
x
←
x.gauche;
sinon
x
←
x.droit;
si
y
=
NIL
L’arbre
était
en
fait
vide
alors
T.racine
←
z;
sinon
si
z.clé
<
y.clé
alors
y.gauche
←
z;
On
ajoute
z
a
la
«
bonne
»
place
sinon
y.droit
←
z;
Suppression
-‐
1
• La
suppression
enlève
un
nœud
à
l’arbre
• Elle
doit
conserver
la
propriété
de
l’ABR
5
5
2
7
supprimer(15)
2
8
1
3
6
8
Supprimer(7)
1
3
6
9
15
9
5
5
2
7
supprimer(9)
2
7
1
3
6
8
1
3
6
8
15
15
9
Suppression
-‐
3
• Suppression
d’un
nœud
avec
un
unique
fils
(presque
trivial)
5
5
2
7
supprimer(15)
2
7
1
3
6
8
1
3
6
8
15
9
9
Suppression
-‐
4
• Suppression
d’un
nœud
ayant
2
fils
(non
trivial)
5 6
2 8 Supprimer(5) 2 8
1 3 6 9 1 3 7 9
7 15 15
Successeur de 5 11 11
5
2
7
3
2
1
3
6
8
1
T1
=
n1
=
1
Hauteur
d’un
arbre
équilibré
-‐
2
• On
considère
Th,
h≥2.
Il
doit
donc
avoir
un
sous
arbre
de
profondeur
h-‐1
et
un
autre
de
profondeur
h-‐1
ou
h-‐2.
• Pour
tout
k,
un
arbre
de
hauteur
k
a
un
sous
arbre
de
hauteur
k-‐1.
Donc
nk
>
nk-‐1
• Supposons
que
les
deux
sous
arbres
de
Th
sont
Th-‐1
et
Th-‐1
– alors
on
pourrait
en
remplacer
un
par
Th-‐2
et
garder
la
propriété
d’équilibrage
– on
aurait
alors
moins
de
nœuds
car
nh-‐1
>
nh-‐2
– notre
arbre
ne
serait
donc
pas
minimal:
CONTRADICTION!
Hauteur
d’un
arbre
équilibré
-‐
3
• Th
a
donc
a
un
sous
arbre
Th-‐1
et
un
autre
Th-‐2
h+2 h+2
1 ⎛ 1 + 5 ⎞ 1 ⎛ 1 − 5 ⎞
nh = ⎜ ⎟ − ⎜ ⎟ −1
5 ⎜⎝ 2 ⎟⎠ 5 ⎜⎝ 2 ⎟⎠
Hauteur
d’un
arbre
équilibré
-‐
3
h+2
⎛ 1 − 5 ⎞ ⎛ 1 − 5 ⎞
• Etant
donne
que
⎜
⎟
<
1
le
terme
⎜⎜
⎟⎟
sera
pe>t
⎜ ⎟
⎝ 2 ⎠ ⎝ 2 ⎠
• Donc
h+2
1 ⎛ 1 + 5 ⎞
nh + 1 = ⎜ ⎟ + O(1)
5 ⎝ 2 ⎟⎠
⎜
• Comme
nh
nombre
minimal
de
nœuds
pour
un
arbre
équilibré
de
hauteur
h,
tout
autre
arbre
équilibré
de
hauteur
h
aura
n
nœuds
tel
que
h + 2
1 ⎛ 1 + 5 ⎞
n + 1 ≥ nh + 1 = ⎜ ⎟ + O(1)
5 ⎝ 2 ⎟⎠
⎜
1
• Ce
qui
donne
h≤ log(n + 1) + O(1) ≈ 1.44 log(n + 1)
1+ 5
log
2
Complexité
des
opéra>ons
• Nous
avons
donc
montré
qu’un
arbre
équilibré
compose
de
n
nœuds
aura
une
hauteur
majorée
par
1.44log(n+1)
55
Arbres
AVL
• Inventés
par
G.M.
Adelson-‐Velsky
et
E.M.
Landis
– «
An
algorithm
for
the
organiza>on
of
informa>on
»,
1962
• Arbre
binaire
de
recherche
auto-‐équilibrant
– Plus
facile
d’être
équilibré
si
on
l’est
régulièrement
– Après
chaque
opéra>on,
un
rééquilibrage
est
effectué
si
nécessaire
Facteur
d’equilibrage
• Facteur
d’équilibrage
d’un
noeud
– On
définit
le
facteur
d’équilibrage
d’un
noeud
comme
la
différence
de
hauteur
entre
le
sous
arbre
droit
et
le
sous
arbre
gauche
• Quelles
sont
les
valeurs
possibles?
• Pour
des
raisons
de
performance,
les
nœuds
d’un
AVL
con>ennent
tous
leur
facteur
d’équilibrage
– Recalculé
après
chaque
opéra>on
• Permet
de
déterminer
si
une
opéra>on
de
rééquilibrage
est
nécessaire
Exemple
d’AVL
40
1
20 1 50 -‐1
30 0 45 -‐1 70 0
44
0
Rota>on
• La
rota>on
est
une
opéra>on
locale
dans
un
arbre
qui
ne
modifie
pas
l’ordre
infixe
des
clés
• On
dis>ngue
2
types
de
rota>ons:
gauche
et
droite
Rota>on
droite(T,
y)
y
x
x γ α y
Z
X Y X Y Z
D
0
C
2
• Rota>on
gauche
D
1
C
0
X
Y
Z
X
Y
Z
Double
rota>on
gauche-‐droite
A
-‐2
A
-‐2
B 1 B 1
Z
Z
C
0
X Y X
Y1 Y2
• On
décompose
le
sous
arbre
droit
de
B
en
un
nœud
et
ses
2
sous
arbres
• On
effectue
2
rota>ons,
une
gauche,
puis
une
droite
Double
rota>on
gauche-‐droite
-‐
2
A
-‐2
A
C
B
1
C
A
Z
Z
C
B
B
0
X
Z
Y1
Y2
Y1
Y2
Y1
Y2
X
X
AVL
-‐
Résumé
• Un
AVL
est
donc
un
ABR
où
l’équilibre
est
maintenu
après
chaque
opéra>on
• Nous
avons
vu
l’inser>on,
la
suppression
fonc>onne
suivant
le
même
principe
• On
peut
montrer
(pas
ici)
que
– L’inser>on
nécessite
au
maximum
1
rééquilibrage
– La
suppression
peut
nécessiter
au
maximum
autant
de
rééquilibrages
que
la
hauteur
de
l’arbre
• Il
existe
d’autres
familles
d’arbres
auto
équilibrants,
par
exemple
les
arbres
Rouge-‐Noir
Tris
itéra>fs
64
Introduc>on
• Trier
consiste
à
ordonner
les
éléments
d’un
ensemble
suivant
une
rela>on
d’ordre
• Un
algorithme
de
tri
est
un
algorithme
qui
– prend
en
entrée
une
série
de
valeurs
(souvent
un
tableau)
– produit
en
sor>e
une
séquence
de
valeurs
ordonnée
• Plus
formellement,
un
tri
doit
produire
une
sor>e
sa>sfaisant
les
2
propriétés
suivantes
– La
séquence
de
sor>e
est
une
permutation de
la
séquence
d’entrée
– Chaque
élément
de
la
séquence
est
plus
grand
que
les
précédents
Tri
compara>f
et
tri
en
place
• Un
tri
compara>f
est
un
tri
qui
n’u>lise
qu’un
opérateur
binaire
pour
placer
les
éléments
– En
général
l’opérateur
“inférieur
ou
égal”
• Cet
opérateur
doit
fournir
un
ordre
total
– Si
a
≤
b
et
b
≤
a
alors
a
=
b
(an>symétrie)
– Si
a
≤
b
et
b
≤
c
alors
a
≤
c
(transi>vité)
– a
≤
b
or
b
≤
a
pour
tout
a
et
b
• Pour
trier
un
ensemble,
on
peut
avoir
besoin
d’un
ensemble
intermédiaire
– Ex:
trier
un
tableau
en
passant
par
un
ou
plusieurs
tableaux
intermédiaires
• Si
un
tri
ne
nécessite
pas
de
placer
plus
d’un
nombre
nombre
constant
d’éléments
hors
de
l’ensemble
d’entrée,
il
est
dit
sur place
Taxonomie
des
tris
• Dans
The Art Of Computer Programming (Vol 3),
Donald
E.
Knuth
analyse
25
algorithmes
de
tri
différents
• Mais
ce
n’est
qu’une
frac>on
de
ce
qui
existe
• Pourquoi
tant
d’algorithmes?
– Parce
que
chacun
a
des
avantages
et
des
inconvénients
– Ce
qui
marche
bien
pour
un
problème
ne
marche
pas
bien
pour
un
autre
• Il
n’y
a
donc
pas
un
«
meilleur
»
tri,
il
y
en
a
plusieurs
– Mais
il
y
en
a
qui
sont
très
mauvais
Tri
par
inser>on
( )
• Un
tri
simple
consiste
à
séparer
les
données
en
2
ensembles
:
triées
et
non
triées
• Le
but
est
de
diminuer
l’ensemble
des
non
triées
au
profit
des
triées
• Pour
chacun
des
éléments
non
triés
– On
prend
le
premier
– On
le
place
à
la
bonne
posi>on
parmi
les
triés
Tri
par
inser>on
( )
Ensemble
trié
Ensemble
non
trié
10 3 5 7 8
10 3 5 7 8
3 10 5 7 8
3 5 10 7 8
3 5 7 10 8
3
5
7
8
10
Ecriture
de
l’algorithme
• L’algorithme
fonc>onne
sur
chacun
des
éléments
non
triés
– On
suppose
qu’ils
sont
dans
un
tableau
– U>lisa>on
d’une
boucle
pour
• Prendre
le
premier
élément
non
trié
– hmmm
pas
trop
difficile
• Insérer
le
nouvel
élément
à
la
bonne
posi>on
– Il
faut
trouver
la
bonne
posi>on
et
décaler
les
autres
Inser>on
d’un
élément
dans
un
tableau
trié
en
place
• On
u>lise
le
même
tableau
– On
suppose
que
l’élément
à
insérer
se
trouve
immédiatement
après
les
éléments
triés
– On
le
fait
remonter
jusqu’à
la
bonne
posi>on
– C’est
à
dire
jusqu’à
ce
que
celui
juste
à
côté
soit
plus
pe>t
que
lui
• Soit
on
trouve
une
bonne
posi>on
entre
2
éléments
• Soit
on
s’arrête
parce
qu’on
a
aLeint
la
limite
du
tableau
Inser>on
d’un
élément
dans
un
tableau
trié
en
place
3 5 7 10 8 3 5 7 8 10
1 3 7 9 10 1 3 7 9 10 3 1 7 9 10 3 1 7 9 10
• L’élément
le
plus
grand
remonte
vers
la
fin
du
tableau
comme
une
bulle
d’eau
vers
la
surface
Tri
à
bulle
-‐
Algorithme
TriBulle(réel
T[1..N])
{
pour
(i
de
1
à
N)
{
pour
(j
de
1
à
N-‐i)
{
On
va
traiter
tous
les
éléments
du
tableau
Sous
si
(T[j]
>
T[j+1])
tableau
permuter(T[j],T[j+1])
non
trié
}
}
}
89
Problème
du
tri
• Peut-‐on
trouver
une
borne
sur
les
tris
en
général?
• Ques>on
fondamentale
– Savoir
si
il
existe
une
solu>on
op>male
• Exemples
de
limites
connues
– Vitesse
de
la
lumière
– Mouvement
perpétuel
– Compression
– Zéro
absolu
• On
va
considérer
un
tri
d’un
point
de
vue
théorique
Problème
du
tri
• Soit
une
séquence
de
nombres
<a1,…,an>
• Un
tri
est
une
permuta>on
<a1’,…,an’> telle que a1’≤a2’≤…
≤an’
• Lorsqu’un
tri
repose
uniquement
sur
des
comparaisons
entre
les
éléments
d’entrée,
il
est
dit
comparatif.
• C’est
à
dire
qu’étant
donné
deux
éléments
an et
am on
effectue
l’
un
des
tests
suivants
a n < a m, a n ≤ a m, a n = a m, a n ≥ a m, a n > a m
• Peut-‐on
trouver
une
borne
pour
la
complexité
dans
le
pire
des
cas?
Borne
inférieure
• Nous
allons
supposer
que
nous
trions
un
ensemble
d’éléments
dis>ncts
⇒
pas
de
comparaison
an = am
• On
suppose
que
toutes
les
comparaisons
sont
de
la
forme
an ≤ am
• Le
tri
étant
une
permuta>on,
nous
allons
étudier
toutes
les
permuta>ons
possibles
• Pour
faciliter
nos
réflexions,
nous
allons
u>liser
un
arbre
de
décision.
• Un
arbre
de
décision
permet
de
lister
tous
les
choix
possibles
et
tous
les
résultats
possibles
Arbre
de
décision
• On
considère
une
course
de
chevaux
(C1,C2,C3)
• Combien
de
combinaisons
possibles
à
l’arrivée
:
6
• Lister
toutes
les
combinaisons
• 2
rela>ons
possibles
– Arrive
avant
(AV)
ou
arrive
après
(AP)
• On
fait
un
arbre
– Les
noeuds
sont
des
couples
de
chevaux
– Branche
gauche
pour
AV,
branche
droite
pour
AP
Arbre
de
décision
C1:C2
AV
AP
C2:C3
C1:C3
AP
AV
AP
C3,C2,C1
C1,C2,C3
C1:C3
C2:C3
AP
AV
a2:a3
a1:a3
≤ > ≤ >
• ALen>on,
on
ne
parle
que
des
tris
comparatifs,
il
existe
d’autres
tris
qui
ont
une
borne
inférieure
différente.
Mais
où
sont
les
tris
efficaces?
• Pour
l’instant,
nos
recherches
sont
décevantes
• Nous
avons
analysé
des
tris
qui
sont
loin
d’être
op>maux
• En
théorie,
on
devrait
pouvoir
s’approcher
de
Ω(n* ln2(n)) dans
le
pire
des
cas
• On
en
est
vraiment
loin
avec
Θ(n2)
• Nous
allons
essayer
une
autre
approche:
– Diviser pour régner (Divide and Conquer)
Fusion
d’ensembles
triés
• Soit
A
et
B
deux
ensembles
triés
• Comment
obtenir
un
ensemble
C=A
U
B
tel
que
C
soit
trié?
3
5
7
8
10
3
5
7
8
10
3
5
7
8
10
5
7
8
10
1 2 4 6 9 2 4 6 9 4 6 9 4 6 9
1
1
2
1
2
3
Algorithme?
Complexité?
Dépend
de
la
taille
des
deux
ensembles
Pas
de
différence
entre
pire,
meilleur
et
moyen
Tout
est
en
Θ(a+b)=
Θ(n)
Tri
par
fusion
(merge
sort)
• U>lise
une
approche
diviser
pour
régner
avec
une
fusion
• Cas
trivial
– Un
ensemble
contenant
0
ou
1
élément
• Cas
non
trivial
– Un
ensemble
de
plus
d’un
élément
– On
divise
l’ensemble
en
deux
sous
ensembles
– On
les
trie
– On
fusionne
les
ensembles
triés
Tri
par
fusion
(merge
sort)
Tri-‐Fusion(A[1..N])
{
si
1<N
{
q
←
(N+1)/2
Tri-‐Fusion(A[1..q])
Tri-‐Fusion(A[q+1..N])
Fusionner(A[1..q],A[q+1..N])
}
}
Fusionner
fusion(A,p,q,r)
{
element[1..r-‐p]
tmp;
a
<-‐
p
b
<-‐
q+1
pour
k
de
1
a
longeur(tmp)
{
On
prend
un
si
((b>r)
ou
((a<=q)
et
(A[a]<A[b])))
élément
du
Boucle
sur
le
tmp[k]
<-‐
A[a]
sous-‐tableau
tableau
a
<-‐
a+1
gauche
fusionné
sinon
tmp[k]
<-‐
A[b]
(final)
b
<-‐
b+1
}
pour
k
de
1
a
longueur(tmp)
{
A[k+p]
<-‐
tmp[k]
}
}
104
Complexité
du
tri
par
fusion
• Soit
T(n)
le
temps
pour
trier
un
tableau
de
taille
n
• Ce
temps
est
composé
de
– La
phase
de
fusion
en
Θ(n)
– 2
phases
de
tri
des
2
demi
tableaux
• Donc
T(n/2)
T(n/2)
deux fusions en Θ(n/2)
• Donc