Complexité

publicité
04/11/2008
Déroulement
Algorithmes et
structures de données
(avancées)
Cours 7
Patrick Reuter
• CM mardi de 8h à 9h (salle 33)
• TD
- Groupe 1 : mardi, 13h30 – 15h00 (salle 51D)
- Groupe 2 : mardi, 15h15 – 16h45 (salle 51D)
(en alternance: salle TD et salle machine)
http://www.labri.fr/~preuter/asd2008
(rendre la feuille à la prochaine séance)
Complexité
• TP 4
• Complexité
• Fonctions
Exigences à un programme
• Lisibilité
• Extensibilité
• Portabilité
• Réutilisable
• Fiabilité
• Efficacité (faible complexité)
Complexité
• Quel est le temps d’éxécution du programme?
Æ Complexité temporelle
De combien de mémoire le programme a-t-il besoin?
Æ Complexité de mémoire (ou Complexité spatiale)
Comment déterminer ces complexités ?
Æ méthode empirique
Æ méthode mathématique
Complexité
Méthode mathématique
• Théorie de la complexité
– Temporelle
– Spatiale
• Basée sur une machine abstraite
– Random-access memory (RAM)
– Instructions de base (affectation, boucle, appel de
fonctions …)
• longueur des données d’entrée n
• Ce temps est une fonction T(n) où n est la
longueur des données d’entrée.
1
04/11/2008
Théorie de la complexité –
Changement de la fonction
Complexité : T(n) – Exemple 1
2ème solution
changer la fonction
• Calculer
• T1(n) = log2n
somme =0;
i=1;
logarithmique
• T2(n) = n
TANT QUE i <= n FAIRE
DEBUT
somme = somme + i;
i=i+1;
FIN
linéaire
• T3(n) = n log2 n
Quasi-linéaire
• T4(n) = n2
quadratique
Affectations :
Comparaisons :
2 +2*n
n+1
Æ T(n) = 3n+3
• T5(n) = n3
cubique
• T6(n) = 2n
exponentiel
Théorie de la complexité
Classes de Grand-O
•
•
O(1)
O(log n)
complexité constante
complexité logarithmique
•
O(n)
complexité linéaire
•
O(n log n)
complexité quasi-linéaire
•
O(na)
–
–
•
complexité polynomiale
O(n2)
O(n3)
complexité quadratique
complexité cubique
O(an)
complexité exponentielle
O(log n) ⊂ O(n) ⊂ O(n log n) ⊂ O(n2) ⊂ O(n3) ⊂ O(2n)
Théorie de la complexité
•
Théorie de la complexité
•
•
Notation Grand-O
Exemple : (Exemple de T(n) = 3n+3)
Si
T(n) ≤ c n
pour une constante c et toutes les valeurs de n>n0, on dit
« T(n) est dans O(n) »
ou bien
T(n) ∈ O(n)
ou, par abus d’écriture,
T(n) = O(n)
Retour sur TP (1)
En général :
O(f) = {g | ∃c > 0 : ∃ n0 > 0 : ∀ n ≥ n0 : g(n) ≤ c f(n)}
Soit g une fonction non négative.
g est dans O(f) s’il existe deux constantes positives c et n0
telles que g ≤ cf(n) pour tout n > n0.
EXEMPLE : T(n) = 9n2 ∈ O(n2)
f = n2, g = 9n2
2
04/11/2008
Théorie de la complexité –
Changement de la fonction
• Question : est-ce qu'il faut inclure le tri dans
le chronométrage ?
--> en info, nous traitons souvent les données
en un préprocès, et après on en profite ….
2ème solution
changer la fonction
• T1(n) = log2n
logarithmique
• T2(n) = n
• 3 courbes
linéaire
• T3(n) = n log2 n
• O(n) recherche linéaire
• O(log n) recherche dichotomique
• O(n log n) tri
Quasi-linéaire
• T4(n) = n2
quadratique
• T5(n) = n3
cubique
• T6(n) = 2n
exponentiel
• Algorithme A1 en O(n)
• A2 : Exécuter 4 fois l’algorithme A1
• Quel est sa complexité ?
Elimination des constantes
• Algorithme A1 en O(n)
Si
T(n) ∈ O(kf(n))
où k > 0,
0 une constante
alors
T(n) ∈ O(f(n)).
• A3 : Exécuter 4n2 fois l’algorithme A1
• Quel est sa complexité ?
Les constantes sont ignorées!
3
04/11/2008
Règle des produits
Si
T1(n) ∈ O(f(n))
• Algorithme A1 en O(n)
• Algorithme A2 en O(n2)
et
T2(n) ∈ O(g(n))
• A4: Exécution successive de A1 et A2
alors
T1(n)T2(n) = O(f(n) g(n))
• Quel est sa complexité ?
Transitivité
Règle des sommes
Si
T1(n) ∈ O(f(n))
et
T2(n) ∈ O(g(n)),
alors
T1(n) + T2(n) ∈ O(max(f(n), g(n)))
Si
f(n) ∈ O(g(n))
et
g(n)) ∈ O(h(n)),
g(
( ( ))
alors
f(n) ∈ O(h(n)).
La notation Grand-O est transitive
La base du logarithme
• Algorithme A1 avec T1(n) = log2n
logan =
logbn
_____
logba
• Algorithme A2 avec T2(n) = log10n
• Quelle algorithme a la meilleure
complexité asymptotique ?
4
04/11/2008
La base du logarithme
logan =
logbn
_____
La base du logarithme
logan =
logba
logbn
_____
logba
< == >
< == >
logbn = logb a * loga n
logbn = logb a * loga n = c * loga n
La base du logarithme
logan =
logbn
_____
logba
< == >
logbn = logb a * loga n = c * loga n
Avec c = logb a
(ne dépend pas de n)
Æ
c peut être considéré
comme une constante
Fonctions
• Déclaration de fonctions
• Appel de fonction : Passage de paramètres
– Appel par valeur
– Appel
A
l par référence
éfé
• Ne pas confondre : afficher et retourner
(return !)
5
04/11/2008
Fonctions : mauvaise solution
FONCTION maximum(a, b)
DEBUT
SI a>b ALORS
afficher(a);
ffi h ( )
SINON
afficher(b);
Appel :
FIN
x = 3;
y = 5;
maximum(x,y);
Fonctions : bonne solution
FONCTION maximum(a, b)
DEBUT
SI a>b ALORS
return
t
a;
SINON
return b;
Appel :
FIN
x = 3;
y = 5;
afficher(maximum(x,y));
Fonctions : Passage de
paramètres
• Appel par valeur
• Appel par référence
Fonctions : bonne solution
FONCTION maximum(a, b)
DEBUT
SI a>b ALORS
return
t
a;
SINON
Appel :
return b;
x = 3;
FIN
y = 5;
z = maximum(x,y);
afficher(z);
Fonctions : bonne solution
En-tête de la fonction
FONCTION maximum(a, b)
DEBUT
SI a>b ALORS
Paramètres de la fonction
return
t
a;
SINON
Valeur de retour de la fonction
return b;
Corps de la fonction
FIN
Appel :
afficher(maximum(x,y));
Fonctions : Appel par valeur
FONCTION maximum(a, b)
DEBUT
SI a>b ALORS
return
t
a;
SINON
Appel :
return b;
x = 3;
FIN
y = 5;
z = maximum(x,y);
afficher(z);
6
04/11/2008
Fonctions : Appel par valeur :
Faire tourner
x
y
a
b
3
5
Fonctions : Appel par valeur
FONCTION maximum(a, b)
DEBUT
SI a<b ALORS
a=b;
b
return a; x
y
a
FIN
z
3
5
5
Appel :
x = 3;
y = 5;
z = maximum(x,y);
afficher(z);
b
z
3
5
3
5
Fonctions : Appel par valeur
FONCTION maximum(a, b)
DEBUT
Variables locales
SI a>b ALORS
c=a;
SINON
y a
x
b
c=b;
3
return c;
5
FIN
3
5
5
Fonctions : Appel par valeur
Appel :
x = 3;
y = 5;
z = maximum(x,y);
afficher(z);
c
5
z
5
5
FONCTION maximum(a, b)
DEBUT
SI a>b ALORS
c=a;
SINON
c=b;
return c;
FIN
Appel :
x = 3;
y = 5;
z = maximum(x,y);
afficher(z);
afficher(c); // ERREUR!
5
Fonctions : Appel par référence
FONCTION maximum(&a, &b)
DEBUT
SI a<b ALORS
a=b;
b
return a; x (et a) y (et b) z
FIN
Appel :
x = 3;
y = 5;
z = maximum(x,y);
afficher(z);
3
5
5
5
7
04/11/2008
Fonctions : Appel par valeur
Appel :
a = 3;
bidon(a);
afficher(a);
FONCTION bidon(x)
DEBUT
x=x+2
FIN
a
x
3
3
5
Fonctions : Appel par référence
FONCTION bidon(&x)
DEBUT
x=x+2
FIN
Appel :
a = 3;
bidon(a);
afficher(a);
a et x
3
5
Fonctions : Appel par valeur
Appel :
x = 3;
bidon(x);
afficher(x);
FONCTION bidon(x)
DEBUT
x=x+2
FIN
x
x (1er appel de la fonction)
3
3
5
5
8
Téléchargement