Vous êtes sur la page 1sur 72

Algorithmique et Analyse d’Algorithmes

Algorithmique et Analyse d’Algorithmes


L3 Info
Cours 2 : algorithmes récursifs, analyse en moyenne

Benjamin Wack

2020 – 2021

1 / 31
Algorithmique et Analyse d’Algorithmes

La dernière fois
I Qu’est-ce qu’un algorithme
I Notion de coût
I Notions de complexité (au pire) et ordres de grandeur

Aujourd’hui
I Comment écrire un algorithme récursif ?
I Comment évaluer son coût ?

I Comment évaluer l’efficacité d’un algorithme plus finement que dans


le pire cas ?
I Tri rapide

2 / 31
Algorithmique et Analyse d’Algorithmes

Plan

Algorithme récursif
Schémas récursifs
Analyse de coût

Analyse en moyenne
Contexte
Méthode

Tri rapide

3 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Plan

Algorithme récursif
Schémas récursifs
Analyse de coût

Analyse en moyenne
Contexte
Méthode

Tri rapide

4 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Notion d’algorithme récursif


Aux constructions habituelles on ajoute la possibilité d’appeler
l’algorithme lui-même sur une autre donnée.
Calcul de la factorielle
FACT(n)
Données : un entier n
Résultat : la valeur de n! = n × (n − 1) × . . . × 2 × 1
if n = 0
return 1
return n×FACT(n − 1)

5 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Notion d’algorithme récursif


Aux constructions habituelles on ajoute la possibilité d’appeler
l’algorithme lui-même sur une autre donnée.
Calcul de la factorielle
FACT(n)
Données : un entier n
Résultat : la valeur de n! = n × (n − 1) × . . . × 2 × 1
if n = 0
return 1
return n×FACT(n − 1)

I caractéristique de l’algorithme, pas du problème


I non limité aux entiers, et particulièrement adapté aux structures
récursives
I ce n’est pas de la triche !
Travail fourni = identifier la structure récursive du problème

5 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Structure
Prérequis
I Savoir directement résoudre le problème sur des cas de base
I Savoir utiliser une (ou des) instances plus petites pour résoudre le
problème

« plus petit » = entier inférieur, sous-arbre, liste plus courte... mais pas
seulement

6 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Structure
Prérequis
I Savoir directement résoudre le problème sur des cas de base
I Savoir utiliser une (ou des) instances plus petites pour résoudre le
problème

« plus petit » = entier inférieur, sous-arbre, liste plus courte... mais pas
seulement
PAIR(n)
Données : un entier n
Résultat : booléen « n est-il pair ? »
if n = 0
return Vrai
else
return PAIR(n − 2)

6 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Structure
Prérequis
I Savoir directement résoudre le problème sur des cas de base
I Savoir utiliser une (ou des) instances plus petites pour résoudre le
problème

« plus petit » = entier inférieur, sous-arbre, liste plus courte... mais pas
seulement
PAIR(n)
Données : un entier n
Résultat : booléen « n est-il pair ? »
if n = 0
return Vrai
else
return PAIR(n − 2)

Tout chemin d’exécution doit mener à un cas de base en temps fini.


6 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Écriture d’un algorithme récursif

Un problème qui casse pas des briques


On cherche à construire un mur de longueur n avec des briques de
longueur 2 ou 3.
2+2+3+2+3+2

3+2+2+2+2+3

3+3+3+2+3

Exemples pour n = 14

Combien y a-t-il de possibilités distinctes ?

7 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Analyse du problème

8 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Analyse du problème
I Données :

8 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Analyse du problème
I Données :
la longueur n du mur (les tailles des briques sont fixées)
(la récursivité ne peut donc porter que sur n)
I Utilisation de sous-problèmes :

8 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Analyse du problème
I Données :
la longueur n du mur (les tailles des briques sont fixées)
(la récursivité ne peut donc porter que sur n)
I Utilisation de sous-problèmes :
Une fois la première brique posée il reste un mur de longueur < n.
I Reconstruction de la solution :

8 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Analyse du problème
I Données :
la longueur n du mur (les tailles des briques sont fixées)
(la récursivité ne peut donc porter que sur n)
I Utilisation de sous-problèmes :
Une fois la première brique posée il reste un mur de longueur < n.
I Reconstruction de la solution : Les arrangements de longueur n
= ceux commençant par une brique de longueur 2
+ ceux commençant par une brique de longueur 3
I Cas de base :

8 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Analyse du problème
I Données :
la longueur n du mur (les tailles des briques sont fixées)
(la récursivité ne peut donc porter que sur n)
I Utilisation de sous-problèmes :
Une fois la première brique posée il reste un mur de longueur < n.
I Reconstruction de la solution : Les arrangements de longueur n
= ceux commençant par une brique de longueur 2
+ ceux commençant par une brique de longueur 3
I Cas de base : n = 1 impossible ; pour n = 2 ou 3 un seul choix.

8 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Analyse du problème
I Données :
la longueur n du mur (les tailles des briques sont fixées)
(la récursivité ne peut donc porter que sur n)
I Utilisation de sous-problèmes :
Une fois la première brique posée il reste un mur de longueur < n.
I Reconstruction de la solution : Les arrangements de longueur n
= ceux commençant par une brique de longueur 2
+ ceux commençant par une brique de longueur 3
I Cas de base : n = 1 impossible ; pour n = 2 ou 3 un seul choix.

BRIQUES(n)
if n = 1
return 0
else if n = 2 ou n = 3
return 1
else
return BRIQUES(n − 2) + BRIQUES(n − 3)

8 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Exemple : Conversion en base 2

Spécification
Étant donné un entier n, on cherche à produire à l’écran l’écriture binaire
de n.

Idée
On sait que :
I n % 2 donne le dernier bit
I les bits les plus à gauche sont aussi ceux de n/2.

9 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Exemple : Conversion en base 2

Spécification
Étant donné un entier n, on cherche à produire à l’écran l’écriture binaire
de n.

Idée
On sait que :
I n % 2 donne le dernier bit
I les bits les plus à gauche sont aussi ceux de n/2.

Remarque
Le problème ne se résout pas naturellement de manière impérative : il
faut « commencer par la fin ».

9 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Exemple : Conversion en base 2 (suite)

Structure récursive
I Les cas n = 0 et n = 1 sont connus.
I On sait résoudre le problème si on a résolu l’instance n/2.

10 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Exemple : Conversion en base 2 (suite)

Structure récursive
I Les cas n = 0 et n = 1 sont connus.
I On sait résoudre le problème si on a résolu l’instance n/2.

Écriture binaire d’un entier


ECRITURE_BINAIRE(n)
if n < 2
Écrire n
else
ECRITURE_BINAIRE(n/2)
Écrire n % 2

Un algorithme récursif ne se termine en général pas par l’appel récursif.

10 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs

Exemple : Conversion en base 2 (suite)

Structure récursive
I Les cas n = 0 et n = 1 sont connus.
I On sait résoudre le problème si on a résolu l’instance n/2.

Écriture binaire d’un entier


ECRITURE_BINAIRE(n)
if n < 2
Écrire n
else
ECRITURE_BINAIRE(n/2)
Écrire n % 2

Un algorithme récursif ne se termine en général pas par l’appel récursif.


Et si on voulait stocker le résultat dans un tableau ?
10 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût

Plan

Algorithme récursif
Schémas récursifs
Analyse de coût

Analyse en moyenne
Contexte
Méthode

Tri rapide

11 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût

Retour sur la factorielle


Rappel
Le coût de l’appel d’une procédure est :
I le coût du corps de la procédure pour ses paramètres d’appel
I plus le coût de l’évaluation de ses paramètres.

Calcul de la factorielle
FACT(n)
if n = 0
return 1
return n × FACT (n − 1)

12 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût

Retour sur la factorielle


Rappel
Le coût de l’appel d’une procédure est :
I le coût du corps de la procédure pour ses paramètres d’appel
I plus le coût de l’évaluation de ses paramètres.

Calcul de la factorielle
FACT(n)
if n = 0
return 1
return n × FACT (n − 1)
ß
CFACT (0) = 0
D’où
CFACT (n) = 2 + CFACT (n − 1)

12 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût

Retour sur la factorielle


Rappel
Le coût de l’appel d’une procédure est :
I le coût du corps de la procédure pour ses paramètres d’appel
I plus le coût de l’évaluation de ses paramètres.

Calcul de la factorielle
FACT(n)
if n = 0
return 1
return n × FACT (n − 1)
ß
CFACT (0) = 0
D’où
CFACT (n) = 2 + CFACT (n − 1)
La fonction de coût d’un algorithme récursif obéit généralement
elle-même à une équation récursive.
12 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût

