Académique Documents
Professionnel Documents
Culture Documents
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
Structures
arborescentes
Fabien Teytaud
1/111
Résumé Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Volume horaire Structures
linéaires
I 15 heures de cours. Structures
arborescentes
I 18 heures de TD.
I 36 heures de TP.
Objectifs
I Structures de données avancées.
I Algorithmiques avancées.
I Introduction à la complexité.
2/111
Bibliographie Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Structures
arborescentes
3/111
Outline Algorithmique
avancée
Fabien Teytaud
Premiers pas
Rappels/Notions
Tri par insertion
Premiers pas Analyse d’un
algorithme
Rappels/Notions Initiation à la
complexité
Tri par insertion Méthodes de tri
Analyse d’un algorithme Structures
Initiation à la complexité linéaires
Structures
arborescentes
Méthodes de tri
Structures linéaires
Structures arborescentes
4/111
Une parenthèse sur les vector Algorithmique
avancée
Fabien Teytaud
Premiers pas
Rappels/Notions
Les vectors Tri par insertion
Analyse d’un
algorithme
Initiation à la
I Tableaux dynamiques. complexité
Méthodes de tri
I Déclaration : std::vector<TYPE> NOM.
Structures
I Exemple : std::vector<float> tableauDeReel. linéaires
Structures
I Accès à l’élément i : NOM[i]. arborescentes
5/111
Outline Algorithmique
avancée
Fabien Teytaud
Premiers pas
Rappels/Notions
Tri par insertion
Premiers pas Analyse d’un
algorithme
Rappels/Notions Initiation à la
complexité
Tri par insertion Méthodes de tri
Analyse d’un algorithme Structures
Initiation à la complexité linéaires
Structures
arborescentes
Méthodes de tri
Structures linéaires
Structures arborescentes
6/111
Tri par insertion Algorithmique
avancée
Fabien Teytaud
Structures
linéaires
Principe Structures
arborescentes
[interstices.info]
7/111
Tri par insertion Algorithmique
avancée
Fabien Teytaud
Premiers pas
Rappels/Notions
Tri par insertion Tri par insertion
#include <iostream> Analyse d’un
algorithme
#include <vector>
Initiation à la
complexité
void triInsertion(std::vector<int> &tab)
{ Méthodes de tri
for (int i = 1; i<tab.size(); i++)
{ Structures
// récupère la clé (valeur à insérer) linéaires
int cle = tab[i]; Structures
// cherche la position où il faut insérer la clé arborescentes
int j = i;
while (j>0 && tab[j-1] > cle)
{
// décale les éléments triés supérieurs à la clé
tab[j] = tab[j-1];
j--;
}
tab[j] = cle;
}
}
8/111
Rappel : création d’un programme principal Algorithmique
avancée
Fabien Teytaud
Premiers pas
Rappels/Notions
Tri par insertion
Analyse d’un
algorithme
Programme principal Initiation à la
int main() complexité
{ Méthodes de tri
std::vector<int> tab = { 8, 4, 6, 9, 1, 5 };
std::cout << "Avant le tri : " << std::endl; Structures
for(int s: tab) linéaires
std::cout << s << ’ ’;
std::cout << std::endl << "Apres le tri : " << std::endl; Structures
triInsertion(tab); arborescentes
for(int s: tab)
std::cout << s << ’ ’;
std::cout << std::endl;
return 0;
}
9/111
Rappel : compilation et exécution Algorithmique
avancée
Fabien Teytaud
Premiers pas
Rappels/Notions
Tri par insertion
Analyse d’un
algorithme
Initiation à la
complexité
Méthodes de tri
Execution
fabien$ g++ -std=c++11 -o triInsertion triInsertion.cpp Structures
fabien$ ./triInsertion linéaires
Avant le tri :
8 4 6 9 1 5 Structures
Apres le tri : arborescentes
1 4 5 6 8 9
10/111
Exemple Algorithmique
avancée
Fabien Teytaud
0 1 2 3 4 5 Premiers pas
Rappels/Notions
Tri par insertion
i =1 8 4 6 9 1 5 Analyse d’un
algorithme
Initiation à la
complexité
Méthodes de tri
Structures
linéaires
Structures
arborescentes
11/111
Exemple Algorithmique
avancée
Fabien Teytaud
0 1 2 3 4 5 Premiers pas
Rappels/Notions
Tri par insertion
i =1 8 4 6 9 1 5 Analyse d’un
algorithme
Initiation à la
complexité
i =2 4 8 6 9 1 5 Méthodes de tri
Structures
linéaires
Structures
arborescentes
11/111
Exemple Algorithmique
avancée
Fabien Teytaud
0 1 2 3 4 5 Premiers pas
Rappels/Notions
Tri par insertion
i =1 8 4 6 9 1 5 Analyse d’un
algorithme
Initiation à la
complexité
i =2 4 8 6 9 1 5 Méthodes de tri
Structures
linéaires
i =3 4 6 8 9 1 5 Structures
arborescentes
11/111
Exemple Algorithmique
avancée
Fabien Teytaud
0 1 2 3 4 5 Premiers pas
Rappels/Notions
Tri par insertion
i =1 8 4 6 9 1 5 Analyse d’un
algorithme
Initiation à la
complexité
i =2 4 8 6 9 1 5 Méthodes de tri
Structures
linéaires
i =3 4 6 8 9 1 5 Structures
arborescentes
i =4 4 6 8 9 1 5
11/111
Exemple Algorithmique
avancée
Fabien Teytaud
0 1 2 3 4 5 Premiers pas
Rappels/Notions
Tri par insertion
i =1 8 4 6 9 1 5 Analyse d’un
algorithme
Initiation à la
complexité
i =2 4 8 6 9 1 5 Méthodes de tri
Structures
linéaires
i =3 4 6 8 9 1 5 Structures
arborescentes
i =4 4 6 8 9 1 5
i =5 1 4 6 8 9 5
11/111
Rappel sur certaines notations algorithmiques Algorithmique
avancée
Fabien Teytaud
Un invariant de boucle
I Initialisation : il est vrai à la première itération de la
boucle.
I Conservation : s’il est vrai à l’itération i alors il doit
l’être à l’itération i + 1
I Terminaison : Une fois la boucle terminée, il fournit
une propriété utile à la validité d’un algorithme.
12/111
L’invariant de boucle Algorithmique
avancée
Fabien Teytaud
Méthodes de tri
I Conservation :
Structures
I La clé est supérieure aux éléments [0, j-1] et linéaires
13/111
Outline Algorithmique
avancée
Fabien Teytaud
Premiers pas
Rappels/Notions
Tri par insertion
Premiers pas Analyse d’un
algorithme
Rappels/Notions Initiation à la
complexité
Tri par insertion Méthodes de tri
Analyse d’un algorithme Structures
Initiation à la complexité linéaires
Structures
arborescentes
Méthodes de tri
Structures linéaires
Structures arborescentes
14/111
Analyse Algorithmique
avancée
Fabien Teytaud
Premiers pas
Rappels/Notions
Tri par insertion
Analyse d’un
algorithme
Initiation à la
complexité
I La mémoire, Structures
linéaires
I les communications réseaux, Structures
arborescentes
I le processeur,
I le temps de calcul
15/111
Notions de complexité Algorithmique
avancée
Fabien Teytaud
Premiers pas
Rappels/Notions
Tri par insertion
Analyse d’un
algorithme
La complexité caractérise l’efficacité d’un algorithme et Initiation à la
complexité
fournit une estimation de son coût. Il existe différents types Méthodes de tri
de complexité : Structures
linéaires
I la complexité dans le pire des cas, qui définit le coût Structures
maximal possible. arborescentes
16/111
Analyse du tri par insertion Algorithmique
avancée
Fabien Teytaud
Premiers pas
Rappels/Notions
Tri par insertion
Analyse d’un
algorithme
La durée d’exécution de notre tri par insertion dépend de : Initiation à la
complexité
I La taille du tableau d’entrée. Méthodes de tri
I Les données d’entrée : à quel point les valeurs sont déjà Structures
linéaires
triées. Structures
arborescentes
Le temps d’exécution
Il s’agit du nombre d’opérations élémentaires (comparaison,
affectation, . . .) pour exécuter un algorithme avec une
certaine entrée.
17/111
Analyse du tri par insertion Algorithmique
avancée
Fabien Teytaud
Fabien Teytaud
Premiers pas
Rappels/Notions
Tri par insertion
Analyse d’un
algorithme
Calcul du nombre d’instructions exécutées Initiation à la
complexité
Structures
N−1
X linéaires
T (N) = c1 N + c2 (N − 1) + c3 (N − 1) + c4 ti Structures
arborescentes
i=1
N−1
X N−1
X
+c5 (ti − 1) + c6 (ti − 1) + c7 (N − 1)
i=1 i=1
19/111
Analyse du tri par insertion Algorithmique
avancée
Fabien Teytaud
Premiers pas
Et si le tableau est déjà trié ? Rappels/Notions
Tri par insertion
Analyse d’un
algorithme
I Correspond au cas le plus favorable. Initiation à la
complexité
I Dans ce cas le test tab[j-1] > cle est toujours faux. Méthodes de tri
Structures
I ti = 1 linéaires
Structures
arborescentes
T (N) = c1 N + c2 (N − 1) + c3 (N − 1) + c4 (N − 1) + c7 (N − 1)
= (c1 + c2 + c3 + c4 + c7 )N − (c2 + c3 + c4 + c7 )
20/111
Analyse du tri par insertion Algorithmique
avancée
Fabien Teytaud
Méthodes de tri
N(N + 1) Structures
T (N) = c1 N + c2 (N − 1) + c3 (N − 1) + c4 ( − 1) linéaires
2
Structures
N(N − 1) N(N − 1) arborescentes
+c5 + c6 + c7 (N − 1)
2 2
1
= (c4 + c5 + c6 )N 2
2
1 1 1
+(c1 + c2 + c3 + c7 + c4 − c5 − c6 )N
2 2 2
−(c2 + c3 + c4 + c7 )
Fabien Teytaud
Premiers pas
Rappels/Notions
Tri par insertion
Premiers pas Analyse d’un
algorithme
Rappels/Notions Initiation à la
complexité
Tri par insertion Méthodes de tri
Analyse d’un algorithme Structures
Initiation à la complexité linéaires
Structures
arborescentes
Méthodes de tri
Structures linéaires
Structures arborescentes
22/111
Un peu de vocabulaire Algorithmique
avancée
Fabien Teytaud
Premiers pas
Rappels/Notions
Tri par insertion
Analyse d’un
algorithme
Initiation à la
Ordre de grandeur complexité
Méthodes de tri
I On s’intéresse surtout à l’ordre de grandeur du coût. Structures
linéaires
I On simplifie les constantes, et on ne garde que l’ordre le
Structures
plus élevé (par exemple, linéaire = N, quadratique = arborescentes
N 2 ).
I On s’intéresse aux performances asymptotiques des
algorithmes : quand la valeur de N devient très grande.
23/111
Notations asymptotiques Algorithmique
avancée
Fabien Teytaud
Premiers pas
Rappels/Notions
Tri par insertion
Analyse d’un
algorithme
Θ (Thêta) Initiation à la
complexité
Méthodes de tri
I Concrètement : s’il existe des constantes c1 , c2 telles que
Structures
f (n) soit comprise entre c1 g (n) et c2 g (n) ⇒ Θ(g (n)). linéaires
24/111
Notations asymptotiques Algorithmique
avancée
Fabien Teytaud
Premiers pas
O (grand ‘O’) Rappels/Notions
Tri par insertion
Analyse d’un
I Notation Θ : borne sup + borne inf. algorithme
Initiation à la
complexité
I Concrètement : s’il existe une constante c telle que f (n) Méthodes de tri
soit majorée par cg (n) ⇒ O(g (n)) (borne supérieure Structures
linéaires
asymptotique).
Structures
I On note O(g (n)) l’ensemble des fonctions suivant : arborescentes
25/111
Mais aussi ... Algorithmique
avancée
Fabien Teytaud
o
Premiers pas
Rappels/Notions
I Borne supérieure non asymptotiquement approchée. Tri par insertion
Analyse d’un
I ∀c ∈ R+ , ∃n0 ≥ 0, (g (n)) = {f (n) : 0 ≤ f (n) ≤ cg (n) algorithme
Initiation à la
complexité
∀n ≥ n0 }.
Méthodes de tri
Structures
Ω linéaires
Structures
I A l’opposé de O ; Ω est une borne inférieur arborescentes
asymptotique.
I ∃(c ∈ R+ , n0 ∈ N ), 0 ≤ cg (n) ≤ f (n), ∀n ≥ n0
ω
I Borne inférieure non asymptotiquement approchée.
I ∀c ∈ R∗+ , ∃n0 > 0, (g (n)) = {f (n) : 0 ≤ cg (n) < f (n)
∀n ≥ n0 }.
26/111
Quelques fonctions de référence Algorithmique
avancée
Fabien Teytaud
Premiers pas
Rappels/Notions
Tri par insertion
Analyse d’un
algorithme
Initiation à la
I 1 (complexité constante) complexité
Méthodes de tri
I log2 (n) (logarithmique)
Structures
I n (linéaire) linéaires
Structures
I nlog (n) (quasi-linéaire) arborescentes
I n2 (quadratique)
I np ; avec p > 2 (polynomiale)
I 2n (exponentielle)
27/111
Outline Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Premiers pas Tri à bulles
Tri par sélection
Tri fusion
Tri rapide
Méthodes de tri Structures
Tri à bulles linéaires
Structures linéaires
Structures arborescentes
28/111
Rappel : le tri à bulles Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
Tri à bulles Tri par sélection
void triBulles(std::vector<int> &tab) Tri fusion
{ Tri rapide
for (int i=tab.size()-1; i>0; i--)
{ Structures
bool tableau_trie = true; linéaires
for (int j=0; j<i; j++)
{ Structures
if (tab[j+1] < tab[j]) arborescentes
{
std::swap(tab[j], tab[j+1]);
tableau_trie = false;
}
}
if (tableau_trie)
return;
}
}
29/111
Exemple Algorithmique
avancée
Fabien Teytaud
Premiers pas
i =5 Méthodes de tri
Tri à bulles
Tri par sélection
j =0 8 4 6 9 1 5 Tri
Tri
fusion
rapide
Structures
linéaires
Structures
arborescentes
30/111
Exemple Algorithmique
avancée
Fabien Teytaud
Premiers pas
i =5 Méthodes de tri
Tri à bulles
Tri par sélection
j =0 8 4 6 9 1 5 Tri
Tri
fusion
rapide
Structures
linéaires
j =1 4 8 6 9 1 5 Structures
arborescentes
30/111
Exemple Algorithmique
avancée
Fabien Teytaud
Premiers pas
i =5 Méthodes de tri
Tri à bulles
Tri par sélection
j =0 8 4 6 9 1 5 Tri
Tri
fusion
rapide
Structures
linéaires
j =1 4 8 6 9 1 5 Structures
arborescentes
j =2 4 6 8 9 1 5
30/111
Exemple Algorithmique
avancée
Fabien Teytaud
Premiers pas
i =5 Méthodes de tri
Tri à bulles
Tri par sélection
j =0 8 4 6 9 1 5 Tri
Tri
fusion
rapide
Structures
linéaires
j =1 4 8 6 9 1 5 Structures
arborescentes
j =2 4 6 8 9 1 5
j =3 4 6 8 9 1 5
30/111
Exemple Algorithmique
avancée
Fabien Teytaud
Premiers pas
i =5 Méthodes de tri
Tri à bulles
Tri par sélection
j =0 8 4 6 9 1 5 Tri
Tri
fusion
rapide
Structures
linéaires
j =1 4 8 6 9 1 5 Structures
arborescentes
j =2 4 6 8 9 1 5
j =3 4 6 8 9 1 5
j =4 4 6 8 1 9 5
30/111
Exemple Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
i =4 Tri par sélection
Tri fusion
Tri rapide
j =0 4 6 8 1 5 9 Structures
linéaires
Structures
arborescentes
31/111
Exemple Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
i =4 Tri par sélection
Tri fusion
Tri rapide
j =0 4 6 8 1 5 9 Structures
linéaires
Structures
j =1 4 6 8 1 5 9 arborescentes
31/111
Exemple Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
i =4 Tri par sélection
Tri fusion
Tri rapide
j =0 4 6 8 1 5 9 Structures
linéaires
Structures
j =1 4 6 8 1 5 9 arborescentes
j =2 4 6 8 1 5 9
31/111
Exemple Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
i =4 Tri par sélection
Tri fusion
Tri rapide
j =0 4 6 8 1 5 9 Structures
linéaires
Structures
j =1 4 6 8 1 5 9 arborescentes
j =2 4 6 8 1 5 9
j =3 4 6 1 8 5 9
31/111
Exemple Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
Tri par sélection
i =3 Tri
Tri
fusion
rapide
Structures
j =0 4 6 1 5 8 9 linéaires
Structures
arborescentes
j =1 4 6 1 5 8 9
j =2 4 1 6 5 8 9
32/111
Exemple Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
Tri par sélection
Tri fusion
Tri rapide
i =2 Structures
linéaires
j =0 4 1 5 6 8 9 Structures
arborescentes
j =1 1 4 5 6 8 9
33/111
Exemple Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
Tri par sélection
Tri fusion
Tri rapide
i =1 Structures
linéaires
Structures
j =0 1 4 5 6 8 9 arborescentes
34/111
Conclusion Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
Tri par sélection
Tri fusion
Tri rapide
Structures
I Simple à mettre en oeuvre. arborescentes
I Complexité : O(n2 ).
I Peu efficace.
35/111
Outline Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Premiers pas Tri à bulles
Tri par sélection
Tri fusion
Tri rapide
Méthodes de tri Structures
Tri à bulles linéaires
Structures linéaires
Structures arborescentes
36/111
Tri par sélection Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
37/111
Algorithme du tri par sélection Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
Tri par sélection
Tri fusion
Tri par sélection Tri rapide
void triSelection(std::vector<int> &tab)
{ Structures
for (int i = 0; i<tab.size()-1; i++) linéaires
{
int min = i; Structures
for (int j=i+1; j < tab.size(); j++) arborescentes
if (tab[j] < tab[min])
min = j;
if (min != i)
std::swap(tab[min], tab[i]);
}
}
38/111
Exemple Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
i Tri par sélection
Tri fusion
8 4 6 9 1 5 Tri rapide
Structures
i linéaires
1 4 6 9 8 5 Structures
arborescentes
i
1 4 6 9 8 5
i
1 4 5 9 8 6
i
1 4 5 6 8 9
39/111
Tri par sélection Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
Tri par sélection
Tri fusion
Tri rapide
Structures
linéaires
I Simple à implémenter et à comprendre.
Structures
I Peu efficace, complexité : O(n2 ). arborescentes
I Non stable.
40/111
Outline Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Premiers pas Tri à bulles
Tri par sélection
Tri fusion
Tri rapide
Méthodes de tri Structures
Tri à bulles linéaires
Structures linéaires
Structures arborescentes
41/111
Le tri fusion Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
Tri par sélection
Tri fusion
L’algorithme de tri fusion Tri rapide
Structures
linéaires
I Basé sur l’algorithme Diviser pour régner.
Structures
I Principale étape : fusion de deux listes en une seule. arborescentes
42/111
Le tri fusion Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
Tri par sélection
Tri fusion
Tri rapide
43/111
Le tri fusion Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
Tri par sélection
Tri fusion
Tri fusion Tri rapide
// appel avec debut = 0 et fin = tab.size()-1
Structures
void triFusion(std::vector<int> &tab, int debut, int fin)
linéaires
{
if (debut < fin) Structures
{ arborescentes
int milieu = (debut+fin)/2;
triFusion(tab, debut, milieu);
triFusion(tab, milieu+1, fin);
fusion(tab, debut, milieu, fin);
}
}
44/111
Le tri fusion Algorithmique
avancée
Fabien Teytaud
Fusion
void fusion(std::vector<int> &tab, int debut, int milieu, int fin)
{
int compteur1 = debut; Premiers pas
int compteur2 = milieu+1;
std::vector<int> nouveau; Méthodes de tri
Tri à bulles
// copie des éléments jusqu’à ce qu’au moins un des tableaux soit terminé
while ((compteur1 <= milieu) && (compteur2 <= fin))
Tri par sélection
{ Tri fusion
if (tab[compteur1] < tab[compteur2]) Tri rapide
{
nouveau.push_back(tab[compteur1]); Structures
compteur1++; linéaires
}
else
{ Structures
nouveau.push_back(tab[compteur2]); arborescentes
compteur2++;
}
}
// on complète si besoin
if (compteur1 > milieu)
while (compteur2 <= fin)
{
nouveau.push_back(tab[compteur2]);
compteur2++;
}
else
while (compteur1 <= milieu)
{
nouveau.push_back(tab[compteur1]);
compteur1++;
}
45/111
Exemple Algorithmique
avancée
Fabien Teytaud
Premiers pas
8 4 6 9 1 5 Méthodes de tri
Tri à bulles
Tri par sélection
Tri fusion
Tri rapide
8 4 6 9 1 5
Structures
linéaires
8 4 6 9 1 5 Structures
arborescentes
8 4 6 9 1 5
4 8 6 1 9 5
4 6 8 1 5 9
1 4 5 6 8 9
46/111
Complexité du tri fusion Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
I Complexité de la partie “division” : Tri
Tri
à bulles
par sélection
Tri fusion
I A chaque itération, on divise la taille par 2. Tri rapide
I A l’instance i, on a donc une séquence de taille : 2ni . Structures
I On a donc une expression logarithmique (en base 2) du linéaires
47/111
Outline Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Premiers pas Tri à bulles
Tri par sélection
Tri fusion
Tri rapide
Méthodes de tri Structures
Tri à bulles linéaires
Structures linéaires
Structures arborescentes
48/111
Tri rapide Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
Tri par sélection
L’algorithme de tri rapide Tri fusion
Tri rapide
49/111
Le tri rapide Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
Tri par sélection
Tri fusion
Tri rapide
Tri rapide
// appel avec debut = 0 et fin = tab.size()-1 Structures
void triRapide(std::vector<int> &tab, int debut, int fin) linéaires
{
if (debut < fin) Structures
{ arborescentes
int pivot = partition(tab, debut, fin);
triRapide(tab, debut, pivot - 1);
triRapide(tab, pivot + 1, fin);
}
}
50/111
Le tri rapide Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
Partionnement Tri par sélection
int partition(std::vector<int> &tab, int debut, int fin) Tri fusion
{ Tri rapide
int pivot = tab[fin];
Structures
int i = debut-1;
linéaires
for (int j=debut; j<=fin-1; j++) Structures
{ arborescentes
if (tab[j] <= pivot)
{
i++;
std::swap(tab[i], tab[j]);
}
}
std::swap(tab[i+1], tab[fin]);
return i+1;
}
51/111
Exemple de partionnement Algorithmique
avancée
Fabien Teytaud
i d, j f Premiers pas
8 4 6 9 1 5 Méthodes de tri
Tri à bulles
j Tri par sélection
i d f Tri fusion
8 4 6 9 1 5 Tri rapide
Structures
i, d j f linéaires
4 8 6 9 1 5 Structures
arborescentes
i, d j f
4 8 6 9 1 5
i, d j f
4 8 6 9 1 5
d i f
4 1 6 9 8 5
d i f
4 1 5 9 8 6
52/111
Le tri rapide Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Tri à bulles
I Beaucoup utilisé : complexité en moyenne : O(n log(n)). Tri par sélection
Tri fusion
I Choix du pivot : Tri rapide
53/111
Outline Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Premiers pas
Structures
linéaires
Les piles
Méthodes de tri Les files
Les pointeurs
Les listes chaînées
Listes doublement
Structures linéaires chaînées
Structures arborescentes
54/111
Les piles Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Notion de pile Les piles
Les files
Les pointeurs
I Ensemble d’éléments successifs. Les listes chaînées
Listes doublement
chaînées
I L’insertion et la suppression sont contraintes. Structures
arborescentes
I Seul l’élément le plus récent est accessible.
I Principe du dernier entré, premier sorti (LIFO).
I Exemple : une pile d’assiettes.
55/111
Représentation d’une pile Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Réprésentation d’une pile vide Structures
linéaires
Les piles
Les files
Les pointeurs
Pile Les listes chaînées
Listes doublement
chaînées
Structures
arborescentes
56/111
Représentation d’une pile Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Ajout de l’élément A Structures
linéaires
Les piles
Les files
Les pointeurs
Pile A Les listes chaînées
Listes doublement
chaînées
Structures
arborescentes
57/111
Représentation d’une pile Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Ajout de l’élément A Structures
linéaires
Les piles
Les files
Les pointeurs
Pile Les listes chaînées
Listes doublement
chaînées
Structures
arborescentes
58/111
Représentation d’une pile Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Ajouts des éléments B,C,D,E,F Structures
linéaires
Les piles
Les files
Les pointeurs
Pile Les listes chaînées
Listes doublement
chaînées
Structures
arborescentes
A B C D E F
59/111
Représentation d’une pile Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Suppression d’un élément Structures
linéaires
Les piles
Les files
Les pointeurs
Pile F Les listes chaînées
Listes doublement
chaînées
Structures
arborescentes
A B C D E X
60/111
Les piles Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
Les primitives linéaires
Les piles
Les files
I estVide : retourne VRAI si la pile passée en paramètre Les pointeurs
Les listes chaînées
est vide, FAUX sinon. Listes doublement
chaînées
I empiler : ajouter l’élément passé en paramètre à la pile Structures
arborescentes
(passée en paramètre).
I dépiler : retourne le dernier élément de la pile passée
en paramètre (et le supprime).
I (afficher : affiche la pile passée en paramètre.)
61/111
Les piles Algorithmique
avancée
Fabien Teytaud
62/111
Les piles Algorithmique
avancée
Fabien Teytaud
return 0;
}
63/111
Les piles Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Les piles
Execution Les files
fabien$ g++ -o pile pile.cpp
Les pointeurs
fabien$ ./pile Les listes chaînées
1 2 3 4 Listes doublement
On dépile 4 chaînées
1 2 3
On dépile 3 Structures
1 2 arborescentes
On dépile 2
1
On dépile 1
64/111
Outline Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Premiers pas
Structures
linéaires
Les piles
Méthodes de tri Les files
Les pointeurs
Les listes chaînées
Listes doublement
Structures linéaires chaînées
Structures arborescentes
65/111
Les files Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Notion de files Les piles
Les files
Les pointeurs
I Ensemble d’éléments successifs. Les listes chaînées
Listes doublement
chaînées
I L’insertion et la suppression sont contraintes. Structures
arborescentes
I Seul l’élément le plus ancien est accessible.
I Principe du premier entré, premier sorti (FIFO).
I Exemple : une file d’attente.
66/111
1ère représentation d’une file Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
File vide Structures
linéaires
Les piles
Les files
Les pointeurs
File Les listes chaînées
Listes doublement
chaînées
Structures
arborescentes
67/111
1ère représentation d’une file Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Ajout de l’élément A Structures
linéaires
Les piles
Les files
Les pointeurs
File A Les listes chaînées
Listes doublement
chaînées
Structures
arborescentes
68/111
1ère représentation d’une file Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Ajout de l’élément A Structures
linéaires
Les piles
Les files
Les pointeurs
File Les listes chaînées
Listes doublement
chaînées
Structures
arborescentes
69/111
1ère représentation d’une file Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Ajouts des éléments B,C,D,E,F Structures
linéaires
Les piles
Les files
Les pointeurs
File Les listes chaînées
Listes doublement
chaînées
Structures
arborescentes
A B C D E F
70/111
1ère représentation d’une file Algorithmique
avancée
Fabien Teytaud
Premiers pas
Structures
linéaires
Les piles
Les files
Les pointeurs
Les listes chaînées
Listes doublement
File A chaînées
Structures
arborescentes
X B C D E F
71/111
Les files Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
72/111
Les files Algorithmique
avancée
Fabien Teytaud
Structure et primitives d’une file
#include <iostream>
#include <array> Premiers pas
73/111
Les files Algorithmique
avancée
Fabien Teytaud
return 0;
}
74/111
Les files Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Les piles
Les files
Execution
Les pointeurs
1 2 3 4
Les listes chaînées
On défile 1
Listes doublement
2 3 4 chaînées
On défile 2
3 4 Structures
On défile 3 arborescentes
4
On défile 4
75/111
Les files - 2ème représentation Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Les piles
Les files
Les pointeurs
Les listes chaînées
Listes doublement
I Quel est le problème de cette représentation ? chaînées
Structures
I Comment y remédier ? arborescentes
76/111
2ème représentation d’une file Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
arborescentes
A B C D E F
Tête Queue
77/111
2ème représentation d’une file Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
arborescentes
J A B C D E F G H I
Queue Tête
78/111
2ème représentation d’une file Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
arborescentes
J X B C D E F G H I
Queue Tête
79/111
Les files Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
Structure et primitives d’une file linéaires
void enfiler(File &file, int v) Les piles
{ Les files
file.elements[file.queue++] = v; Les pointeurs
if (file.queue == TAILLE_MAX) Les listes chaînées
file.queue = 0; Listes doublement
chaînées
}
Structures
int defiler(File &file) arborescentes
{
int v = file.elements[file.tete++];
if (file.tete == TAILLE_MAX)
file.tete = 0;
return v;
}
80/111
Outline Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Premiers pas
Structures
linéaires
Les piles
Méthodes de tri Les files
Les pointeurs
Les listes chaînées
Listes doublement
Structures linéaires chaînées
Structures arborescentes
81/111
Introduction aux pointeurs Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
Notion de pointeur linéaires
Les piles
Les files
I Un pointeur est une variable qui peut contenir l’adresse Les pointeurs
Les listes chaînées
mémoire d’un “objet”, comme une variable ou une Listes doublement
chaînées
fonction. Structures
arborescentes
I Exemple : un pointeur sur un entier contient l’adresse
mémoire où une variable entière range la donnée qu’elle
contient.
I Les adresses sont typées.
82/111
Introduction aux pointeurs Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Les piles
Pour ce cours : Les files
Les pointeurs
Les listes chaînées
I Déclaration d’un pointeur sur un entier : int *p. Listes doublement
chaînées
83/111
Exemple de pointeurs Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
a b c d
84/111
Exemple de pointeurs Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
a b c d
c a b d
84/111
Exemple sur la fonction echange Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Les piles
void echange(int a, int b) Les files
{ Les pointeurs
int tmp = a; Les listes chaînées
a = b; Listes doublement
b = tmp; chaînées
}
Structures
arborescentes
85/111
Exemple sur la fonction echange Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Les piles
Les files
Les pointeurs
void echange(int *a, int *b) Les listes chaînées
{ Listes doublement
chaînées
int tmp = *a;
*a = *b; Structures
*b = tmp; arborescentes
}
86/111
Exemple sur la fonction echange Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
void echange(int *a, int *b)
{ Les piles
int tmp = *a; Les files
Les pointeurs
*a = *b;
Les listes chaînées
*b = tmp;
Listes doublement
} chaînées
Structures
arborescentes
L’appel se fera comme ceci :
int main()
{
int a = 2, b = 3;
echange(&a,&b);
}
87/111
Outline Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Premiers pas
Structures
linéaires
Les piles
Méthodes de tri Les files
Les pointeurs
Les listes chaînées
Listes doublement
Structures linéaires chaînées
Structures arborescentes
88/111
Les listes chaînées Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
89/111
Les listes simplement chaînées Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Les piles
Les files
Représentation des listes simplement chaînées Les pointeurs
Les listes chaînées
Listes doublement
chaînées
Structures
arborescentes
DébutListe A B C D X
90/111
Les listes simplement chaînées Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Les piles
Les files
Représentation des listes simplement chaînées Les pointeurs
Les listes chaînées
Listes doublement
Structure d’un élément chaînées
struct Element
{ Structures
int donnee; arborescentes
Element *suivant;
};
91/111
Les listes simplement chaînées Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Les piles
Affichage d’une liste chaînée Les files
void afficherListe(Element *maListe) Les pointeurs
{ Les listes chaînées
Element *courant = maListe; Listes doublement
while (courant != nullptr) chaînées
{
std::cout << courant->donnee << " "; Structures
courant = courant->suivant; arborescentes
}
std::cout << std::endl;
}
92/111
Les listes simplement chaînées Algorithmique
avancée
Fabien Teytaud
Premiers pas
Structures
linéaires
Les piles
93/111
Les listes simplement chaînées Algorithmique
avancée
Fabien Teytaud
Premiers pas
Structures
linéaires
Les piles
DébutListe A B C D X
(1)
(2)
nouveau n
93/111
Les listes simplement chaînées Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Insertion au début d’une liste chaînée Les piles
Element* insererDebutListe(Element *maListe, Element *nouveau) Les files
{ Les pointeurs
// si la liste est vide, alors la liste est le nouvel élément Les listes chaînées
if (maListe == nullptr) Listes doublement
return nouveau; chaînées
Structures
// on rajoute la liste à la suite du nouvel élément arborescentes
nouveau->suivant = maListe;
94/111
Les listes simplement chaînées Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Recherche dans une liste chaînée Les piles
Element* rechercherDansListe(Element *maListe, int valeur) Les files
{ Les pointeurs
Element *courant = maListe; Les listes chaînées
while (courant) Listes doublement
{ chaînées
if (courant->donnee == valeur) Structures
return courant; arborescentes
courant = courant->suivant;
}
return nullptr;
}
95/111
Outline Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Premiers pas
Structures
linéaires
Les piles
Méthodes de tri Les files
Les pointeurs
Les listes chaînées
Listes doublement
Structures linéaires chaînées
Structures arborescentes
96/111
Les listes doublement chaînées Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Représentation d’une liste doublement chaînée Les piles
Les files
Les pointeurs
Les listes chaînées
Listes doublement
chaînées
DébutListe Structures
arborescentes
X A B C D X
97/111
Les listes doublement chaînées Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Les piles
Les files
Représentation des listes doublement chaînées Les pointeurs
Les listes chaînées
Structure d’un élément Listes doublement
struct Element chaînées
{ Structures
Element *precedent; arborescentes
int donnee;
Element *suivant;
};
98/111
Outline Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Premiers pas Structures
linéaires
Structures arborescentes
Définition
Parcours préfixé
Parcours infixé
Parcours postfixé
99/111
Les arbres binaires de recherche Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
100/111
Les arbres binaires de recherche Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Un peu de vocabulaire Structures
arborescentes
Définition
I Profondeur ou niveau : nombre de noeuds sur une même Parcours préfixé
Parcours infixé
branche de la racine à une feuille. Parcours postfixé
101/111
Les arbres binaires de recherche Algorithmique
avancée
Fabien Teytaud
Premiers pas
Exemple Méthodes de tri
Structures
linéaires
8
Structures
arborescentes
Définition
Parcours préfixé
Parcours infixé
5 15 Parcours postfixé
2 7 12 17
1 3
11 13
102/111
Outline Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Premiers pas Structures
linéaires
Structures arborescentes
Définition
Parcours préfixé
Parcours infixé
Parcours postfixé
103/111
Les arbres binaires de recherche Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Structures
Parcours préfixé arborescentes
Définition
Parcours préfixé
104/111
Les arbres binaires de recherche Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Exemple Structures
linéaires
Structures
A arborescentes
Définition
Parcours préfixé
Parcours infixé
Parcours postfixé
B C
D E F G
Parcours :
105/111
Les arbres binaires de recherche Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Exemple Structures
linéaires
Structures
A arborescentes
Définition
Parcours préfixé
Parcours infixé
Parcours postfixé
B C
D E F G
Parcours : A - B - D - E - C - F - G
105/111
Outline Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Premiers pas Structures
linéaires
Structures arborescentes
Définition
Parcours préfixé
Parcours infixé
Parcours postfixé
106/111
Les arbres binaires de recherche Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Structures
Parcours infixé arborescentes
Définition
Parcours préfixé
1. Parcours du sous-arbre gauche. Parcours infixé
Parcours postfixé
2. Le traitement du noeud.
3. Parcours du sous-arbre droit.
107/111
Les arbres binaires de recherche Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Exemple Structures
linéaires
Structures
A arborescentes
Définition
Parcours préfixé
Parcours infixé
Parcours postfixé
B C
D E F G
Parcours :
108/111
Les arbres binaires de recherche Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Exemple Structures
linéaires
Structures
A arborescentes
Définition
Parcours préfixé
Parcours infixé
Parcours postfixé
B C
D E F G
Parcours : D - B - E - A - F - C - G
108/111
Outline Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Premiers pas Structures
linéaires
Structures arborescentes
Définition
Parcours préfixé
Parcours infixé
Parcours postfixé
109/111
Les arbres binaires de recherche Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Structures
linéaires
Structures
Parcours postfixé arborescentes
Définition
Parcours préfixé
110/111
Les arbres binaires de recherche Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Exemple Structures
linéaires
Structures
A arborescentes
Définition
Parcours préfixé
Parcours infixé
Parcours postfixé
B C
D E F G
Parcours :
111/111
Les arbres binaires de recherche Algorithmique
avancée
Fabien Teytaud
Premiers pas
Méthodes de tri
Exemple Structures
linéaires
Structures
A arborescentes
Définition
Parcours préfixé
Parcours infixé
Parcours postfixé
B C
D E F G
Parcours : D - E - B - F - G - C - A
111/111