Chapitre 4
Complexité des algorithmes et notation
grand O
Ce texte d’introduction à l’efficacité des algorithmes se divise en trois parties. Nous verrons
d’abord comment représenter la complexité d’un algorithme à l’aide d’une fonction f(n), où n
correspond à la taille des données à traiter et f(n) correspond au nombres d’opérations d’un certains
types qui seront effectuées par l’algorithme. Comparer la rapidité de deux algorithmes revient donc
à comparer deux fonctions.
À la deuxième section, nous introduirons les notations grand O et grand Thêta. Celles-ci sont en
quelque sorte analogues aux symboles et =: elle permettent de comparer « l’ordre de grandeur »
des fonctions. Cela nous permettra donc de comparer les algorithmes représentés par ces fonctions
afin de d’identifier lesquels sont plus efficaces pour traiter des données de grande taille.
À la dernière section, nous aborderons brièvement 2 questions importantes :
Est-ce que chaque problème peut être résolu par un algorithme ?
Parmi les problèmes résolubles, quels sont ceux qui peuvent l’être par un algorithme efficace ?
Finalement, nous discuterons des problèmes NP-complets et de la question à un million de dollars à
ce sujet.
4.1 Mesure de la complexité (en temps)
Vous souvenez-vous comment additionner et multiplier des nombres à la main ? Prenons le temps
d’effectuer en détails les opérations 738+625 et 738×625 .
Calculs :
1
2 CHAPITRE 4. COMPLEXITÉ DES ALGORITHMES ET NOTATION GRAND O
L’algorithme enseigné au primaire pour additionner deux nombres va donc comme suit (expliqué
ici à un humain et non à une machine) :
1. superposer les 2 nombres de façon à ce que les chiffres des unités soient alignés
2. tracer une ligne horizontale sous le nombre du bas
3. débuter par la colonne des unités (colonne de droite) :
(a) additionner les 2 chiffres de la colonne
(b) inscrire le chiffre des unités du résultat en dessous en notant la retenue au-dessus de la
colonne située juste à gauche s’il y a lieu
4. passer à la colonne suivante
(a) additionner les chiffres de la colonne (possibilité de 3 chiffres, car retenue possible)
(b) inscrire le chiffre des unités du résultat en dessous en notant la retenue au-dessus de la
colonne située juste à gauche s’il y a lieu
5. répéter le processus jusqu’à la dernière colonne (colonne la plus à gauche)
6. abaisser la dernière retenue potentielle, c’est-à-dire réécrire ce chiffre sous la ligne horizontale
7. lire le résultat sous la ligne horizontale
Si les 2 nombres à additionner ont chacun 4 chiffres, combien d’additions simples de 2 chiffres doit-
on effectuer pour obtenir le résultat ? Et si les nombres ont 10 chiffres chacun ? 20 chiffres chacun ?
100 chiffres chacun ? Et de façon plus générale, si les 2 nombres à additionner ont chacun nchiffres,
combien d’additions simples de 2 chiffres doit-on effectuer pour obtenir le résultat ?
Considérons maintenant l’algorithme de multiplication de 2 nombres de nchiffres chacun
enseigné au primaire, similaire à celui exposé ci-dessus pour l’addition. Combien cet algorithme
nécessite-t-il de multiplications simples de 2 chiffres ?
Geneviève Savard, ÉTS, 2014
4.1. MESURE DE LA COMPLEXITÉ (EN TEMPS)
3
Le temps d’exécution d’un algorithme donné dépend principalement de
la machine utilisée : langage, système d’exploitation, compilateur, vitesse de calcul de la
machine, etc.
les données auxquelles l’algorithme est appliqué.
Nous allons utiliser une mesure plus abstraite, qui ne dépend pas de la machine ni des données
elles-mêmes, mais plutôt de la taille des données (taille de « l’input »). Par exemple, le temps d’exé-
cution d’un algorithme de tri dépend de la longueur de la liste à trier. Le temps d’éxécution d’une
multiplication de deux nombres dépend du nombre de chiffres de ces nombres. Nous utiliserons
donc une fonction pour décrire la complexité d’un algorithme (voir figure 4.1).
fonction complexité
taille des données
temps ou
nombre d’opérations
FIG. 4.1 On utilise une fonction pour décrire la complexité d’un algorithme.
Exercice 4.1 Considérez l’algorithme de fouille séquentielle (« Linear Search ») et l’algorithme de
fouille dichotomique ( »Binary Search ») (voir les algorithmes 2 et 3, section 3.1, page 195, ou encore la
figure 4.2 qui présente leur implémentation sur Nspire). Nous choisissons ici d’étudier la complexité
dans le pire des cas (worst case complexity).
(a) Pour chacun des algorithmes, déterminez le nombre de comparaisons requises pour traiter
une liste de taille n.
(b) Lequel des deux algorithmes sera plus efficace pour traiter de grandes listes de données
préalablement ordonnées en ordre croissant ?
Exercice 4.2 Si l’algorithme A nécessite f(n) opérations d’un certain type pour résoudre un pro-
blème de taille net l’algorithme Ben nécessite g(n), déterminez lequel sera plus efficace pour
résoudre les gros problèmes lorsque
(a) f(n)=n3+3 et g(n)=25+n2.
(b) f(n)=2n+4n3et g(n)=10n4.
Pour répondre à cette question, vous avez peut-être tracé un graphe, observé un tableau, ou peut-
être avez-vous simplement utilisé vos connaissances antérieures sur les fonctions pour répondre
immédiatement à la question. Nous allons maintenant nous doter d’outils servant à comparer
rapidement deux fonctions et ainsi à identifier les algorithmes les plus efficaces.
Geneviève Savard, ÉTS, 2014
4 CHAPITRE 4. COMPLEXITÉ DES ALGORITHMES ET NOTATION GRAND O
FIG. 4.2 Fouille séquentielle, fouille dichotomique et recherche du maximum en TI Nspire.
Geneviève Savard, ÉTS, 2014
4.2. NOTATION GRAND O
5
4.2 Notation grand O
Définition 4.1 Soit fet gdeux fonctions de Rvers Rou de Nvers R. On dit que f(x) est grand-O
de g(x), que l’on note f(x)O(g(x)), si, en valeur absolue, fest éventuellement dépassée par un
multiple de g. Ainsi,
f(x)O(g(x)) ⇒ ∃CR,kR,xdom(f), x>k→ |f(x)| C|g(x)|
Cela signifie donc que la fonction |f|est bornée par un multiple de la fonction |g|à partir d’une
certaine valeur k du domaine (voir figure 4.3).
La borne k, appelée seuil, permet d’ignorer le comportement des fonctions pour les données de
petites tailles (dans ces cas, la complexité de l’algorithme est souvent dominée par des opérations
d’initialisation qui deviennent négligeables pour des données plus grandes).
La constante C, appelée facteur, permet de faire abstraction de la vitesse de la machine utilisée.
Les nombres ket Csont appelés témoins de la relation f(x)O(g(x)).
Il suffit de trouver une paire de témoins ket Cpour prouver que f(x) est O(g(x)). Mais il y a une
infinité de choix possibles. Alors il sera normal que vos réponses diffèrent de celles du manuel. Par
exemple, pour prouver que f(x)=5x2+6x+9 est O(x2), on peut fournir comme témoins C=7 et
k=4.1 ou C=10 et k=2.1 comme l’indique la figure 4.3, où g(x)=x2.
Le nombre d’opérations requises pour résoudre un problème ne peut être négatif. Ainsi, dans le
cas particulier des fonctions de complexité des algorithmes, les valeurs absolues de la définition ne
sont pas nécessaires car les fonctions prennent toujours des valeurs positives.
2.1
f
g
10 g
x4.1 x
f
g
7 g
C = 10 k = 2.1 k = 4.1C = 7
FIG. 4.3 Pour montrer que f(x)O(g(x)), il suffit de trouver une paire de témoin Cet k, mais il en existe une
infinité. Nous en présentons deux paires ici. Le but est de montrer qu’il existe un multiple de gqui dépasse f
pour toutes les valeurs de xà partir d’un certain seuil.
Exemple 4.1
Considérez les deux fonctions de Rvers Rsuivantes.
f(x)=5x2+6x+9 et g(x)=x2
Montrez que f(x)O(g(x)) en fournissant les témoins. Montrez ensuite que g(x)O(f(x)) en
fournissant les témoins.
Geneviève Savard, ÉTS, 2014
1 / 13 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 !