PTSI – IC ALGORITHMIQUE
Si la fonction fcaractérise l’efficacité d’un algorithme, on veut avoir l’assurance que l’exécution du programme sera
terminée en un temps proportionnel à f(n), éventuellement moins mais pas plus. On cherche donc un majorant du
temps d’exécution, autrement dit on retiendra le pire des cas pour exprimer la complexité.
b) Complexité dans le meilleur des cas
La complexité au pire est la plus significative, mais dans certains cas, il peut être utile de connaître aussi la complexité
dans le meilleur des cas, pour avoir une borne inférieure du temps d’exécution d’un algorithme.
En particulier, si la complexité dans le meilleur et dans le pire des cas sont du même ordre, cela signifie que le temps
d’exécution de l’algorithme est relativement indépendant des données et ne dépend que de la taille du problème.
c) Complexité en moyenne et complexité amortie
Certains algorithmes ont des temps d’exécution très différents suivant les données d’entrées. Par exemple, certains al-
gorithmes pour trier un tableau de taille nprennent un temps proportionnel à nsi le tableau est trié et proportionnel à
n2dans le cas le pire. On s’intéresse donc parfois à la complexité en moyenne d’un algorithme.
Parler de moyenne des temps d’exécution n’a de sens que si l’on a une idée de la fréquence des différentes données
possibles pour un même problème de taille n. Les calculs de complexité moyenne sont très difficiles dans le cas général,
mais peuvent parfois être intéressants si on connaît à l’avance la fréquence d’apparition des différents types de données.
Par ailleurs, il existe des problèmes où le cas le pire peut se produire mais où, sur des exécutions répétées, on a la cer-
titude que celui-ci ne se produira que peu fréquemment. Prenons l’exemple d’une personne désirant envoyer un SMS
depuis un téléphone mobile. Quelle est la complexité en temps de cet envoi? Si tout se passe bien, la rédaction et l’en-
voi se font en 2 minutes. En revanche, dans le cas le pire, la batterie du téléphone est déchargée, il convient donc de la
recharger pendant 4 heures. La complexité dans le cas le pire pour un envoi est donc de 4 heures et 2 minutes.
Mais la complexité pour nenvois, où nest grand, est bien inférieure à 4nheures et 2nminutes. En effet, une fois le
téléphone chargé, son utilisateur va pouvoir envoyer un millier de SMS avant de devoir recharger la batterie. On peut
donc dire que dans le cas le pire, l’envoi de nSMS successifs va demander ( n
1000 +1) ×4 heures plus 2nminutes. On a
donc la garantie que pour ngrand, le temps mis pour envoyer nSMS est au plus de l’ordre de n
1000 ×4×3600 =n×14,4
secondes plus 2nminutes. Autrement dit, le temps mis pour envoyer un SMS est de l’ordre de 2 minutes et 14 secondes.
On dit que cette durée est la complexité amortie représentant le coût de l’envoi. La notion d’amortissement vient de
la comptabilité : le coût d’un kilomètre en voiture est nul si la voiture fonctionne et que le plein est fait alors qu’il est
extrêmement élevé s’il faut commencer par acheter la voiture.
La notion pertinente pour mesurer ce coût est en général de calculer l’amortissement des dépenses initiales (l’achat de
la voiture) sur la totalité du kilométrage. C’est une situation qu’on retrouve en informatique : il arrive ainsi que, dans
certains problèmes, une opération ait un coût O(n) dans le cas le pire, où nest la taille du problème, et un coût constant
en complexité amortie. En Python, l’opération d’ajout d’un nouvel élément à un tableau de taille nà la fin de ce tableau
rentre dans ce cadre. Cependant, la théorie de la complexité amortie dépasse le cadre du programme.
d) Complexité en espace
Jusqu’ici nous avons uniquement discuté du temps d’exécution des algorithmes. Une autre ressource importante en
informatique est la mémoire. On appelle complexité en espace d’un algorithme la place nécessaire en mémoire pour
faire fonctionner cet algorithme. Elle s’exprime également sous la forme d’un O¡f(n)¢où nest la taille du problème.
Évaluer la complexité en espace d’un algorithme ne pose la plupart du temps pas de difficulté, il suffit de faire le total des
tailles en mémoire des différentes variables utilisées. La seule vraie exception à la règle est le cas des fonctions récursives,
qui cachent souvent une complexité en espace élevée, et sur lequel on reviendra en deuxième année.
5/5 DELAY – Paul Constans – 2016 - 2017