CPGE TSI Lycée P.-P. Riquet St-Orens de Gameville -1-
Informatique
Chapitre 3 : ALGORITHMIQUE ET PROGRAMMATION
Complément : INTRODUCTION A LA COMPLEXITE ALGORITHMIQUE
Il existe souvent plusieurs façons de programmer un algorithme. Si le nombre d’opérations à effectuer est peu important et les
données d’entrée de l’algorithme sont de taille faible, le choix de la solution importe peu. En revanche, lorsque le nombre
d’opérations et la taille des données d’entrée deviennent importants, 2 paramètres deviennent déterminants : le temps d’exécution
et l’occupation mémoire.
La notion de complexité crit le temps et la mémoire nécessaires pour exécuter un algorithme et permet donc de
caractériser son efficacité.
DEUX TYPES DIFFERENTS DE COMPLEXITE
1/ Définitions
Complexité en temps
La complexité en temps donne le nombre d’opérations effectuées lors de l’exécution d’un programme. On appelle Co
le coût en temps d’une opération o.
Complexité en mémoire (ou en espace)
La complexité en mémoire donne la place mémoire occupée lors de l’exécution d’un programme.
Rq : Le coût de la mémoire étant aujourd’hui relativement faible, on cherche en général à améliorer la complexité en
temps plutôt que la complexité en mémoire.
Pour chacune de ces complexités, on distingue la complexité dans le pire des cas, la complexité dans le meilleur des
cas, ou la complexité en moyenne. En effet, pour un même algorithme, suivant les données à manipuler, le résultat sera
déterminé plus ou moins rapidement.
Généralement, on s’intéresse au cas le plus défavorable, à savoir, la complexité dans le pire des cas.
2/ Détermination du coût d'un algorithme
Pour déterminer le coût d’un algorithme, on se fonde en général sur le modèle de complexité (imparfait) suivant :
• Une affectation, une comparaison ou une opération arithmétique est considérée comme l’unité de coût.
Le coût des instructions p et q en séquence est .
Le coût d’un test Si b Alors p Sinon q est inférieur ou égal à (à cause du temps d’évaluation de b).
Le coût d’une boucle Pour i 1 Jusqu'à i = n Faire p est si ce coût ne dépend pas de i. Quand le coût du
corps de la boucle dépend de la valeur de i, le coût total de la boucle est
1
n
i
i
Cp
.
Le cas particulier des boucles imbriquées illustre bien le principe de calcul du coût de la boucle Pour. Ainsi, si les 2
boucles sont répétées respectivement n et n' fois, alors le corps de la boucle interne est exécuté n.n' fois en tout. Le
coût est donc .
Le cas des boucles TantQue est plus complexe à traiter puisque le nombre de répétitions n’est pas connu a priori. On
peut en général majorer le nombre de répétitions de la boucle et ainsi majorer le coût de l’exécution de la boucle.
3/ Exemple : calcul d'une factorielle
Complexité en mémoire :
Complexité en temps :
Fonction factorielle(n)
Début
Si n=0 Alors
Retourner 1
Sinon
i 1
res 1
TantQue i n Faire
res res * i
i i +1
FinTQ
Retourner res
Fin
CPGE TSI Lycée P.-P. Riquet St-Orens de Gameville -2-
Informatique
COMPLEXITE ET NOTATION O( )
1/ Présentation
En réalité, lorsqu’on cherche à évaluer l’efficacité d’un algorithme, il est souvent inutile d’aller jusqu’à ce niveau de
détail : on se contentera de dire que le nombre d’opérations effectuées est par exemple proportionnel à n. En effet :
- les opérations élémentaires ne demandent pas toutes exactement le même temps de calcul et cachent donc un
facteur multiplicatif, borné mais impossible à déterminer précisément ;
- le même programme peut être exécuté sur 2 machines différentes, l’une étant par exemple 2 fois plus rapide que
l’autre. Cela ne change évidemment rien à l’efficacité de l’algorithme, et ce qui nous intéresse réellement n’est pas le
temps précis d’exécution d’un programme, mais l’ordre de grandeur de ce temps en fonction de la taille des données ;
- il y a des termes dominants dans le temps d’exécution d’un algorithme : si on a déterminé que ce temps était
proportionnel à n2 + 3.n, le terme 3.n devient négligeable devant n2 dès que la taille n des données devient un peu
importante. Pour décrire l’efficacité d’un algorithme, seul le terme qui croît le plus vite a donc un intérêt. Dans ce
dernier cas, on dira que l'algorithme est de complexité O(n2).
On dira qu’un algorithme a une complexité en O(f(n)) si son coût est, à partir d’un certain rang, inférieur au produit
de f(n) par une constante : il existe des entiers c et n0 tels que pour tout n ≥ n0, le coût c.f(n).
2/ Ordres de grandeur des temps d'exécution et exemples à connaître
Il n’est pas possible de dire en combien de temps un algorithme en O(n) s’exécute pour une valeur particulière de n,
puisque 2 algorithmes dont les temps de calcul seraient respectivement n.10-9 s et n.109 s sont tous les deux en O(n).
Cependant, on peut donner les ordres de grandeur des temps d’exécution que l’on rencontre en pratique pour un
problème de taille n = 106 sur un ordinateur personnel actuel :
Nom de la
complexité
Temps d'exécution
pour n = 106
Exemple d'algorithme
O(1)
constante
1 ns
Permutation
O(log(n))
logarithmique
10 ns
Recherche par dichotomie
dans un tableau trié
O(n)
linéaire
1 ms
Parcours de liste, par
exemple recherche du
maximum dans une liste
O(n2)
quadratique
1/4 h
Parcours de tableau en 2D
Tri naïf
O(nk)
polynomiale
30 ans si k = 3 (!)
Algorithme à k boucles
imbriquées
O(2n)
exponentielle
plus de 10300000
milliards d’années
Les algorithmes suivants calculent et affichent différentes listes de nombres. Quelle est leur complexité ?
Algorithme naïf de recherche d'un mot de m caractères dans une chaîne de n caractères : correspondant au
pire des cas, celui où le mot est absent de la chaîne.
Fonction Table1(n)
Début
Pour i 1 Jusqu i = 10 Faire
Ecrire(i*n)
FinPour
Fin
Fonction Table2(n)
Début
Pour i 1 Jusqu'à i = n Faire
Ecrire(i*i)
FinPour
Fin
Fonction Table3(n)
Début
Pour i 1 Jusqu'à i = n Faire
Pour j 1 Jusqu'à j = n Faire
Ecrire(i*j)
FinPour
FinPour
Fin
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !