PTSI2 – 2016/2017 – Info Lycée La Martinière-Monplaisir – Lyon
Ch 8. Introduction à la complexité.
1 Principe, outils
1.a Introduction
Pour résoudre un problème, il existe souvent plusieurs algorithmes ; comment savoir lequel est le plus
efficace ? Pour cela, on utilise une mesure que l’on appelle la complexité temporelle, qui permet de
donner un ordre de grandeur du temps d’exécution de l’algorithme.
Précisons : ce n’est pas une bonne idée de prendre le temps exact d’exécution comme mesure d’effi-
cacité d’un algorithme, car ce temps va dépendre de la machine sur laquelle on le teste. Cependant,
on peut considérer que chaque "action élémentaire" exécutée va toujours prendre le même temps sur
une machine donnée. En conséquence le temps d’exécution est proportionnel au nombre de ces actions
élémentaires.
Ainsi, pour évaluer la complexité temporelle, on va dénombrer le nombre d’actions élémentaires exé-
cutées (nombre d’affectations, de comparaisons, d’opérations algébriques ...).
Par exemple, on souhaite afficher les diviseurs d’un nombre entier n.
pour iallant de 1ànfaire
si idivise nalors
afficher i
finsi
fin pour
Effectuons le compte de toutes les opérations :
1
Essayons d’améliorer l’algorithme précédent. On remarque que, si iest un diviseur de nalors ns’écrit
n=ij jest un entier. L’un des entiers est supérieur à ntandis que l’autre est inférieur à n. On
peut donc arrêter la boucle à bnc.
pour iallant de 1àbncfaire
si idivise nalors
afficher
finsi
fin pour
Décompte des opérations :
1.b Choix de la taille du problème
On cherche à déterminer comment le temps d’exécution varie en fonction d’un paramètre que l’on
appelle la taille du problème.
Pour les diviseurs d’un entier n, on pourra prendre, de manière naturelle, ncomme taille du problème.
Quand on travaille avec une liste ou une chaîne de caractères, on pourra réfléchir en fonction
Remarque : Lorsqu’un problème dépend d’un entier net que npeut devenir très grand, cela pourra être
plus pertinent de prendre comme taille du problème le nombre de chiffres de nplutôt que nlui-même.
1.c Ordre de grandeur : notation en O
Pour l’exemple des diviseurs de n, on a fait une évaluation assez fine du nombre d’opérations. Il n’est
pas nécessaire en général d’aller jusqu’à ce niveau de détail.
Par exemple, si le nombre d’opérations élémentaires est n2+ 3nalors, dès que la taille ndes données
devient importante, 3naugmente beaucoup moins vite que n2: c’est le terme n2qui est important
quand nest grand. En maths, cela s’écrit : 3n=o(n2). On résume cette situation en écrivant :
n2+ 3n=O(n2)on lit n2+ 3nest un grand "O" de n2
Lorsque la complexité est 5n2+ 3n, on écrit aussi : 5n2+ 3n=O(n2)(les coefficients multiplicatifs ne
comptent pas).
2
Remarque :
De manière générale, on dit que un=O(vn)s’il existe une constante Ctelle que |un| ≤ C|vn|à partir
d’un certain rang ; autrement dit, la suite un
vnnN
est bornée.
Exemple : Exprimer 3n+ 5(ln n)2à l’aide d’un O.
Voici un tableau des ordres de grandeur des temps d’exécution d’un problème de taille 106sur un
ordinateur à un milliard d’opérations par seconde.
Complexité Nom courant Temps
pour
n= 106
Remarques
O(1) temps constant 1ns Le temps d’exécution ne dépend pas des données trai-
tées, ce qui est assez rare.
O(log n)logarithmique 10 ns En pratique, cela correspond à une exécution quasi ins-
tantanée. Bien souvent, à cause du codage binaire de
l’information, c’est en fait la fonction log2nqu’on voit
apparaître ; mais comme la complexité est définie à un
facteur près, la base du logarithme n’a pas d’importance.
O(n)linéaire 1ms Le temps d’exécution d’un tel algorithme ne devient su-
périeur à une minute que pour des données de taille
comparable à celle des mémoires vives disponibles ac-
tuellement. Le problème de la gestion de la mémoire se
posera donc avant celui de l’efficacité en temps.
O(n2)quadratique 1/4h Cette complexité reste acceptable pour des données de
taille moyenne (n < 106) mais pas au-delà.
O(nk)polynomiale 30 ans si
k= 3
Ici, nkest le terme de plus haut degré d’un polynôme en
n; il n’est pas rare de voir des complexités en O(n3)ou
O(n4).
O(2n)exponentielle plus de
10300000
milliards
d’années
Un algorithme d’une telle complexité est impraticable
sauf pour de très petites données (n < 50).
3
1.d Temps d’exécution des instructions élémentaires en Python
Il est parfois difficile de savoir quel nombre d’opérations effectue Python pour réaliser une instruction
précise. En première approche, on peut considérer :
HOpérations en temps constant
Affecter une variable à un objet
Accéder (en lecture et en écriture) à un élément d’une liste Python, d’une chaîne de caractère
ou d’un tuple
Calculer la longueur d’une liste Python, d’une chaîne de caractères ou d’un tuple par la
fonction len
Créer une liste, une chaîne de caractères ou un tuple vide
Opérations usuelles sur les entiers (sauf sur de très très grands nombres : la complexité
dependra du nombre de bits dans les écritures binaires de ces nombres)
Ajouter un élément à une liste par la méthode append
HLes autres
Concaténer deux listes Python, chaînes de caractères ou tuples avec +: complexité en O(n)
nest la taille de la plus grande des deux listes
Extraire une tranche d’une liste Python, d’une chaîne de caractères ou d’un tuple (slicing) :
en O(k)kest la longueur de la tranche
1.e Premiers exercices
Pour chaque question, dire ce que fait l’algorithme et évaluer son coût.
Méthode
Choisir le paramètre qui sera la taille ndu problème.
Choisir quel type d’opérations l’on va dénombrer (la ou les plus significatives).
Compter les opérations choisies et passer au O.
1)Algorithme 1 : aest une liste de réels donnée
bliste vide
pour eélément de la liste afaire
si e<0alors
ajouter 0à la liste b
sinon
ajouter eà la liste b
finsi
fin pour
afficher b
4
2)Algorithme 2 : nest un entier naturel non nul donné
s0
pour iallant de 1ànfaire
pour jallant de 1ànfaire
ss+i+j
fin pour
fin pour
renvoyer s
3)Algorithme 3 : nest un entier naturel non nul donné
s0
pour iallant de 1ànfaire
pour jallant de 1àifaire
ss+i+j
fin pour
fin pour
afficher s
5
1 / 9 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 !