• Aucun résultat trouvé

2 Analyse des algorithmes

N/A
N/A
Protected

Academic year: 2021

Partager "2 Analyse des algorithmes"

Copied!
12
0
0

Texte intégral

(1)

A LGORITHMIQUE

Objectifs

A la fin de la séquence d’enseignement les élèves doivent :

• comprendre un algorithme et expliquer ce qu’il fait

• modifier un algorithme existant pour obtenir un résultat différent

• concevoir un algorithme répondant à un problème précisément posé

• expliquer le fonctionnement d’un algorithme

• écrire des instructions conditionnelles avec alternatives, éventuellement imbriquées

Table des matières

1 Introduction à l’algorithmique 2

1.1 Introduction . . . . 2

1.1.1 Structure de l’informatique . . . . 2

1.1.2 Poser proprement le problème . . . . 2

1.1.3 Première approche méthodologique . . . . 3

1.2 Pseudo-langage algorithmique . . . . 3

1.2.1 Données et constantes . . . . 3

1.2.2 Variables . . . . 3

1.2.3 Opérateurs . . . . 4

1.2.4 Expressions . . . . 4

1.2.5 Instructions . . . . 4

1.2.6 Fonctions . . . . 5

1.3 Principes debonneprogrammation . . . . 6

2 Analyse des algorithmes 6 2.1 Introduction . . . . 6

2.1.1 Problématique . . . . 6

2.1.2 Cas de l’industrie . . . . 6

2.2 La preuve de terminaison . . . . 7

2.2.1 Tester n’est pas prouver . . . . 7

2.2.2 Conjecture de Syracuse . . . . 7

2.2.3 Terminaison d’un algorithme . . . . 7

2.3 La preuve de correction . . . . 9

2.3.1 Problème de correction . . . . 9

2.3.2 Invariant de boucle . . . . 9

2.3.3 Cas des algorithmes récursifs . . . . 9

2.4 La complexité des algorithmes . . . . 10

2.4.1 Complexité en temps et en mémoire . . . . 10

2.4.2 Opérations élémentaires . . . . 10

2.4.3 Classes de complexité . . . . 11

2.4.4 Méthodes de calcul de la compléxité . . . . 12

(2)

1. INTRODUCTION À LALGORITHMIQUE 2/12

1 Introduction à l’algorithmique

1.1 Introduction

1.1.1 Structure de l’informatique

L’informatique est structurée par quatre concepts :

• l’algorithme :méthode opérationnelle permettant de résoudre un problème,

• la machine :système physique doté de fonctionnalités,

• le langage :moyen de communication entre l’informaticien et la machine,

• l’information :données symboliques susceptibles d’être traitées par une machine.

On se propose ici d’acquérir une méthodologie permettant de mettre sur le papier la résolution d’un problème bien posé.

Pour cela, nous utiliserons un ensemble d’instructions dont l’application permet de résoudre le problème en un nombre fini d’opérations.

1.1.2 Poser proprement le problème

1.1.2.1 Exemple 1 : permutation de deux voitures

PROBLÈME:permuter deux voitures sur un parking de trois places numérotéesP1,P2 etP3, sans gêner la circulation. La voitureAest sur l’emplacementP2, la voitureBest sur l’emplacementP3.

Avant permutation Après permutation

Un premier algorithmenaïf peut être le suivant : 1. déplacer la voitureBde l’emplacementP3àP1 2. déplacer la voitureAde l’emplacementP2àP3 3. déplacer la voitureBde l’emplacementP1àP2 Plusieurs imprévus peuvent se présenter :

• l’emplacement P1 est-il initialement libre ?

• les voituresAetBsont-elles en état de marche ?

• y-a-t-il de la circulation pendant l’échange des em- placements ?

• l’emplacementP3est-il pris pendant l’échange ? Cela est dû à un problème en partie mal posé. Précisons les choses :

• Données :

