Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Algorithme
Prof. A.SABOUR
Objectifs du cours ...
Objectif :
Calculer la complexité d’un algorithme
Notation de Landau
2
2
int Max(int x,int y, int z){
Exemple de TD
Return (x>y)? (x>z)?x:z:(y>z)?y:z; }
4
int maxtab2(int *T ,int nbr){
Exemple de TD int i ,j,max;
for(i=0;i<=nbr;i++)
for(j=i+1;j<=nbr;j++){
if (T[i]>T[j])
max=T[i];
} faux
return max;
}
La complexité
1aff+(nbr+2)test+ nbr+1(Inc)
nbr +1(aff+add) K1 ( Test)( K1-nbr)( Inc +Test if={test +aff})
Avec
K1=
6
Rappels : algorithmique I
Exemple 1:
problème : calculer xn
8
Pour comparer des solutions, plusieurs points
peuvent être pris en considération
9
Pour atteindre cet objectif, un algorithme utilise
deux ressources d’une machine: le temps et
l’espace mémoire.
12
Exemples
Exemple 3 :
sum = 0;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
sum++;
int recherche1(int *tab, int C){ int recherche2(int *tab, int n, int C){
int i; int sup, inf, milieu;
int trouve;
i = 0;
inf = 0; sup =n-1; trouve = 0;
while (i<n && tab[i] != C ) while (sup >=inf && !trouve) {
i ++; milieu = (inf + sup) / 2;
if (i == n) if (C == tab[milieu])
return(-1); trouve = 1;
else if (C < tab[milieu])
else return(i);
sup = milieu -1;
} /* fin de la fonction */ else inf = milieu + 1;
}
if (!trouve)
return(-1); // pour indice impossible
return(milieu); // la position
} /* fin de la fonction */ 15
La méthode empirique
16
Problème!
Ces résultats dépendent
de la machine utilisée;
du jeu d’instructions utilisées
de l’habileté du programmeur
du jeu de données générées
du compilateur choisi
de l’environnement dans lequel est exécuté les deux
algorithmes (partagé ou non)
.... etc.
17
Méthode mathématique
18
Cette manière de procéder est justifiée par le fait que la
19
Comment choisir entre plusieurs
solutions?
1. décompte des instructions
Reconsidérons la solution 1 (recherche
séquentielle) et faisons le décompte des
instructions. Limitons-nous aux instructions
suivantes:
21
Meilleur cas: notée par tmin(n) représentant la
complexité de l’algorithme dans le meilleur des cas en
fonction du paramètre n (ici le nombre d’éléments dans
le tableau).
!!!
23
Meilleur cas pour la recherche séquentielle :
Le cas favorable se présente quand la valeur C se
trouve au début du tableau
tmin(n) = e + 3t (une seule affectation et 3 test :
deux tests dans la boucle et un autre à l’extérieur de
la boucle)
Pire cas : Le cas défavorable se présente quand la
valeur C ne se trouve pas du tout dans le
tableau. Dans ce cas, l’algorithme aura à examiner,
tous les éléments.
tmax(n) = 1e + n(2t+1e+ 1a)+ 1t + 1t
= (n+1)e + na + (2n+2)t
24
Cas moyen: Comme les complexités favorable et défavorable sont
respectivement (e + 3t) et = (n+1)e + na + (2n+3)t, la compexité dans le
cas moyen va se situer entre ces deux valeurs. Son calcul se fait comme
suit:
Pour plus de simplicité, on suppose que C existe dans le tableau. On
suppose aussi que sa probabilité de présence dans l’une des positions de
ce tableau est de 1/n.
Si C est dans la position i du tableau, la complexité t(i) de l’algorithme est:
= (n-1)(e+a+2t)/2 + e+4t
25
Complexité asymptotique
Le décompte d’instructions peut s’avérer fastidieux à
effectuer si on tient compte d’autres instructions telles
que :
accès à un tableau,
E/S, opérations logiques,
appels de fonctions,.. etc.
De plus, même en se limitant à une seule opération,
dans certains cas, ce décompte peut engendrer des
expressions que seule une approximation peut
conduire à une solution.
Par ailleurs, même si les opérations élémentaires ont
des temps d’exécution constants sur une machine
donnée, ils sont différents néanmoins d’une machine à
une autre.
26
Par conséquent :
Pour ne retenir que les caractéristiques
essentielles d’une complexité, et rendre ainsi
son calcul simple (mais indicatif!), il est
légitime d’ignorer toute constante pouvant
apparaître lors du décompte du nombre de fois
qu’une instruction est exécutée.
27
Ainsi, si
tmax(n) = (n+1)e + (n-1)a + (2n+1)t,
alors on dira que la complexité de cette
algorithme est tout simplement en n. On a
éliminé tout constante, et on a supposé aussi
que les opérations d’affectation, de test et
d’addition ont des temps constants.
28
Une notation mathématique, permettant de
représenter cette façon de procéder, est décrite dans
ce qui suit:
29
Notation grand-O
Définition: Soit T(n) une fonction non négative.
La notation grand-O
T(n) est dans O(f(n)) indique unedeux
s’il existe borne
constante
supérieure
positives c et sur le temps
n0 telle que. d’exécution.
T(n) cf(n)
Exemple: Si T(n) = 3nn2 >+2
pour tout n0.
alors T(n) O(n2).
Utilité: Le temps d’exécution est T (n) O( f (n))
On désire le plus de précision possible:
Signification: Pour toutes les grandes3entrées (i.e., nn0),
Bienonque T(n)que
est assuré = 3n 2
+2 O(n
l’algorithme ), pas plus de cf(n)
ne prend
on préfère O(n2).
étapes.
Borne supérieure.
30
Notation grand-O
31
Grand-O: Exemples
32
Grand-O: Exemples
33
Grand-Omega W
Définition: Soit T(n), une fonction non négative. On a
T(n) = W(g(n)) s’il existe deux constantes positives c
et n0 telles que T(n) cg(n) pour tout n > n0.
Borne inférieure.
34
Grand-Omega: Exemple
36
La notation Theta Q
37
Analyse de la complexité :
Notation de Landau:
On ne s ’intéresse pas en général à la complexité
exacte, mais à son ordre de grandeur.
=> besoin de notations asymptotiques.
38
Analyse de la complexité : algorithme de tri
Classes de complexité
Les algorithmes usuels peuvent être classés en un certain nombre de
grandes classes de complexité :
– Les algorithmes sub-linéaires dont la complexité est en général en
O(logn).
– Les algorithmes linéaires en complexité O(n) et ceux en complexité
en O(nlogn) sont considérés comme rapides.
– Les algorithmes polynomiaux en O(nk) pour k > 3 sont considérés
comme lents, sans parler des algorithmes exponentiels (dont la
complexité est supérieure à tout polynôme en n) que l’on s’accorde à
dire impraticables dès que la taille des données est supérieure à
quelques dizaines d’unités.
39
Exemple
Q(n)
Q(n2)
Q(n3)
Q(2n)
Q(lg n)
41
Erreurs fréquentes
Si
f(n) = O(g(n))
et
g(n) = O(h(n)),
alors
f(n) = O(h(n)).
Si
f(n) = O(kg(n))
où k > 0, une constante
alors
f(n) = O(g(n)).
Si
f1(n) = O(g1(n))
et
f2(n) = O(g2(n)),
alors
(f1 + f2)(n) = O(max(g1(n), g2(n)))
(f1 + f2)(n) = O(g1(n)+g2(n)))
Règles de simplification 4
Si
f1(n) = O(g1(n))
et
f2(n) = O(g2(n))
alors
f1(n)f2(n) = O(g1(n) g2(n))
Règles pour calculer la complexité d’un algorithme
51
Exemples
Exemple 1: a = b;
Exemple 2:
somme = 0;
for (i=1; i<=n; i++)
somme += n;
Temps: Q(n)
52
Exemples
Exemple 3:
somme = 0;
for (j=1; j<=n; j++)
for (i=1; i<=n; i++)
somme++;
for (k=0; k<n; k++)
A[k] = k;
53
Exemples
Exemple 4:
somme = 0;
for (i=1; i<=n; i++)
for (j=1; j<=i; j++)
somme++;
54
Exemples
Exemple 5:
somme = 0;
for (k=1; k<=n; k*=2)
for (j=1; j<=n; j++)
somme++;
55
Efficacité des algorithmes
Définition: Un algorithme est dit efficace si sa
complexité (temporelle) asymptotique est dans O(P(n))
où P(n) est un polynôme et n la taille des données du
problème considéré.
A1 log n T1 Z1 = T1100
A2 n T2 Z2 =100 T2
A3 n log n T3 Z3 = 100 T3
A4 n2 T4 Z4 = 10 T4
A5 2n T5 Z5 = T5 +log 100
59
Par conséquent, on obtient ce qui suit:
T6 Z6
T6 Z6
100
e e
61
1. Si L = constante 0, alors f et g sont de
même ordre, c’est-à-dire que f(n) =
O(g(n)) et g(n) = O(f(n)) ou tout
simplement O(f(n)) = O(g(n)).
2. Si L = 0 alors f est de l’ordre de g, c’est-à-
dire f(n) = O(g(n)).
3. Si L = alors g est de l’ordre de f,
c’est-à-dire g(n) = O(f(n)).
62
Remarque: dans plusieurs cas, pour faciliter
les calculs, la règle suivante de l’Hôpital est
souvent utilisée. Cette règle est pratique car,
en général, la dérivée d’une fonction est facile
à évaluer que la fonction elle-même:
f ( n) f ' ( n)
lim lim '
n g ( n ) n g ( n)
Lire: limite quand n tend vers l’infini, le
rapport des deux fonction est égal au rapport
des leur première dérivée
63