Quelques équations récursives classiques


Coût arithmétique (un seul appel qui s’effectue en temps constant)
Si C (n) = a + C (n − 1)
alors C (n) = a × n + C (0) = O(n) : coût linéaire

13 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût

Quelques équations récursives classiques


Coût arithmétique (un seul appel qui s’effectue en temps constant)
Si C (n) = a + C (n − 1)
alors C (n) = a × n + C (0) = O(n) : coût linéaire

Équations linéaires simples (un seul appel qui coûte f (n))


Si C (n) = C (n − 1) + f (n)
Pn
alors C (n) = C (0) + f (0) + f (1) + · · · + f (n) = C (0) + i=0 f (i)

Comme C (0) est constant on peut généralement l’ignorer.

13 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût

Quelques équations récursives classiques


Coût arithmétique (un seul appel qui s’effectue en temps constant)
Si C (n) = a + C (n − 1)
alors C (n) = a × n + C (0) = O(n) : coût linéaire

Équations linéaires simples (un seul appel qui coûte f (n))


Si C (n) = C (n − 1) + f (n)
Pn
alors C (n) = C (0) + f (0) + f (1) + · · · + f (n) = C (0) + i=0 f (i)

Comme C (0) est constant on peut généralement l’ignorer.

En particulier
Pn Pn n(n+1)
i=1 1 = n = O(n) ; i=1 i= 2 = O(n2 )
Pn
et de manière plus générale i=1 i k = O(nk+1 ).
13 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût

Quelques équations récursives classiques (2)

Coût géométrique (a appels)


Si C (n) = a × C (n − 1) (avec a > 1)
alors C (n) = an × C (0) = O(an )

14 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût

Quelques équations récursives classiques (2)

Coût géométrique (a appels)


Si C (n) = a × C (n − 1) (avec a > 1)
alors C (n) = an × C (0) = O(an )

Équations linéaires multiples


Plus généralement si on a

C (n) = a1 C (n − 1) + a2 C (n − 2) + . . . ak C (n − k)

alors sauf cas pathologique on obtient une solution de la forme

C (n) = O(nk−1 λn ).

autrement dit une croissance au moins exponentielle.

14 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût

Cas particuliers
Calcul de coût direct
Il est parfois possible de donner directement le coût.
Ex : l’algorithme d’écriture binaire effectue clairement blog2 (n)c divisions.

15 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût

Cas particuliers
Calcul de coût direct
Il est parfois possible de donner directement le coût.
Ex : l’algorithme d’écriture binaire effectue clairement blog2 (n)c divisions.

Chaque appel compte

A(n) B(n)
if n = 0 if n = 0
return 1 return 1
else else
return A(n-1) + A(n-1) + 1 return 2×B(n-1) + 1
I mathématiquement équivalents
I algorithmiquement très différents

15 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût

Cas particuliers (2)

PGCD
SOUSTRACTIONS (a, b)
Données : Deux entiers a et b non nuls
Résultat : Le plus grand diviseur commun à a et b
if a = b
return a
else if a > b
return SOUSTRACTIONS (a − b, b)
else
return SOUSTRACTIONS (b, a)

« Décroissance » des données en un sens à préciser

16 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Contexte

Plan

Algorithme récursif
Schémas récursifs
Analyse de coût

Analyse en moyenne
Contexte
Méthode

Tri rapide

17 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Contexte

Motivation
Recherche séquentielle en table
RECH_SEQ(e, T , n)
Données : l’élément e à rechercher, un tableau T de taille n
Résultat : le premier indice i tel que T [i] = e, ou −1 s’il est absent
i =0
while i < n et puis T [i] 6= e
i =i +1
if i < n
return i
else
return −1

18 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Contexte

Motivation
Recherche séquentielle en table
RECH_SEQ(e, T , n)
Données : l’élément e à rechercher, un tableau T de taille n
Résultat : le premier indice i tel que T [i] = e, ou −1 s’il est absent
i =0
while i < n et puis T [i] 6= e
i =i +1
if i < n
return i
else
return −1

Complexité au pire
I la boucle while ne peut pas faire plus de n comparaisons
I pire cas facile à exhiber : e absent de T ou en dernière position
D’où CRECH_SEQ (n) = O(n)
18 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Contexte

Plus finement

I Pour tous les autres cas on fait strictement moins de n


comparaisons !
I Ce genre d’algorithme est utilisé de façon répétée :
le coût d’une exécution « au pire » n’est pas très informatif.

