Académique Documents
Professionnel Documents
Culture Documents
1 Algorithme
♡Définition 1
• Un algorithme est une suite finie et non ambiguë d’opérations ou d’instructions permettant de
résoudre un problème ou d’obtenir un résultat.
• L’algorithmique est l’étude et la production de ces instructions.
3 niveaux d’abstraction :
• Les problèmes décrits en langage naturel
• Les algorithmes décrits dans un pseudo-langage de programmation, proche du langage naturel
• Les programmes décrits dans un lange de programmation
Exemple 1 :
Niveaux de difficulté :
• Conceptuel
• Difficulté du problème ?
• Comment le résoudre ?
• Quelle démarche utiliser ?
• Technique
• Comment mettre en œuvre mon algorithme sur une machine ?
• Quelles sont les ressources à ma disposition ?
• Quel est le langage le plus adapté ?
♡Définition 2
On appelle variant d’une boucle une expression dont la valeur varie à chaque itérations de la boucle
Un variant de boucle bien choisi permet de prouver qu’une boucle Tant que se termine.
Exemple 2 : Dans l’algorithme 1, le variant de boucle i est augmenté de 1 à chaque itération, il finit donc par
devenir strictement supérieur à n et la boucle Tant que s’arrête.
3 La correction
♡Définition 3
Un invariant d’une boucle une propriété qui si elle est vraie avant l’exécution d’une itération le
demeure après l’exécution de l’itération.
Un invariant de boucle bien choisi permet de prouver qu’une boucle produit le résultat attendu.
4 La complexité
On va essentiellement s’intéresser à la complexité en temps.
On aimerait pouvoir comparer différents algorithmes pour un même problème. Comme les ordinateurs peuvent
être plus ou moins performants, rapides et des langages peut-être plus adaptés que d’autre dans certains cas, il
nous faut une mesure intrinsèque de la complexité de l’algorithme indépendamment de l’implémentation.
Conclusion : Le nombre d’opération à effectuer dans l’algorithme 1 dépend donc de la valeur de n. Plus n est
grand et plus il faut faire d’opérations.
Par contre dans l’algorithme 2 il n’y a que 3 opérations à chaque fois.
On peut donc dire que l’algorithme 2 est meilleur que l’algorithme 1.
But : le but étant de pouvoir dire « sur toute machine, et quel que soit le langage utilisé, l’algorithme A est
meilleur que l’algorithme B pour des données de grande taille. »
On va donc choisir une mesure élémentaire (nombre de comparaisons, nombre d’affectations, nombre d’opération
arithmétiques ...) et on va l’utiliser pour mesurer la complexité d’un algorithme en fonction d’un paramètre
représentatif des entrées (taille).
Attention : il n’y a pas de système complet de règles. Comme on peut choisir différentes mesures élémentaires,
il se peut qu’on obtienne pas tout à fait la même complexité. Par contre elle seront du même ordre de grandeur.
Par exemple dans l’algorithme 1 on peut choisir :
On voit que ce n’est pas tout a fait le même nombre en fonction de la mesure élémentaire qui a été choisie, mais
lorsque n est très grand ces trois valeurs sont quasiment identiques et elles ont le même ordre de grandeur que
n (si un chat prend 1 kg ça se voit, si un éléphant prend 1 kg ça ne se voit pas).
L’algorithme 1 s’exécutera en temps linéaire (O(n)) et l’algorithme 2 s’exécutera en temps constant (O(1)).
Complexité
n= 1 log(n) n n log2 (n) n2 n3 2n
102 1ns 6, 6ns 0, 1µs 6, 6µs 10µs 1ms 1013 a
103 1ns 9, 9ns 1µs 9, 9µs 1ms 1s ∞
104 1ns 13, 2ns 10µs 1, 32ms 0, 1s 1 min ∞
105 1ns 16, 6ns 1ms 1, 66ms 10s 11 j ∞
106 1ns 19, 9ns 0, 001s 0, 019s 1 min 31a ∞
On peut remarquer que dans le meilleur des cas (l’élément x est en première position) il faut 1 seule comparaison,
dans le pire des cas (l’élément x n’est pas dans la liste ou alors il est en dernière position) il faut autant de
comparaisons qu’il n’y a d’éléments dans la liste.
La terminaison et la correction sont évidents.
6 Les tris
6.1 Tri par comparaison ou tri à bulle
Voici le principe : on compare les deux premiers termes de la liste. S’ils sont dans le bon ordre alors on ne fait
rien. Sinon on les échange de place. On compare ensuite le deuxième et le troisième etc.
Ainsi on fait remonter la plus grande valeur à la fin de la liste.
Ensuite on recommence pour faire remonter la deuxième plus grande en avant-dernière position et ainsi de suite.
8 4 3 5 7 2 1 6 4 3 5 8 7 2 1 6 4 3 5 7 2 8 1 6
4 8 3 5 7 2 1 6 4 3 5 8 7 2 1 6 4 3 5 7 2 1 8 6
4 8 3 5 7 2 1 6 4 3 5 7 8 2 1 6 4 3 5 7 2 1 8 6
4 3 8 5 7 2 1 6 4 3 5 7 8 2 1 6 4 3 5 7 2 1 6 8
4 3 8 5 7 2 1 6 4 3 5 7 2 8 1 6 4 3 5 7 2 1 6 8
3 4 5 7 2 1 6 8 3 4 5 2 1 6 7 8 3 2 1 4 5 6 7 8
3 4 5 7 2 1 6 8 3 4 2 5 1 6 7 8 3 2 1 4 5 6 7 8
3 4 5 7 2 1 6 8 3 4 2 5 1 6 7 8 3 1 2 4 5 6 7 8
3 4 5 7 2 1 6 8 3 4 2 1 5 6 7 8
3 1 2 4 5 6 7 8
3 4 5 2 7 1 6 8 3 4 2 1 5 6 7 8
3 1 2 4 5 6 7 8
3 4 5 2 7 1 6 8 3 4 2 1 5 6 7 8
1 3 2 4 5 6 7 8
3 4 5 2 1 7 6 8 3 4 2 1 5 6 7 8
1 3 2 4 5 6 7 8
3 4 5 2 1 7 6 8 3 2 4 1 5 6 7 8
3 4 5 2 1 6 7 8 3 2 4 1 5 6 7 8 1 2 3 4 5 6 7 8
3 4 5 2 1 6 7 8 3 2 1 4 5 6 7 8 1 2 3 4 5 6 7 8
3 4 5 2 1 6 7 8 3 2 1 4 5 6 7 8 1 2 3 4 5 6 7 8
On se rend compte qu’à chaque étape il y a une partie de la liste qui est triée et un autre non triée. On peut
noter TC (taille courante) le rang du dernier élément de la partie non triée et on obtient l’algorithme suivant :
Analyse :
• La terminaison est évidente puisque nous avons des boucles bornées.
• Pour la correction on choisit la propriété suivante : la liste est séparée en deux parties. Une des rangs 1 à
k non triée et une des rangs k+1 à n triée avec tous ses éléments plus grands que la première partie.
Après la première itération de la boucle externe, la plus grande valeur est remontée à la fin. On a donc la
première partie des rangs 1 à n-1 non triée et la deuxième ne contenant qu’un seul élément, le plus grand
de la liste.
Supposons qu’après une certaine itération k quelconque la propriété soit vraie, c’est-à-dire que la partie
allant des rangs 1 à k soit non triée et que la partie allant des rangs k+1 à n soit triée avec tous ses
éléments plus grands que la première partie. Montrons alors que la propriété est conservée à l’itération
suivante (k+1) :
A l’itération k+1, la boucle interne fait remonter le plus grand élément de la partie allant dans rang 1 à k
en dernière position, c’est-à-dire au rang k. On a donc l’élément de rang k plus grand que tous ceux de la
première partie mais plus petit que tous ceux de la deuxième partie. Donc on a à présent une partie non
triée allant des rangs 1 à k-1 et une partie triée allant des rang k à n avec tous ses éléments plus grands
que ceux de la première partie.
La propriété est donc conservée.
La propriété sera donc encore vraie après la dernière itération. Donc la liste sera bien triée.
• Pour la complexité, on fait n-1 comparaison pour la première itération de la boucle externe puis n-2
comparaison pour la deuxième itération et ainsi de suite jusqu’à une ultime comparaison à la dernière
itération.
n(n − 1)
On fait donc en tout 1+2+· · ·+n−1 = comparaison. Donc la complexité est d’ordre quadratique
2
2
(O(n )).
6.2 Tri par insertion
Principe : On a une partie triée et une partie non triée. On traite le premier élément de la partie non triée. Le
traitement consiste à trouver la place où insérer cette élément dans la partie triée puis lui faire de la place en
décalant certains éléments puis d’insérer celui-ci.
4 7 6
8 3 5 7 2 1 6 3 4 5 8 2 1 6 1 2 3 4 5 7 8
↑ ↑ ↑
4 7 6
8 3 5 7 2 1 6 3 4 5 8 2 1 6 1 2 3 4 5 7 8
↑ ↑ ↑
4 8 3 5 7 2 1 6 3 4 5 7 8 2 1 6 1 2 3 4 5 6 7 8
3 2
4 8 5 7 2 1 6 3 4 5 7 8 1 6
↑ ↑
3 2
4 8 5 7 2 1 6 3 4 5 7 8 1 6
↑ ↑
3 4 8 5 7 2 1 6 2 3 4 5 7 8 1 6
5 1
3 4 8 7 2 1 6 2 3 4 5 7 8 6
↑ ↑
5 1
3 4 8 7 2 1 6 2 3 4 5 7 8 6
↑ ↑
3 4 5 8 7 2 1 6 1 2 3 4 5 7 8 6
Remarques :
• Etude en exercices
• Il existe d’autres tri dont certain sont présenté en exercices.