I08 Un peu d’informatique théorique
Exercice : Démontrez à l’aide d’un invariant de boucle que la fonction suivante retourne n!pour tout n>2
1def factorielle(n):
2p=1
3k=1
4#p=k!et n−k>0
5while n-k>0:#p=k!et n−k−1>0
6k=k+1#p= (k−1)! et n−k>0
7p=p*k#p=k!et n−k>0
8#p=k!et n−k >= 0 et n−k <= 0 donc p=n!
9return p
III Temps d’exécution : complexité en temps
Nous avons maintenant un algorithme qui produit le résultat demandé et qui se termine ... un jour. Mais si
l’algorithme se termine dans 10000 ans, il est correct, mais peu intéressant. On va maintenant s’intéresser
à la durée d’exécution du programme ou plus précisément à « comment la durée d’exécution augmente
lorsque la taille des données augmente ».
Plusieurs problèmes se posent en fait, le temps exact d’exécution dépend de beaucoup de choses :
•langage dans lequel l’algorithme est implémenté (et en particulier si le langage est compilé ou
interprété)
•processeur et en particulier fréquence du processeur et propriétés de sa mémoire cache
•si d’autres programmes s’exécutent en même temps
•des données exactes que l’on utilise pour tester l’algorithme
On va donc essayer de caractériser l’efficacité d’un algorithme indépendamment de son implémentation en
comptant le nombre d’opérations élémentaires nécessaires à son exécution. (On va donc éviter d’utiliser les
fonctions « avancées » de python comme min ou in qui peuvent cacher un nombre important d’opérations)
Les types de données de bases pour nous seront les entiers, les nombres flottants et les caractères de taille
limitée (par exemple 64 bits). Les opérations de bases pour nous seront :
•addition, soustraction, multiplication...
•affectation, accès à un élément d’un tableau...
•test simple (<;>; ==...)
•renvoi d’une valeur pour une fonction
Ces opérations de bases ont normalement un faible temps d’exécution (quelques cycles d’horloge du pro-
cesseur), nous allons faire comme si elles ont le même temps et ce sera notre unité de base. On s’intéresse
ensuite au comportement asymptotique lorsque la taille des données traitée devient grande. Si l’on note la
taille des données net que le nombre d’opérations de base exécutées par l’algorithme est 3n2+ 2n+ 20
alors :
•seul le terme de plus grand ordre 3n2est réellement significatif et traduit le temps que mettra l’al-
gorithme à s’exécuter lorsque les données sont de taille un peu importante;
•le préfacteur 3devant le n2n’est pas très intéressant , en effet, toutes les opérations de bases n’ont
pas réellement le même temps d’exécution et il dépend en particulier de la machine exacte sur
laquelle on fait tourner l’algorithme;
•on se limite donc à dire que l’algorithme a un temps d’exécution qui croit de la même façon que n2
et on parle de complexité en temps.
PCSI Page 4/7