Parking de trois emplacements, numérotésP1,P2etP3. Deux voitures en état de marche :AsurP3, etBsurP2.

• Hypothèses générales : Un seul conducteur réalise la permutation.

Celui-ci a son permis de conduire et les clés des deux voitures.

Lorsqu’une voiture est en mouvement, aucune autre voiture ne vient sur le parking.

Une éventuelle autre voiture ne reste qu’un temps fini sur un emplacement.

• Résultats :La voitureBest sur l’emplacementP2. La voitureAest sur l’emplacementP3.

(3)

1. INTRODUCTION À LALGORITHMIQUE 3/12

L’algorithme est alors le suivant :

1. aller au volant de la voitureB(emplacementP3) 2. répéterattendrejusqu’àemplacementP1libre 3. déplacer la voitureBde l’emplacementP3àP1 4. aller au volant de la voitureA(emplacementP2) 5. répéterattendrejusqu’àemplacementP3libre

6. déplacer la voitureAde l’emplacementP2àP3 7. aller au volant de la voitureB(emplacementP1) 8. répéterattendrejusqu’àemplacementP2libre 9. déplacer la voitureBde l’emplacementP1àP2

1.1.2.2 Exemple 2 : résolution d’une équation PROBLÈME:résoudre l’équationa.x=b.

L’algorithme peut être mis sous la forme ALGO1.

Là encore, l’énoncé du problème n’est pas satisfaisant :

• quels sont les domaines de définition dex,a,b?

• les variables sont elles réelles, complexes, des vecteurs, des matrices ?

• qui est l’inconnue ?

Reformulons le problème : Soient a ∈ R et b ∈ R donnés. Trouver x tel que a.x=b.

L’algorithme est alors reformulé par ALGO2.

Algorithm 1

1: sia<>0alors

2: la solution estx=b/a

3: sinon

4: Il n’y a pas de solution

5: fin si

Algorithm 2

entrée: (a,b)∈R×R résultat:x=b/a

1: x=b/a

2: renvoi: x 1.1.3 Première approche méthodologique

Unbonalgorithme doit :

• être clair

• fournir un résultat satisfaisant

• être adapté au public visé

Pour cela, il est nécessaire de :

• poser correctement le problème

• rechercher une méthode de résolution

• écrire l’algorithme par raffinements successifs 1.2 Pseudo-langage algorithmique

Afin d’uniformiser l’écriture des algorithmes, un pseudo-langage (non normalisé) contenant l’indispensable est utilisé : des données, desvariables, desopérateurs, desexpressions, desinstructionset desfonctions.

1.2.1 Données et constantes

Unedonnéeest une valeur extérieure introduite dans l’algorithme. Uneconstanteest une valeur non modifiable (π, . . . ).

1.2.2 Variables

Une variable est un objet dont la valeur est modifiable.

Elle possède :

1. un identificateur : nom (suffisamment explicite)

(4)

1. INTRODUCTION À LALGORITHMIQUE 4/12

2. un type : simple (booléen, entier, réel, caractère) ou structuré (chaîne de caractères, liste, tuple, dictionnaire, . . . ), 3. une valeur

4. une référence : indique l’adresse de stockage dans la zone mémoire.

1.2.3 Opérateurs

Chaque type de donnée admet un jeu d’opérateurs adapté.

• Opérateurs arithmétiques

Nom Symbole

addition +

soustraction -

produit *

division /

division entière div ou //

modulo mod ou %

exposant ˆ ou **

• Opérateurs relationnels

Nom Symbole

identique ==

différent <>

inférieur <

supérieur >

inférieur ou égal <=

supérieur ou égal >=

• Opérateurs logiques

négation non,∼,¬

ou ou, |,∨

et et, &,∧ opération

d’affectation ← Concaténation

de liste +

1.2.4 Expressions

Une expression est un groupe d’opérandes(nombres, constantes, variables,. . . ) liées par desopérateurs. Elles sont évaluées pour donner un résultat.

