Cours Algorithmique Avancé, Univ Béjaia
Cours Algorithmique Avancé, Univ Béjaia
Algorithmique Avancée
A. BELAÏD
Recherche Opérationnelle
Master 1 – 2ième semestre 2014
Plateforme d‟enseignement à
distance
http://elearning.univ-bejaia.dz/
1
21/05/2015
3 Algorithmique Avancée
Références
4 Algorithmique Avancée
Objectifs pédagogiques
2
21/05/2015
5 Algorithmique Avancée
Plan du cours
Introduction générale
Complexité et optimalité
La récursivité et le paradigme « diviser pour régner »
Algorithmes de tri
Structures de données élémentaires
Programmation dynamique
Algorithmes gloutons
Graphes et arbres
Arbres de recherche et arbres de recherche
équilibrés
NP-complétude
Heuristiques
6 Algorithmique Avancée
Introduction générale
C’est quoi un algorithme?
Une succession d‟instructions
qui renvoie un résultat
exacte
en un nombre fini d‟étapes
3
21/05/2015
7 Algorithmique Avancée
Temps d’exécution
Rappel : on n'exige pas seulement d'un algorithme
qu'il résolve un problème ; On veut également qu'il
soit efficace :
rapide (en termes de temps d„exécution) ;
peu gourmand en ressources (espace de stockage,
mémoire utilisée) ;
8 Algorithmique Avancée
Temps d’exécution
On ne mesure pas la durée en heures, minutes,
secondes, ... :
1. cela impliquerait d'implémenter les algorithmes
qu'on v eut comparer ;
2. de plus, ces mesures ne seraient pas pertinentes car
le même algorithme sera plus rapide sur une
machine plus puissante ;
4
21/05/2015
9 Algorithmique Avancée
Temps d’exécution
L‟algorithme suivant calcule 𝑛! = 𝑛 ∗ 𝑛 − 1 ∗ 𝑛 − 2 ∗ ⋯ ∗
2 ∗ 1 , avec 0! = 1.
fonction factorielle(n)
fact 1 ; initialisation : 1
i2; initialisation : 1
tant que (i <= n)faire itération : au plus n-1
fact fact * i ; multiplication + affectation : 2
i i +1; addition + affectation : 2
fin tant que
renvoyer fact; renvoi d‟une valeur : 1
10 Algorithmique Avancée
Complexité algorithmique
La complexité d'un algorithme est une mesure de sa
performance asymptotique dans le pire cas ;
5
21/05/2015
11 Algorithmique Avancée
Complexité algorithmique
Comportement asymptotique
Soit deux algorithmes résolv ant un problème (de taille de
données n) en un temps f1(n) et f2(n), respectiv ement ;
Nombre d‟instructions
12 Algorithmique Avancée
Complexité algorithmique
Notations de Landau
6
21/05/2015
13 Algorithmique Avancée
Complexité algorithmique
Notations de Landau
On note 𝑓 = 𝑂 𝑔 𝑜𝑢 𝑓 ∈ 𝑂(𝑔)
14 Algorithmique Avancée
Complexité algorithmique
Notations de Landau
7
21/05/2015
15 Algorithmique Avancée
Complexité algorithmique
Notations de Landau
Exemple :
Prouv ons que la fonction 𝑓1 𝑛 = 5𝑛 + 37est en 𝑂 𝑛 :
Trouv er une constante quelconque c>0 et un seuil 𝑛0 à
partir duquel 𝑓1 𝑛 ≤ 𝑐 𝑛.
On en déduit que c=6 fonctionne à partir du seuil
𝑛0 =37.
Remarque : c=10 et 𝑛0 =8 est aussi acceptable
16 Algorithmique Avancée
Complexité algorithmique
Notations de Landau : Simplification sue le calcul du temps d’exécution
On préfère avoir une idée du temps d'exécution de
l'algorithme plutôt qu'une expression plus précise mais
inutilement compliquée ;
8
21/05/2015
17 Algorithmique Avancée
Complexité algorithmique
Analyse du temps d’exécution d’un algorithme
Opération élémentaire => temps constant: O(1)
18 Algorithmique Avancée
Complexité algorithmique
Complexité au pire et au meilleur des cas
Soit d l‟ensemble des données de taille n et coud(d) la
complexité en temps sur la donnée d:
9
21/05/2015
19 Algorithmique Avancée
Complexité algorithmique
Quelques propriétés liées à la notation O(.) :
Règle du maximum :
si 𝑓, 𝑔: 𝑁 → 𝑅+, alors 𝑂 𝑓 𝑛 + 𝑔 𝑛 = 𝑂 max 𝑓 𝑛 , 𝑔 𝑛
𝑓 𝑛
𝑠𝑖 lim ∈ 𝑅∗+ , 𝑎𝑙𝑜𝑟𝑠 𝑓 𝑛 ∈ 𝑂 𝑔 𝑛 𝑒𝑡 𝑔 𝑛 ∈ 𝑂 𝑓 𝑛
𝑛→+∞ 𝑔 𝑛
𝑓 𝑛
𝑠𝑖 lim = 0, 𝑎𝑙𝑜𝑟𝑠 𝑓 𝑛 ∈ 𝑂 𝑔 𝑛 𝑚𝑎𝑖𝑠 𝑔 𝑛 ∉ 𝑂 𝑓 𝑛
𝑛→+∞ 𝑔 𝑛
𝑓 𝑛
𝑠𝑖 lim = +∞, 𝑎𝑙𝑜𝑟𝑠 𝑔 𝑛 ∈ 𝑂 𝑓 𝑛 , 𝑚𝑎𝑖𝑠 𝑓 𝑛 ∉ 𝑂 𝑔 𝑛
𝑛→+∞ 𝑔 𝑛
20 Algorithmique Avancée
Complexité algorithmique
Quelques propriétés liées à la notation O(.) :
𝑓𝑛 ≠𝑂 𝑔 𝑛 n‟implique pas 𝑔 𝑛 ≠ 𝑂 𝑓 𝑛
contre exemple 18𝑛3 − 35 ≠ 𝑂 𝑛 mais 𝑛 = 𝑂(𝑛3 )
10
21/05/2015
21 Algorithmique Avancée
Complexité algorithmique
Notations de Landau
La notation 𝑓 = 𝒐 𝑔 :
∀ 𝑐 ∈ ℝ +∗ , ∃𝑛0 , 𝑡𝑒𝑙𝑠 𝑞𝑢𝑒 ∀𝑛 > 𝑛 0, 𝑓 𝑛 ≤ 𝑐 ∗ 𝑔(𝑛).
Dans ce cas, f est négligeable symptotiquement devant g.
22 Algorithmique Avancée
Complexité algorithmique
Notations de Landau
Exemples :
𝑛 ∗ 𝑙𝑜𝑔𝑛 ∈ Θ 𝑛2 ?
Non
𝑛 ∗ 𝑙𝑜𝑔𝑛 ∈ 𝑂 𝑛2 ?
Oui
2 𝑛 ∈ Θ 𝑛3 ?
Non
𝑛3 ∈ Θ 2 𝑛 ?
Non
𝑛3 ∈ 𝑂 2 𝑛 ?
Oui
11
21/05/2015
23 Algorithmique Avancée
Complexité algorithmique
Notations de Landau
Exemples :
𝑛 𝑙𝑜𝑔 𝑛 = 𝑂 𝑛2 , 𝑂 𝑛3 , 𝑒𝑡𝑐. ,
𝑛=𝑜 𝑛 , log 𝑛 = 𝑜 𝑛 , 𝑛 = 𝑜 𝑛2 ,
log 𝑛 = 𝑜 𝑛 ,
𝑛 + log 𝑛 = Θ 𝑛 + 𝑛 .
24 Algorithmique Avancée
Complexité algorithmique
Quelques classes de complexité
12
21/05/2015
25 Algorithmique Avancée
Complexité algorithmique
Quelques classes de complexité
Exemples de temps d‟exécution en fonction de la taille de
la donnée et de la complexité de l‟algorithme, si on
suppose qu‟une instruction est de l‟ordre de la s;
26 Algorithmique Avancée
Complexité algorithmique
Quelques classes de complexité : convention (hiérarchie )
Pour faire un choix éclaire entre plusieurs algorithmes, il faut
être capable de situer leur complexité
De même :
1. un problème de complexité polynomiale est considéré facile
2. sinon (complexité non-polynomiale ou inconnue (!)) il est
considéré difficile
13
21/05/2015
27 Algorithmique Avancée
Complexité algorithmique
Quelques classes de complexité : convention (hiérarchie )
28 Algorithmique Avancée
Complexité algorithmique
Classes de complexité : Les limites de la convention
14
21/05/2015
29 Algorithmique Avancée
Complexité algorithmique
Exemple 1
// t tableau de n entiers
// n entier >0
30 Algorithmique Avancée
Complexité algorithmique
Exemple 2
// t tableau de n entiers
// n entier >0
for (i=0; i<n-1; i++)
for (j=0; j<n-1-i; j++)
if (t[j+1] <t[j])
echanger(t[j],t[j+1]);
15
21/05/2015
31 Algorithmique Avancée
Complexité algorithmique
Exemple 3
// t tableau de n entiers
// n entier >0
boolean permute=true;
int last=n-1;
while permute {
permute=false;
for (j=0; j<last; j++)
if (t[j+1] <t[j]){
permute=true;
echanger(t[j],t[j+1]);
}
last=last-1;
}
dans le meilleur des cas en O(n)
dans le pire des cas en 𝑂 𝑛2 , donc quadratique
32 Algorithmique Avancée
Complexité algorithmique
Exemple 4 Multiplication à la Russe ... ou à l‟Egyptienne
Quelle est la complexité de:
\\ x >=y >=0
int Mult (int x, int y)
int R=0;
int a=x, b=y;
while (b>0){
if ( b %2 ==1)
R=R+a;
a=2*a;
b= b/2;
}
\\ R= a*b
16
21/05/2015
33 Algorithmique Avancée
Complexité algorithmique
Exemple 5
34 Algorithmique Avancée
Récursivité et Paradigme
Diviser pour régner
Quelques approches génériques pour aborder la résolution
d’un problème :
17
21/05/2015
35 Algorithmique Avancée
Introduction
Approche par force brute
Exemple simple :
Rechercher un élément dans un tableau (trié ou non) en le parcourant
linéairement
Calculer 𝑎 𝑛 en multipliant 𝑎 n fois av ec lui-même
I mplémentation récursive naïve du calcul des nombres de Fibonacci
(v oir plus loin)
...
36 Algorithmique Avancée
Introduction
Approche par force brute
Exemple simple :
Rechercher un élément dans un tableau (trié ou non) en le parcourant
linéairement
Calculer 𝑎 𝑛 en multipliant 𝑎 n fois av ec lui-même
I mplémentation récursive naïve du calcul des nombres de Fibonacci
...
18
21/05/2015
37 Algorithmique Avancée
Introduction
Approches par force brute pour le problème de tri :
Définition : Un tableau est trié (en ordre croissant) si tout élément est
plus petit que l‟élément à sa droite
38 Algorithmique Avancée
Introduction
Dans la plupart des cas, il existe une meilleure solution. Dans certain
cas, c‟est la seule solution possible
19
21/05/2015
39 Algorithmique Avancée
Récursivité
Concept de récursivité
40 Algorithmique Avancée
Récursivité
Concept de récursivité
20
21/05/2015
41 Algorithmique Avancée
Récursivité
Conditions d'arrêt et appels récursifs
Pour que la condition d'arrêt soit vraie, il faut que les appels
récursifs utilisent d'autres paramètres
Récursivité
Conditions d'arrêt et appels récursifs (Problème d’espace mémoire):
Appel récursif
Renvoi du résultat
Fin f(n) Fin f(n-1) Fin f(n-2)
21
21/05/2015
43 Algorithmique Avancée
Récursivité
Complexité des algorithmes récursifs
44 Algorithmique Avancée
Récursivité
Exemple de fonctions récursives : Factorielle
Algorithme: Algorithme:
22
21/05/2015
45 Algorithmique Avancée
Récursivité
Exemple de fonctions récursives : Puissance
Algorithme: Algorithme:
46 Algorithmique Avancée
Récursivité
Exemple de complexité sur une fonctions récursives implémentée
de façon naïve : Fibonacci
Fibonacci Itérative Fibonacci Récursive
𝑭𝟎 = 𝟎, 𝐅𝟏 = 𝟏; 𝑭𝟎 = 𝟎, 𝐅𝟏 = 𝟏;
𝑭𝒏 = 𝑭𝒏−𝟏 + 𝑭𝒏−𝟐 ,𝒏 ≥ 𝟐 𝑭𝒏 = 𝑭𝒏−𝟏 + 𝑭𝒏−𝟐 ,𝒏 ≥ 𝟐
23
21/05/2015
47 Algorithmique Avancée
Récursivité
Bilan sur la récursivité
Avantages
Code plus court et plus lisible
Permet d‟implémenter le paradigme de Diviser pour Régner
Inconvénients
Compliqué à analyser
Il peut y avoir des problèmes de mémoire
Tous les langage ne sont pas récursifs
Il n‟existe pas d‟algorithme récursifs pour tout
48 Algorithmique Avancée
Sinon :
24
21/05/2015
49 Algorithmique Avancée
𝑛
Diviser : on découpe le problème en 𝑎 sous-problèmes de tailles ,
𝑏
qui sont de même nature, avec a>1 et b>1.
50 Algorithmique Avancée
Si 𝜆>d, alors 𝑇 𝑛 = 𝑂 𝑛𝜆 ,
Si 𝜆<d, alors 𝑇 𝑛 = 𝑂 𝑛𝑑 ,
Si 𝜆=d, alors 𝑇 𝑛 = 𝑂(𝑛𝑑 log𝑛) .
25
21/05/2015
51 Algorithmique Avancée
52 Algorithmique Avancée
Définition Programme
26
21/05/2015
53 Algorithmique Avancée
fonction Recherche(T,x,d,f)
si f<d alors
renvoyer faux
sinon
𝒅+𝒇
𝒎= ; //milieu du tableau avec arrondi
𝟐
si T[m] = x alors
renvoyer vrai;
sinon
si T[m]<x alors
renvoyer Recherche(T,x,m+1,f);
sinon
renvoyer Recherche(T,x,d,m-1);
finsi
finsi
finsi
54 Algorithmique Avancée
27
21/05/2015
55 Algorithmique Avancée
56 Algorithmique Avancée
T tableau à trier
si n=1 alors
renvoyer T;
sinon
n = |T|; //taille du tableau
T1 = TriFusion(T[0...n/2]);
T2 = TriFusion(T[(n/2)+1...n−1]);
renvoyer Fusion(T1,T2);
Finsi
Complexité :
La profondeur de l'arbre est 𝑂(log 2 𝑛 ). A chaque étage 𝑂 𝑛
opérations de fusion: Complexité optimale : 𝑂 𝑛 log 2 𝑛
28
21/05/2015
57 Algorithmique Avancée
Le tri par fusion est base sur le fait que fusionner deux tableaux tries en un seul
tableau trie T1, T2 se fait en temps linéaire (sur le nombre total d„éléments,
dans le pire et le meilleur des cas) :
58 Algorithmique Avancée
Principe :
29
21/05/2015
59 Algorithmique Avancée
Principe :
60 Algorithmique Avancée
Principe :
Avant partitionnement
… éléments du tableau … p
d f
Apres partitionnement
30
21/05/2015
61 Algorithmique Avancée
Algorithme du partitionnement:
Introduire les indices i et j initialisés respectiv ement au début
et à l‟av ant dernier élément du tableau
Remonter i jusqu‟au premier élément supérieur au piv ot p;
redescendre j jusqu‟au premier élément inférieur à p
On échange les éléments d‟indice i et j
On itère ce procédé tant que i<=j
A la fin, on place la v aleur piv ot en position i
62 Algorithmique Avancée
SI d<f ALORS
i = partitionnement(T, d, f)
TriRapide(T, d, i-1)
TriRapide(T, i+1, f)
Fin SI
31
21/05/2015
63 Algorithmique Avancée
Algorithme de partitionnement:
I = d et j = f
p = T[f] //p valeur pivot
TANT QUE i<=j faire
TANT QUE i<f et T[i]<= p FAIRE
i = i + 1
FIN TQ
TANT QUE j>=d et T[i]>= p FAIRE
j = j - 1
FIN TQ
SI i < j ALORS
echanger(T[i],T[j])
FINSI
FIN TANT QUE
T[f]=T[i] et T[i]= p //on place la valeur pivot en i
renvoyer i //renvoyer l’endroit de la séparation
64 Algorithmique Avancée
Complexité
32
21/05/2015
65 Algorithmique Avancée
Complexité
66 Algorithmique Avancée
Remarques
33
21/05/2015
67 Algorithmique Avancée
On a vu
Des algorithmes de tri dont la complexité dans le pire des cas est en
O(𝑛2 ) (tri par sélection, tri à bulles).
Le tri fusion, dont la complexité dans le pire des cas est en O(n log n)
Corollaire
Aucun tri par comparaisons ne possède une complexité meilleure que
O(n log n). Le tri fusion a une complexité optimale.
34