19 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Contexte

Plus finement

I Pour tous les autres cas on fait strictement moins de n


comparaisons !
I Ce genre d’algorithme est utilisé de façon répétée :
le coût d’une exécution « au pire » n’est pas très informatif.

Idée : moyenne de coût de plusieurs exécutions


On « lisse » les écarts de coûts en prenant en compte les différentes
instances possibles :

C moy (n) = moyenne(coût(d)) pour toutes les données d de taille n

Mais une moyenne uniforme est-elle représentative ?


Et comment faire une moyenne sur tous les tableaux possibles ?

19 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode

Plan

Algorithme récursif
Schémas récursifs
Analyse de coût

Analyse en moyenne
Contexte
Méthode

Tri rapide

20 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode

Calcul de coût moyen


Présupposé indispensable
Modèle probabiliste de répartition des données
i.e. pour une taille n fixée, probabilité pour chacune des données d
possibles qu’elle soit donnée en entrée à l’algorithme

21 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode

Calcul de coût moyen


Présupposé indispensable
Modèle probabiliste de répartition des données
i.e. pour une taille n fixée, probabilité pour chacune des données d
possibles qu’elle soit donnée en entrée à l’algorithme

Il doit correspondre à une réalité d’utilisation :


I recherche dans un dictionnaire : la plupart du temps le mot existe
I accès mémoire : l’élément recherché est souvent au début (cache)
I les algorithmes de tri reçoivent souvent des données presque triées
I ...

21 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode

Calcul de coût moyen


Présupposé indispensable
Modèle probabiliste de répartition des données
i.e. pour une taille n fixée, probabilité pour chacune des données d
possibles qu’elle soit donnée en entrée à l’algorithme

Il doit correspondre à une réalité d’utilisation :


I recherche dans un dictionnaire : la plupart du temps le mot existe
I accès mémoire : l’élément recherché est souvent au début (cache)
I les algorithmes de tri reçoivent souvent des données presque triées
I ...

Formule générale : moyenne pondérée

C moy (n) =
P
(Proba que l’entrée soit d) × (coût de l’algo sur d)
données d de taille n

21 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode

Fin de l’exemple : recherche en table

Deux paramètres sont nécessaires :


I probabilité P(e ∈ T ) notée p
I dans le cas où e ∈ T , on supposera équiprobable de le trouver à
chacun des indices 0..n − 1.

22 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode

Fin de l’exemple : recherche en table

Deux paramètres sont nécessaires :


I probabilité P(e ∈ T ) notée p
I dans le cas où e ∈ T , on supposera équiprobable de le trouver à
chacun des indices 0..n − 1.
On trouve alors :
n
moy P p
CRECH_SEQ (n) = (1 − p) × n + n ×i
i=1
p n(n+1)
= (1 − p)n + n 2

= (1 − p)n + p n+1
2

moy n+1
En particulier si p = 1 on a CRECH_SEQ (n) = 2

22 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode

En pratique
I L’analyse au pire et au mieux donne déjà des informations sur la
complexité moyenne :

C min (n) ≤ C moy (n) ≤ C max (n)

Mais attention en général C moy (n) 6= (C min (n) + C max (n))/2

23 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode

En pratique
I L’analyse au pire et au mieux donne déjà des informations sur la
complexité moyenne :

C min (n) ≤ C moy (n) ≤ C max (n)

Mais attention en général C moy (n) 6= (C min (n) + C max (n))/2


I Regrouper les données de même coût :
X
C moy (n) = c × (probabilité des données engendrant un coût c)
coûts c

23 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode

En pratique
I L’analyse au pire et au mieux donne déjà des informations sur la
complexité moyenne :

C min (n) ≤ C moy (n) ≤ C max (n)

Mais attention en général C moy (n) 6= (C min (n) + C max (n))/2


I Regrouper les données de même coût :
X
C moy (n) = c × (probabilité des données engendrant un coût c)
coûts c

I Parfois un modèle simplifié s’impose pour que les calculs soient


faisables :
I minimiser les paramètres
I privilégier l’équiprobabilité

23 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

Plan

Algorithme récursif
Schémas récursifs
Analyse de coût

Analyse en moyenne
Contexte
Méthode

Tri rapide

24 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

Le tri rapide

I aussi appelé QuickSort, Tri par segmentation...