EXEMPLE:expression numérique :b/aet expression booléenne :a,0 (vrai ou faux).

1.2.5 Instructions

Une instruction est exécutée. Elle peut contenir une ou plusieurs expressions.

Il existe des instructionssimplescomme l’affectation:x←b/aou l’appel de fonction : print("x=",x).

Mais il y a aussi des instructionsstructurées: groupe d’instructions, structures conditionnelles et structures itératives (ré- pétitives).

1.2.5.1 Groupe d’instructions simples

Algorithm 3 Résolution de l’équation du 1er degré a.x=b

entrée: a, un réel non nul etb: un réel résultat:x

1: x←b/a

renvoi: Affiche("x = ",x)

1.2.5.2 Instructions conditionnelles Algorithm 4Pair ou impair ?

entrée: n, un entier

résultat: r, un booléen vrai sinest pair, faux sin est impair

1: sin%2==0alors

2: r ←vrai

3: sinonr←faux

4: fin si renvoi: r

(5)

1. INTRODUCTION À LALGORITHMIQUE 5/12

1.2.5.3 Instructions répétitives

BoucleTant que: le nombre d’itérations n’est pas obligatoirement connu.

Algorithm 5Devinette

entrée: n, un nombre entier compris entre 1 et 10, généré aléatoirement

1: i←0

2: k←0

3: tant quei,nfaire

4: i←Entrer("Donner un nombre entier compris entre 1 et 10 : ") // demande faite à l’utilisateur

5: k←k+1

6: fin tant que

7: renvoi: Afficher("Gagné en ",k," coups !")

BoucleFor: le nombre d’itérations est forcément connu à l’avance.

Algorithm 6Somme des n premiers entiers

1: entrée: n, un entier

2: résultat: S, la somme desnpremiers entiers S ←0

3: pouri=1 ànfaire

4: S ←S +i

5: fin pour

6: renvoi: S 1.2.6 Fonctions

Les fonctions permettent :

• d’automatiser des tâches répétitives

• d’ajouter de la clarté à un algorithme

• d’utiliser des portions de code dans un autre algorithme

Le pseudo-langage algorithmique possède comme tout langage informatique desfonctions primitivesd’entrée/sortie telles queEntrer,Afficher, mais aussi des fonctions primitives mathématiques (cos,racine, . . . ). Il est aussi possible d’écrire ses propres fonctions.

Pour cela, il faut tout d’abord répondre à ces deux questions :

• quelles sont les données ?

• quel doit-être le résultat ?

Il faudra ensuite commenter l’algorithme : usage de la fonction, . . .

(6)

2. ANALYSE DES ALGORITHMES 6/12

1.3 Principes debonneprogrammation

Tous les algorithmes vus précédemment sont assez courts. D’autres peuvent être bien plus longs.

Dans l’industrie, il arrive que des équipes produisent des codes de millions de lignes, dont certains mettent en jeux des vies humaines (aéronautique, nucléaire, . . . ).

Toute la difficulté réside alors dans l’écriture de programmes sûrs. On constate que lorsqu’un algorithme est simple, le risque d’erreur est moindre. C’est sur ce principe essentiel que se basent lesbonnesméthodes.

Ainsi, tout problème compliqué doit être découpé en sous-problèmes simples

Chaque module ou sous-programme est alors testé et validé séparément. Tous les modules doivent aussi être largement do- cumentés.

2 Analyse des algorithmes

2.1 Introduction

2.1.1 Problématique

PROBLÈME:Comment s’assurer qu’un algorithme se termine, donne des résultats corrects et est efficace ? L’analyse des algorithmes peut se faire suivant trois axes :

• la terminaison :il s’agit de vérifier que l’algorithme ne tourne pas de manière infinie

• la correction :il faut s’assurer que le résultat renvoyé est le bon

• la complexité :on spécifie le temps d’exécution en fonction de la taille des données en entrée, ainsi que l’espace mémoire utilisé.

