Ce très court chapitre présente la complexité algorithmique et le vocabulaire associé. Quelques exemples sont présentés mais ce chapitre sert essentiellement de support à la suite du cours (notamment pour les tableaux, tris…).
Étant donné que pour un programme ou sous-programme donné, il y a plusieurs façons de réaliser l’implémentation et que pour certains programmes (notamment dans le cas des systèmes embarqués) il y a des contraintes matérielles fortes, il est nécessaire d’évaluer les performances des algorithmes que l’on écrit. Cette notion de performance correspond à la complexité algorithmique où on cherche à estimer à l’avance:
Pour cela, on évalue le nombres d’opérations élémentaires (affectations, additions, soustractions…, comparaisons…), le nombre d’itérations des boucles, le nombre de cases mémoires utilisées… La complexité d’un programme dépend souvent de variables d’entrée (valeurs demandées à l’utilisateurs, données mesurées…). En général, le calcul de complexité se fait sur:
on l’exprime également de manière asymptotique, c’est à dire comme une limite pour de grandes valeurs des paramètres d’entrées.
Soit la procédure suivante pour laquelle on cherche à mesurer la complexité en nombre de tests / comparaisons.
Quelles que soient les valeurs de a
et b
, il n’y aura qu’une seule comparaison. Par conséquent la complexité en temps (où l’on mesure les tests) est en moyenne / au mieux / au pire de 1. L’expression asymptotique de cette complexité est $O(1)$.
Soit la fonction suivante pour laquelle on cherche à mesurer la complexité en nombre d’affectations.
Ici on remarque que le meilleur des scénarios est atteint lorsque n
est négatif ou nul puisque dans ce cas, il n’y a qu’une seule affectation (l’initialisation de s
). A l’inverse si n
est positif, il s’agit du pire scénario puisque l’on a n+2
affectations (initialisation de s
puis n+1
itérations de boucles où il y a 1 affectation de s
).
La complexité asymptotique est calculée pour des sous-programmes lorsque la valeur (ou l’évolution de la valeur) des paramètres d’entrées influe sur les performances de l’algorithme. Sur la fonction ci-dessous, la complexité en affectations et additions est linéaire (notation $O(n$)). En effet, pour un n
quelconque, il y a n
additions et n+1
affectations. Quand n
devient très grand le n+1
est négligeable par rapport au n
et par conséquent le coût en affectations et additions de cette fonction est proportionnel à n
.
Les complexités asymptotiques habituelles les plus fréquentes sont les suivantes:
n
: polynomial en fonction des paramètres d’entréeLe site big-O cheat sheet \cite{bigo} propose les complexités asymptotiques pour un grand nombre d’algorithmes courants.
A titre d’exemple, la fonction ci-dessous a une complexité quadratique (si on mesure le nombre d’opérations arithmétiques):