I inventé par Tony Hoare en 1961
I utilisé dans de nombreuses librairies comme tri
« de référence »
C.A.R. Hoare
(1934-)

25 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

Le tri rapide

I aussi appelé QuickSort, Tri par segmentation...


I inventé par Tony Hoare en 1961
I utilisé dans de nombreuses librairies comme tri
« de référence »
C.A.R. Hoare
(1934-)

Quelques caractéristiques
I fondamentalement récursif
I en place (pas besoin de tableau auxiliaire)
I non stable (les éléments « égaux » ne conservent pas leur ordre
initial)

25 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

Principe général

D A E C B F

26 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

Principe général

D A E C B F

1. Choisir un élément : le pivot


D A E C B F

26 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

Principe général

D A E C B F

1. Choisir un élément : le pivot


D A E C B F

2. Partitionner le tableau selon ce pivot :


I éléments inférieurs au pivot à gauche
I éléments supérieurs au pivot à droite
A C B D F E

26 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

Principe général

D A E C B F

1. Choisir un élément : le pivot


D A E C B F

2. Partitionner le tableau selon ce pivot :


I éléments inférieurs au pivot à gauche
I éléments supérieurs au pivot à droite
A C B D F E

3. Trier récursivement les deux sous-tableaux ainsi formés


A B C D E F

26 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

Schéma de l’algorithme
TriSegmentation (E )
Donnée-résultat Un ensemble E de n éléments comparables
Effet de bord E est trié par ordre croissant

6 ∅
if E =
pivot := Extrait (E )
// retire l’élément pivot de E
(E1 , E2 ) := Segmentation (E,pivot)
// E1 éléments plus petits que pivot
// E2 éléments plus grands que pivot
Assemble ( TriSegmentation (E1 ), pivot, TriSegmentation (E2 ))

27 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

Schéma de l’algorithme
TriSegmentation (E )
Donnée-résultat Un ensemble E de n éléments comparables
Effet de bord E est trié par ordre croissant

6 ∅
if E =
pivot := Extrait (E )
// retire l’élément pivot de E
(E1 , E2 ) := Segmentation (E,pivot)
// E1 éléments plus petits que pivot
// E2 éléments plus grands que pivot
Assemble ( TriSegmentation (E1 ), pivot, TriSegmentation (E2 ))

À instancier avec les contraintes suivantes :


I E est représenté dans un tableau
I Segmentation en place
I Après l’appel à Extrait on ne touche plus au pivot

27 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

Conception récursive

I Les appels récursifs opéreront sur des sous-tableaux


⇒ 2 paramètres en plus : les indices entre lesquels on travaille
I Reconstruction triviale : E1 et E2 sont triés et leurs éléments sont
bien placés par rapport au pivot
I Cas de base : tableau de taille 0 ou 1 (déjà trié)

28 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

Conception récursive

I Les appels récursifs opéreront sur des sous-tableaux


⇒ 2 paramètres en plus : les indices entre lesquels on travaille
I Reconstruction triviale : E1 et E2 sont triés et leurs éléments sont
bien placés par rapport au pivot
I Cas de base : tableau de taille 0 ou 1 (déjà trié)

TriSegmentation (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Effet de bord T est trié par ordre croissant entre les indices g et d
if g < d
pivot := T [g]
Partition (T , g, d, pivot)
TriSegmentation (T , g, ?)
TriSegmentation (T , ?, d)

28 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

Conception récursive

I Les appels récursifs opéreront sur des sous-tableaux


⇒ 2 paramètres en plus : les indices entre lesquels on travaille
I Reconstruction triviale : E1 et E2 sont triés et leurs éléments sont
bien placés par rapport au pivot
I Cas de base : tableau de taille 0 ou 1 (déjà trié)

TriSegmentation (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Effet de bord T est trié par ordre croissant entre les indices g et d
if g < d
pivot := T [g]
i :=Partition (T , g, d, pivot)
TriSegmentation (T , g, i − 1)
TriSegmentation (T , i + 1, d)

28 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

La procédure Partition
Partition (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Résultat : L’indice i de pivot correctement placé dans le tableau
Effet de bord Les éléments de T entre les indices :
I g et i − 1 sont tous inférieurs à pivot.
I i + 1 et d sont tous supérieurs à pivot.

29 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

La procédure Partition
Partition (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Résultat : L’indice i de pivot correctement placé dans le tableau
Effet de bord Les éléments de T entre les indices :
I g et i − 1 sont tous inférieurs à pivot.
I i + 1 et d sont tous supérieurs à pivot.
i =g
while
if

else

return i

29 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

La procédure Partition
Partition (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Résultat : L’indice i de pivot correctement placé dans le tableau
Effet de bord Les éléments de T entre les indices :
I g et i − 1 sont tous inférieurs à pivot.
I i + 1 et d sont tous supérieurs à pivot.
i =g
while
if T [i + 1] ≤ T [g]

else

return i

29 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

La procédure Partition
Partition (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Résultat : L’indice i de pivot correctement placé dans le tableau
Effet de bord Les éléments de T entre les indices :
I g et i − 1 sont tous inférieurs à pivot.
I i + 1 et d sont tous supérieurs à pivot.
i =g
while
if T [i + 1] ≤ T [g]
i =i +1
else

return i

29 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

La procédure Partition
Partition (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Résultat : L’indice i de pivot correctement placé dans le tableau
Effet de bord Les éléments de T entre les indices :
I g et i − 1 sont tous inférieurs à pivot.
I i + 1 et d sont tous supérieurs à pivot.
i =g
while
if T [i + 1] ≤ T [g]
i =i +1
else
Échanger T [d] et T [i + 1]
d =d −1

return i

29 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

La procédure Partition
Partition (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Résultat : L’indice i de pivot correctement placé dans le tableau
Effet de bord Les éléments de T entre les indices :
I g et i − 1 sont tous inférieurs à pivot.
I i + 1 et d sont tous supérieurs à pivot.
i =g
while i < d
if T [i + 1] ≤ T [g]
i =i +1
else
Échanger T [d] et T [i + 1]
d =d −1

return i

29 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

La procédure Partition
Partition (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Résultat : L’indice i de pivot correctement placé dans le tableau
Effet de bord Les éléments de T entre les indices :
I g et i − 1 sont tous inférieurs à pivot.
I i + 1 et d sont tous supérieurs à pivot.
i =g
while i < d
if T [i + 1] ≤ T [g]
i =i +1
else
Échanger T [d] et T [i + 1]
d =d −1
Échanger T [g] et T [i]
return i

29 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

Éléments de complexité
I La taille des données est ici d − g
(taille de la portion de tableau manipulée)
I Partition a un coût linéaire en d − g.
I Coût d’évaluation des paramètres constant
donc négligeable devant d − g

30 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

Éléments de complexité
I La taille des données est ici d − g
(taille de la portion de tableau manipulée)
I Partition a un coût linéaire en d − g.
I Coût d’évaluation des paramètres constant
donc négligeable devant d − g
I D’où
CTriSegmentation (d − g) = CPartition (d − g)
+CTriSegmentation (i − 1 − g)
+CTriSegmentation (d − i − 1)
= O(d − g)
+CTriSegmentation (i − 1 − g)
+CTriSegmentation (d − i − 1)
... mais i est donné par Partition, donc dépend de la donnée.

30 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

Éléments de complexité
I La taille des données est ici d − g
(taille de la portion de tableau manipulée)
I Partition a un coût linéaire en d − g.
I Coût d’évaluation des paramètres constant
donc négligeable devant d − g
I D’où
CTriSegmentation (d − g) = CPartition (d − g)
+CTriSegmentation (i − 1 − g)
+CTriSegmentation (d − i − 1)
= O(d − g)
+CTriSegmentation (i − 1 − g)
+CTriSegmentation (d − i − 1)
... mais i est donné par Partition, donc dépend de la donnée.
I Intuitivement : l’algorithme est efficace (resp. inefficace) quand le
pivot est un élément médian (resp. extrême).
I La suite plus tard...
30 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide

En résumé
Aujourd’hui
I Un algorithme récursif profite de la présence de sous-problèmes
pour résoudre un problème
I La complexité en moyenne permet d’évaluer le comportement d’un
algorithme dans une situation réaliste décrite par une distribution
aléatoire
I L’algorithme de tri rapide est récursif, peu performant au pire mais
efficace en général

La prochaine fois
I Invariant
I Correction d’un algorithme
I Terminaison d’un algorithme
I Drapeau hollandais
31 / 31
Algorithmique et Analyse d’Algorithmes

Bonus

Fonction 91 de McCarthy
MC91 (n)
if n ≤ 100
return MC91(MC91(n + 11))
else
return n − 10

1/1

Vous aimerez peut-être aussi