Pourquoi ces études sont-elles intéressantes ? On ne peut prouver un théorème par des exemples.

EXEMPLE:affirmerles nombres se terminant par 9 sont divisibles par 3est faux. Il est vrai que les cas 9, 39, 69 et 1239 fonctionnent mais 19 ne fonctionne pas.

Comment faire alors les tests permettant de mettre en lumière qu’une assertion ou un programme ne fonctionne pas ? 2.1.2 Cas de l’industrie

La preuve de programme n’est pas très développée en informatique industrielle. Le logiciel de vol de l’A380 (premier vol en 2005) est le premier à avoir été prouvé : on sait de façon certaine que les commandes de vol font ce qu’elles doivent faire.

Ce n’était pas le cas sur les avions précédents.

En réalité, dans l’industrie, on fait ce qu’on appelle des tests (ou benchmark) : des scénarios sont créés sur lesquels on teste les logiciels. On en déduit alors une fiabilité du logiciel qui sert d’argument de vente. Cette phase de tests fait parfois apparaître des erreurs étonnantes.

(7)

2. ANALYSE DES ALGORITHMES 7/12

On trouve toutes sortes d’anecdotes sur Internet :

• problème de terminaison :Amazon et le livre qui valait 23,7 million de dollars

• problème de correction :Sonde Mars Climate Orbiter

• problème de complexité :Portail France.fr

• problème de calcul numérique :Anti-missile Patriot 2.2 La preuve de terminaison

2.2.1 Tester n’est pas prouver

Il ne s’agit pas de lancer l’implémentation d’un algorithme pour vérifier qu’il se termine. Quand bien même on aurait ef- fectué un très grand nombre d’exécutions ayant toutes terminées, on ne pourrait pas pour autant affirmer que l’algorithme se termine. Il reste toujours la possibilité qu’un ensemble improbable de paramètres fasse échouer le système, et l’entraîne dans une exécution interminable. C’est unproblème de terminaison.

Le fond des choses est en fait bien plus compliqué qu’il n’y paraît. Un algorithme simple tel que le calcul de la suite de Syracuse pose encore aujourd’hui des problèmes aux mathématiciens.

2.2.2 Conjecture de Syracuse

La suite de Syracuse d’un nombre entierNest définie par récurrence de la manière suivante :

u0=Net pour tout entiern>0 :un+1 =





 un

2 siunest pair 3.un+1 siunest impair

0 5 1 0 1 5 2 0 2 5

0 2 0 4 0 6 0 8 0 1 0 0 1 2 0 1 4 0 1 6 0

N=30

0 2 4 6 8 1 0

1 2 3 4 5 6 7 8

N=8

Algorithm 7Suite de Syracuse donnée:N; un entier

résultat:syr; la liste des termes de la suite de Syracuse jusqu’à ce qu’un terme soit égal à 1.

Syracuse(N)

1: syr←[N]

2: i←0

3: tant que syr[i] !=1faire

4: sisyr[i] %2==0alors

5: syr←syr + [syr[i] / 2]

6: sinon

7: syr←syr + [3 * syr[i] + 1]

8: fin si

9: i←i+1

10: fin tant que

11: renvoi: syr Empiriquement, cet algorithme se termine.

On sait montrer qu’une fois arrivée à 1, la suite calculée a alors un cycle d’ordre 3. Mais on ne sait pas montrer que ce cycle est toujours atteint.

2.2.3 Terminaison d’un algorithme

(8)

2. ANALYSE DES ALGORITHMES 8/12

2.2.3.1 Définition

DÉFINITION: Terminaison d’un algorithme

un algorithme se termine, si son exécution sur machine s’arrête toujours quelque soit la nature des données en entrée

Certaines instructions se terminent sans même que l’on ait besoin de se poser de question. C’est le cas par exemple de l’affectation et de la composition de deux instructions qui se terminent.

2.2.3.2 Problématique

Leproblèmevient des bouclesTant que. L’exemple de la suite de Syracuse le souligne : une boucleTant ques’arrête lors- qu’une condition d’arrêt est réalisée, contrairement à la bouclePourqui s’arrête lorsqu’un nombre prédéfini de répétitions ont été effectuées.

EXEMPLE:Fonction PGCD

PROBLÈME: Comment déterminer le Plus Grand Diviseur Commun (PGCD) de deux entiers dont on ne connaît pas la fac- torisation ?

D’après l’algorithme ci-contre, on définit la fonction f(u,v)=u+v.

Cette fonction est strictement positive et décroissante : il ne peut donc y avoir une infinité d’itérations. On remarque aussi qu’elle tend vers deux fois la valeur finale deu(ouv).

REMARQUE: On pourrait aussi raisonner avec la fonction g(u,v)=max (u,v).

Algorithm 8Fonction PGCD

donnée:a et b ; deux entiers naturels non nuls résultat:u ; le PGCD de a et b

PGCD(a,b)

1: u←a

2: v←b

3: tant que u,vfaire

4: si u > valors

5: u←u-v

6: sinon

7: v←v-u

8: fin si

9: fin tant que renvoi: u EXEMPLE:Fonction PGCD : algorithme d’Euclide

PROBLÈME:Dans la tradition grecque, en comprenant un nombre entier comme une longueur, un couple d’entiers comme un rectangle, leur PGCD est la longueur du côté du plus grand carré permettant de carreler entièrement ce rectangle.

Algorithm 9Fonction PGCD : algorithme d’Euclide donnée:a et b ; deux entiers naturels non nuls résultat:le PGCD de a et b

Euclide_PGCD(a,b)

1: répéter

2: r←a mod b

3: a←b

4: b←r

5: jusqu’àr == 0 renvoi: a

A lanième itération, on a la relationan= qn.bn+rnoù qnest un entier.

L’algorithme d’Euclide entraîne cette définition de la suite (an): pour tout n tel que an+1 soit un entier positif, il existe un entierqntel que :an=qn.an+1+an+2. De plus, 0 ≤ an+2 < an+1 pour toutntel que an+1 est non nul.

La suite d’entiers naturels est donc strictement décroissante (tant qu’elle est non nulle) à partir du rang 1, et vaut donc 0 à un certain rang. Il en est donc de même pour la suite (rn).

(9)

2. ANALYSE DES ALGORITHMES 9/12

REMARQUE: L’algorithme d’Euclide (algorithme 3) présente l’avantage d’avoir une complexité en temps d’exécution moindre par rapport à l’algorithme initial (algorithme 2).

2.2.3.3 Variant de boucle

Pour faire une preuve de terminaison, on cherche donc ce que l’on appelle unvariant de boucle ou encore une fonction de terminaison, c’est à dire une suite d’entiers strictement croissante majorée ou de suite d’entiers strictement décroissante minorée.

REMARQUE:le nombre de valeurs prises par la fonction de terminaison est une bonne estimation du nombre de répétitions effectuées lors de l’exécution. Si l’on trouve un majorant de cette fonction, on aura donc un majorant du nombre de tours effectués par la boucle quelque soit l’entrée de l’algorithme. C’est donc un premier pas vers l’étude de la complexité.

2.3 La preuve de correction

2.3.1 Problème de correction

On peut montrer qu’un algorithme se termine bien, sans pour autant qu’il ne donne toujours le bon résultat : c’est un problème de correction.

EXEMPLE:Fonction PGCD : algorithme d’Euclide, structure itérative (algorithme 3)

On rappelle qu’à lanième itération, on a la relationan=qn.bn+rn=qn.an+1+an+2oùqnest un entier.

A la dernière itérationN,rN =aN+2=0. On a doncaN =qN.aN+1. La relation précédente montre queaN+1diviseaN. On écrit ensuite queaN−1=qN−1.aN+aN+1=(qN−1.qN+1).aN+1.

On en déduit queaN+1divise aussiaN−1; puis, de même, et par récurrence, queaN+1divise tous les termes de la suite (an) ; en particulier les premiers termesaetb.aN+1est donc bien un diviseur commun deaetb.

Réciproquement, tout diviseur commun deaetbdivise aussi tous les termes de la suite (an) ; donc en particulieraN+1.aN+1

est donc un diviseur commun deaetb, que divise tout autre diviseur commun ; c’est bien lePGCD(a,b).

Le PGCD deanetan+1pour toutnentier positif non nul, est ce que l’on appelle uninvariant de boucle. A chaque itération, c’est une propriété qui estconservée.

2.3.2 Invariant de boucle

Uninvariant de boucleest une propriété :

• qui est vérifiée après la phase d’initialisation,

• qui reste vraie après l’exécution d’une itération,

• qui, conjointement à la condition d’arrêt, permet de montrer que le résultat attendu est bien celui qui est calculé.

2.3.3 Cas des algorithmes récursifs

Pour prouver la correction d’unalgorithme récursif, on adopte unraisonnement par récurrence.

(10)

2. ANALYSE DES ALGORITHMES 10/12

La preuve s’effectue par induction (récurrence) sur la taille du problème à résoudre.

• la base de la récurrence est celle de la récursivité.

• l’étape de la récurrence : on suppose que l’algorithme est correct pour les appels récursifs précédents, et on montre qu’il fonctionne correctement pour l’appel actuel.

EXEMPLE : Fonction PGCD : algorithme d’Euclide, structure récursive

Algorithm 10Fonction PGCD : algorithme d’Euclide récursifs donnée:a et b ; deux entiers naturels non nuls tels que a>b résultat:le PGCD de a et b

Euclide_PGCD_recursif(a,b)

1: sib==0alors

2: renvoi: a

3: sinon

4: renvoi: Euclide_PGCD_recursif(b,a mod b)

5: fin si

• au dernier appel N de la fonction Euclide_PGCD_récursif, bN = 0. aN est donc lePGCD(aN,0).

• on suppose qu’au nième appel de la fonc- tion Euclide_PGCD_recursif, aN est le PGCD(an,bn).

• à l’appel n − 1 de la fonction

Euclide_PGCD_récursif :

an−1 =qn−1.bn−1+rn−1 =qn−1.an+bn Or aN étant le PGCD(an,bn), il est aussi plus grand diviseur de (an−1,an), c’est-à-dire queaN = PGCD(an−1,an) et doncaN =PGCD(an−1,bn−1).

• on en déduit par récurrence que aN = PGCD(a,b).

2.4 La complexité des algorithmes

2.4.1 Complexité en temps et en mémoire

En plus d’être correct, on demande à un algorithme d’être efficace.

Cette efficacité peut être évaluée par :

• le temps que prend l’exécution de l’algorithme : c’est la complexité en temps. Le temps d’exécution dé- pend de la taille des données fournies en entrées.

• les ressources nécessaires à son exécution : c’est la complexité en mémoire(cf cours Pivot de Gauss).

On se focalise donc par la suite sur l’étude la complexité en temps d’exécution, i.e. ennombre d’opérations élémen- taires.

Nous étudions donc le nombre d’opérations élémentaires de

manière asymptotique avec les notions mathématiques de Landau :O(),Θ().

On suppose que f(n)≥0 etg(n)≥0 pour tout entiern:

• f est appelée ungrand Ôde g et on note f = O(g) lorsqu’il existe un rangn0et une constantec>0 tels que∀n≥n0, f(n)≤c.g(n)

• f est appelée unthetadeget on note f = Θ(g) lors- qu’il existe un rangn0et une constantec1, c2>0 tels que∀n≥n0, c1.g(n)≤ f(n)≤c2.g(n)

