Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
M. bada 1
Chapitre 1 : la complexité Université de Batna 2 Algorithmique et structures de données
NB : l’ensemble d’instructions dans le bloc <Action> étant répétées jusqu'à ce que la condition <condition> devienne Fausse
è il faut donc que la partie <Action> soit capable de modifier les paramètres intervenant dans la condition <Condition> afin
de sortir de la boucle Tantque.
Les structures de contrôles sont très importantes pour contrôler le déroulement d’un Algorithme.
B. Structures de données
Les données du problème peuvent être simples ou complexes. La programmation doit disposer de structures pour
pouvoir les représenter, on parle alors de Structures de données
2. Sous Programme :
Un sous programme (Fonction/Procédure) est un algorithme indépendant. L’appel de la fonction (resp. la procédure)
déclenche l’exécution de son bloc d’instructions.
NB :
Une fonction se termine en retournant une valeur.
Une procédure est une fonction qui retourne vide.
Passage de paramètres :
Par Valeur : pas de changement des variables effectifs.
Par Reference : peut entrainer un changement des variables effectifs.
3. La récursivité :
A. Définition : la programmation récursive est une technique de programmation qui remplace les instructions
de boucles (while, for, etc.) par des appels de fonction (une fonction qui s’appelle elle même avec des
paramètres différents).
L'idée est de diviser un problème P en sous-problèmes (certains de la même forme), de résoudre ces sous-
problèmes de manière directe si c'est possible sinon de la même manière que P (le problème initial), puis de
combiner le résultat de ces sous-problèmes pour résoudre le problème initial P.
M. bada 2
Chapitre 1 : la complexité Université de Batna 2 Algorithmique et structures de données
n!= n (n-1) !
Factorielle (3)
Factorielle (3)
Debut
Factorielle ß 3* Factorielle (2)
fin
Factorielle (2)
Debut
Factorielle ß 2* Factorielle (1)
fin
Factorielle (1)
Debut
Factorielle ß 1* Factorielle (0)
fin
Factorielle (0)
Debut
Factorielle ß 0* Factorielle (-1)
fin
Jusqu'à -∞
On doit toujours tester en premier la condition d'arrêt, et ensuite, si la condition n'est pas vérifiée, lancer un
appel récursif.
si n ≠ ,è n! = n * (n-1)! si n = 1 è n! = 1
Fonction factorielle (N : entier) : entier
Debut
Si (N=1) alors
Factorielle ç 1 ;
Sinon
Factorielle ß N* Factorielle (N-1)
fin
NB : Théoriquement, on peut toujours dé-récursiver un algorithme récursif, c’est-à-dire le transformer en algorithme itératif.
En pratique, ce n’est pas toujours facile!
M. bada 3
Chapitre 1 : la complexité Université de Batna 2 Algorithmique et structures de données
Factorielle (3)
Return : 3*2*1
Factorielle (3)
Debut
Factorielle ß 3* Factorielle (2)
fin Return : 2*1
Factorielle (2)
Debut
Factorielle ß 2* Factorielle (1)
fin Return : 1
Factorielle (1)
Debut
Factorielle ß 1
fin
Exemple 2 : La suite de Fibonacci
Les nombres de la suite de Fibonacci sont égaux à la somme des deux termes précédents, ils suivent donc la formule de
récurrence :
F(n+2)=F(n)+F(n+1)
F(0) = 0 et F(1) = 1
M. bada 4
Chapitre 1 : la complexité Université de Batna 2 Algorithmique et structures de données
Chapitre 1 : la complexité algorithmique
Exercice :
Ø écrire 2 fonctions différentes qui permettent de déterminer si un nombre entier N est premier ou composé.
Ø Donnez le NBR d’instructions de base en fonction de N.
Ø Supposons que N=11, et qu’une opération de division aura besoin de 1ms pour être exécuté. Calculez le
temps nécessaire pour exécuter cette fonction.
Ø Refaire la question précédente pour N= 1000003, N= 1000000019. Que pouvez vous conclure ?
1. Introduction :
Nous allons apprendre dans ce chapitre à travailler efficacement et rendre service aux utilisateurs de nos futurs ingénieux.
C'est souvent en pratique une importante réflexion dans la création de nos programmes. Le but de ce chapitre n'est pas de
faire de vous des experts en la matière, mais plutôt de vous donner une bonne introduction sur la question de complexité,
comprendre pourquoi certains programmes prennent beaucoup plus de temps à s'exécuter que d'autres.
Objectifs :
La théorie de la complexité (algorithmique) vise à répondre à ces besoins ;
• Classer les problèmes selon leurs difficultés.
• Classer les algorithmes selon leurs efficacités.
• Comparer les algorithmes résolvant un problème donné avant de faire un choix et sans les implémenter.
2. Efficacité d'un programme
L'efficacité d'un programme fait en réalité référence à une écriture de code intelligente, bien réfléchie. En d'autres
termes un bon algorithme.
Le plus souvent, on ne peut pas avoir les deux dimensions en même temps. C'est-à-dire avoir un programme qui ne
prend pas assez d'espace en mémoire mais qui est moins rapide, ou un programme qui est très rapide mais qui prend
assez d'espace en mémoire.
Dans cette année nous ne nous intéressons pas à la complexité spatiale, car la mémoire croyez moi ce n'est pas ce qui
manque aux ordinateurs de nos jours.
Question :
Supposons que nous aimerions répondre à la question suivante :
Combien de temps un algorithme implémenter par un programme prend à s'exécuter ?
M. bada 5
Chapitre 1 : la complexité Université de Batna 2 Algorithmique et structures de données
Réponse :
i. Méthode Empirique :
On peut par exemple lancer l’exécution du programme sur un ordinateur et chronométré l'exécution
de ce dernier; et dire plus tard que l'exécution a fait par exemple 4 minutes.
On peut par la suite, lancer un autre programme pour le même problème et obtenir par exemple 2
minutes de temps d'exécution.
Conclusion :
On peut conclure que le programme faisant 2 minutes est le meilleur !!! . ç Faux
Concrètement c'est une mauvaise manière de tester l'efficacité d'un programme car cette méthode
dépend :
– de la machine utilisée;
– du jeu d’instructions utilisées
– de l’habileté du programmeur
– du jeu de données générées
– du compilateur choisi
Comment faire?
Une instruction est une opération qui prend un temps constant. Ex: une affection, une comparaison,
une division ...
12 34 3 22 10 5 45
Nous nous intéresserons particulièrement au Pire Des Cas, car c'est celui qui arrive le plus souvent. Les deux autres
cas ne posent vraiment pas un grand problème.
M. bada 6
Chapitre 1 : la complexité Université de Batna 2 Algorithmique et structures de données
Ø Chaque instruction basique consomme une unité de temps ; (affectation d'une variable, comparaison, +, -, *,
=, ...). Les instructions de base prennent un temps constant, notée O(1)
Ø Chaque itération d'une boucle rajoute le nombre d'unités de temps consommées dans le corps de cette boucle
Ø Chaque appel de fonction rajoute le nombre d'unités de temps consommées dans cette fonction.
Exercice démonstratif N1 :
1) Que fait cette fonction?
2) Combien de temps prend cette fonction à s’exécuter en terme de nombres d'instructions ?
factßf ;
fin ;
Réponses :
1) cette fonction calcule le factoriel du nombre fourni en argument.
2) C(N) = 1 + 1+ 5(n-1) + 1 = 5n+2
Discussion :
Imaginons que N soit égal à 2000 nous aurons 5*2000 + 2= 10002 instructions. Malgré ce résultat, il est toujours
difficile d'exprimer la complexité du programme (difficile à classifier les algorithmes).
En effet, on cherche ou plutôt on doit avoir une seule variable de référence (pas une équation) car ce qui nous
intéresse c'est la croissance de cette variable en fonction des entrées du programme.
Dans l’exemple précédent: Notre variable de référence est N è pourquoi ? è On doit faire une
approximation par limite a une fonction connu : 5N+2 ≈ N. (Voir la parte : ordre de grandeur)
M. bada 7
Chapitre 1 : la complexité Université de Batna 2 Algorithmique et structures de données
L'écart entre f et g au voisinage de l'infini ne cesse d'augmenter et n'est pas borné. è Dans ce contexte, on peut dire
que f est négligeable devant g au voisinage de l'infini (f << g ) , ou on écrit (notation de Landau)
f = O(g(x)) ou f ∈ O(g(x)) xà ∞
Pour trouver l’ordre de grandeur d’un algorithme, on doit calculer le nombre d’instruction dans le pire des cas et le
comparer avec un modèle de croissance.
1 : représente le modèle des fonctions constantes. Exp : f(N)= 5, f(N) = 8, f(N)= 35 : (ont tous la même
forme de courbe = une ligne parallèle avec l’axe des X).
N : représente le modèle des fonctions linéaire. Exp : f(N)= 3N+10, f(N)= N+30, f(N)= 12N-5 ...
2
N : représente le modèle des fonctions quadratique.
3
N : représente le modèle des fonctions cubique.
n
2 : représente le modèle des fonctions exponentielle.
Log (N) : représente le modèle des fonctions logarithmique.
N Log N : représente le modèle des fonctions sous-quadratique.
Ø Calculer la complexité « C » (le nombre d’instructions) pour N et pour N+1, et faire la différence
entre les deux. (N : doit être le plus grand possible).
Si f = C(N+1) – C(N) =
= 0 è fonction constante è O(1)
= 1 ou 2 ou 3 ... (un nombre fixe inferieur a N) è complexité linéaire è O(N)
2
= N ou 2N ou 3N+1 .... è Complexité quadratique è O(N )
2 3
= N .... è Complexité cubique è O(N )
= ε è Complexité Logarithmique è O(Log N)
Si (2N)- C(N) ≈ 1 è complexité Logarithmique è O(Log N)
M. bada 8
Chapitre 1 : la complexité Université de Batna 2 Algorithmique et structures de données
x n
Si C(N+1) = 2 * C(N) è complexité exponentielle è O(2 )
Donc la complexité du programme est O (N) ce qui veut dire que la complexité ou le temps d'exécution de cet
algorithme (nombres d’étapes) augmente linéairement en fonction de N.
L’algorithme qui fait une recherche d’un élément X dans un tableau de taille N.
Dans le pire des cas l’élément n’existe pas ou bien il se trouve à la dernière case.
Dans ce cas on a besoin de comparer les N cases avec notre élément X è N comparaisons.
Si on augmente la taille du tableau à N+1 (on rajoute un élément) è N+1 comparaisons
Dans ce cas la complexité est de l’ordre de N : O(N), car si on rajoute un élément on doit ajouter un nombre fixe
d’instruction (une seule comparaison).
Debut
Xß 0 ;
Pour i allant de 1 jusqu'à N faire
Pour j allant de 1 jusqu'à N faire
XßX+1 ;
Fin pour ;
Fin pour ;
Fin.
On a deux boucles imbriquées, dont chacun va s’exécuter N fois è donc on a N*N itérations
Ou
M. bada 9
Chapitre 1 : la complexité Université de Batna 2 Algorithmique et structures de données
M. bada 10