Tout le travail de l’étude de complexité repose donc sur l’identification des opérations non élémentaires et sur le cal- cul de leur nombre.

2.4.2 Opérations élémentaires

On considère comme élémentaires les opérations :

• addition, soustraction, multipli- cation, division, modulo sur des entiers ou des flottants

• affectation simple,

• accès aux éléments d’un tableau

• modification d’un éléments d’un

tableau

• taille d’un tableau

• La méthode append sur une

(11)

2. ANALYSE DES ALGORITHMES 11/12

liste Python peut être considérée comme une opération basique.

• la gestion de la variable de

boucle d’une bouclePour

• les tests élémentaires, utilisés principalement dans les boucles

Tant queet les structures condi- tionnelles

Si l’on noteT(P) la complexité d’une instructionP, alors pour deux instructionsPetQ, on a :T(P;Q)=T(P)+T(Q).

Ainsi,T(Pouride1ànfaireP(i)FinPour)=

n

X

i+1

T(P(i)).

EXEMPLE:Somme géométrique

PROBLÈME:On souhaite calculer la somme des n premiers entiers.

Algorithm 11Somme des n premiers entiers donnée:n, un entier

résultat:S ; la somme des n premiers entiers Somme(n)

1: S←0

2: pouri de 1 à nfaire

3: S←S+i

4: fin pour

5: renvoi: S

Dans l’algorithme ci-dessus, on ne considère que le coûtt de la sommeS+ieffectuée à chaque itération de la boucle Pour.

Ainsi le coût total est de la forme C(n) = n.t. On dira que la complexité est du type : C(n) = Θ(n). Elle croît linéairement avec le nombre d’entiersn.

2.4.3 Classes de complexité

On définit différentes classes de complexité : Notation Type de complexité

Θ(1) Complexité constante Θ(ln(n)) Complexité logarithmique

Θ(n) Complexité linéaire Θ(n.ln(n)) Complexité quasi-linéaire

Θ(n2) Complexité quadratique Θ(n3) Complexité cubique Θ(np) Complexité polynomiale Θ(nln(n)) Complexité quasi-polynomiale

Θ(2n) Complexité exponentielle Θ(n!) Complexité factorielle

n 5 10 20 50 250 103 104 106

1 10 ns 10 ns 10 ns 10 ns 10 ns 10 ns 10 ns 10 ns

log(n) 10 ns 10 ns 10 ns 20 ns 30 ns 30 ns 40 ns 60 ns

O(n) 50 ns 100 ns 200 ns 500 ns 2,5µs 10µs 100µs 10

n.log(n) 50 ns 100 ns 200 ns 501 ns 2,5µs 10µs 100.5µs 10 050µs

n2 250 ns 1µs 4µs 25µs 625µs 10 ms 1 s 2,8 h

n3 1,25µs 10µs 80µs 1,25 ms 156 ms 10 s 2,7 h 316 ans

2n 320 ns 10µs 10 ms 130 jours 1059ans . . . . . . . . . n! 1,2µs 36 ms 770 ans 1045ans . . . . . . . . . . . .

En s’appuyant sur une base de 109 opérations par secondes, le tableau ci-dessous donne le temps d’exécu- tion des différentes complexités ci- tées ci-dessus.

Opération Python Coût moyen

Copy O(n)

Append O(1)

Insert O(n)

Obtenir un élément O(1) Changer un élément O(1) Supprimer un élément O(n)

Itération O(n)

Obtenir une sélection O(k) Supprimer une sélection O(n)

Changer une sélection O(k+n)

Extend O(k)

Trier O(n.log(n)) Multiplier O(nk)

x in s O(n)

min(s), max(s) O(n)

Length O(1)

Il apparaît deux choses :

• il faut éviter les complexités supérieures à la complexité polynomiale d’ordre 2 ;

• il ne faut absolument pas compter sur les avancées technologiques !

(12)

2. ANALYSE DES ALGORITHMES 12/12

Nous étudierons, lorsque l’exemple s’y prêtera, trois types de complexités en temps :

• la complexité dans le pire cas,Cmax:c’est un majorant du temps d’exécution sur toutes les entrées possibles d’une même taille ; la complexité dans le pire cas apporte une notion de sécurité sur le temps d’exécution ;

• la complexité en moyenne, Cmoy : il s’agit d’une moyenne sur le temps d’exécution sur toutes les entrées pos- sibles d’une même taille en considérant une distribution équiprobable ; elle représente le comportement moyen d’un algorithme ;

• la complexité dans le meilleur cas,Cmin:elle est peu utile, facile à calculer, mais n’apporte qu’une borne inférieure sur les temps d’exécution.

2.4.4 Méthodes de calcul de la compléxité

2.4.4.1 Méthode itérative

On somme membre à membre et on en déduit la com- plexité :

EXEMPLE:avec une récurrenceC(n)=C(n/2)+1 1 C(n) = C(n/2)+1

2 C(n/2) = C(n/4)+1 . . .

i C(n/(2i−1)) = C(n/(2i))+1 . . .

m C(1) = C(0)+1 C(n) = m=log2(n)+1

⇒ C(n)=O(ln(n))

2.4.4.2 Méthode par substitution on vérifie uneintuition:

• hypothèse par intuitionC(n)=g(n)

• démontrer quea.g(n/b)+ f(n) = g(n) avecg(1) = c en fixant les constantes

2.4.4.3 Méthode générale

on utilise les propriétés dessuites récurrentes linéaires.

On peut toujours écrire une relation de récurrence de la forme :

C(1) = c

C(n) = a.C(n/b)+ f(n)

Relation Solution Exemples

C(n)=C(n−1)+b C(n)=C(0)+b.n= Θ(n) factorielle, recherche séquentielle (ba- layage) récursive dans un tableau

C(n)=a.C(n−1)+b,a,1 C(n) = an.

C(0)− b 1−a

+ b 1−a

= Θ(an)

répétition a fois d’un traitement sur le ré- sultat de l’appel récursif

C(n)=C(n−1)+a.n+b C(n)=C(0)+a.n.(n+1)/2+n.b= Θ

n2 traitement en coût linéaire avant l’appel ré- cursif, tri à bulle

C(n)=C(n/2)+b C(n)=C(1)+b.log2(n)= Θ(ln(n)) recherche dichotomique récursive, expo- nentiation rapide

C(n)=a.C(n/2)+b,a,1 C(n) = nlog 2(a).

C(1)− b 1−a

+ b 1−a

= Θ

nlog 2(a)

répétition a fois d’un traitement sur le ré- sultat de l’appel récursif dichotomique C(n)=C(n/2)+a.n+b C(n)= Θ(n) traitement linéaire avant l’appel récursif di-

chotomique

C(n)=2.C(n/2)+a.n+b C(n)= Θ(n.ln(n)) traitement linéaire avant double appel ré- cursif dichotomique, tri fusion

Références

Documents relatifs

Critère de terminaison par paires de dépendances Théorème : Un système de réécriture R termine s'il existe un préordre % stable par substitutions et monotone t.q. On remplace

[r]

La raison de cette suite est strictement négative. Donc le premier terme de la suite inférieur ou égal à 0 est le terme u 4... Le rang de ce terme est le rang

Donnons le sens de variation de cette suite.. La raison de cette suite est

[r]

La terminaison de la fonction nécessite de prouver la terminaison de la boucle conditionnelle, ce qui se fait au choix avec le variant ind_fin - ind_deb (facile) ou avec le variant

On remarque qu’à chaque itération de la boucle while, une partie de P est laissée identique ou coupée en deux, donc P est l’ensemble des feuilles d’un arbre binaire de racine

1 Complète avec le pronom personnel sujet qui convient : je, tu, il, nous, vous, ils..