Académique Documents
Professionnel Documents
Culture Documents
LOG320 01 CalculsAsymptotiques
LOG320 01 CalculsAsymptotiques
LOG-320
Structures de données et algorithmes
Introduction et
analyse asymptotique
Contacts
Professeurs
– Groupe 01
• Patrick Cardinal
• patrick.cardinal@etsmtl.ca
• A-4486
– Groupe 02
• Pierre Dumouchel (première moitié du cours)
• Patrick Cardinal (deuxième moitié du cours)
– Groupe 03
• Francis Cardinal
• francis.cardinal.1@ens.etsmtl.ca
• A-4526
– Groupe 04
• Pierre Dumouchel
• pierre.dumouchel@etsmtl.ca
• A-4484
– Disponibilités:
• Sur rendez-vous
Chargés de laboratoire/TP
– À déterminer
Légende:
Cours #1 à 13 Date à retenir:
Labo #1 Examen Intra: 18 juin 2020
Labo #2 Abandon: 15 juillet 2020
Labo #3
Examens finaux
Légende:
Cours #1 à 13 Date à retenir:
Labo #1 Examen Intra: 22 juin 2020
Labo #2 Abandon: 15 juillet 2020
Labo #3
Examens finaux
Légende:
Cours #1 à 13 Date à retenir:
Labo #1 Examen Intra: 18 juin 2020
Labo #2 Abandon: 15 juillet 2020
Labo #3
Examens finaux
Légende:
Cours #1 à 13 Date à retenir:
Labo #1 Examen Intra: 22 juin 2020
Labo #2 Abandon: 15 juillet 2020
Labo #3
Examens finaux
7
Livre de référence (optionnel)
3 laboratoires:
Algorithmes de compression Mots cachés (variante) Jeu de « Breakthrough»
4 semaines (10%) 2 semaines (5%) 6 semaines (15%)
9
Conditions pour s’inscrire au cours
Pour assurer la tenue de la session d’été 2020 dans le contexte de la
pandémie au Covid19, les modalités particulières suivantes devront être
appliquées :
Si vous ne consentez pas aux modalités décrites ci-haut, vous devez vous
désinscrire de vos cours avant le 15 mai et vous pourrez être
remboursés. En demeurant inscrit, vous acceptez les modalités
particulières de la session E20.
10
Algorithme
Algorithme
Une méthode qui doit être suivie pour
résoudre un problème.
• Une recette
11
Algorithme
Définition de Wikipedia:
Un algorithme est une suite finie d’étapes (instructions
non ambiguë), réalisées dans un ordre déterminé,
appliquées à un nombre fini de données afin d'arriver
avec certitude à un certain résultat, et ce,
indépendamment des données de départ.
12
Source: https://www.geeksforgeeks.org/introduction-to-algorithms/
Algorithme
Un algorithme possède les propriétés
suivantes:
– Données d’entrées doivent être bien définies
– Données de sorties doivent être bien définies
– Il doit être clair et sans ambiguïté
– Il doit être composé d’un nombre fini d’étapes
– Il doit terminer
– Il doit être réalisable
– Il doit être indépendant du langage
13
Pourquoi étudier l’algorithmique?
Les performances sont souvent utilisées pour
déterminer ce qui est possible et ce qui ne
l’est pas.
14
Spécification d’un algorithme
Organigramme (flowchart)
– Exprime un algorithme en utilisant un ensemble de
figures géométriques décrivant les différentes étapes de
l’algorithme.
– Cette représentation n’est presque plus utilisée.
i=0
min = ∞
oui oui
i<n T[i] < min
non
retourner min
15
Spécification d’un algorithme
Pseudocode
– Mélange d’instructions de type « langage de
programmation » et de langage naturel
(français,anglais,…)
– Notation utilisée dans ce cours:
• Structures de contrôle : pour, tant que, si
• Assignation est représentée par un =
• Égalité représentée par ==
Min(T)
min = ∞
pour chaque e dans T
si e < min
min = e
retourner min
16
Algorithme vs programme
Programme
– Dépend du langage de programmation
– Dépend des choix d’implémentation
– Est souvent optimisé, donc plus difficile à
comprendre
Algorithme
– Ne contient aucun détail d’implémentation
– Ne contient pas de vérification des variables
d’entrées
– Indépendant du contexte d’implémentation (OS,
langage)
– Plus facile à comprendre
17
Algorithme vs programme
Algorithme Programme en C
18
Exemple concret en Java
Création d’une chaine de caractère de longueur N
Algorithm(n)
str = ⏀
pour i =1 à n
str = str + {c}
Version 1 Version 2
19
Utilité d’un algorithme
Permet de prouver l’exactitude d’une solution
20
Meilleur algorithme ou meilleur ordinateur?
Supposons que nous avons un ordinateur qui peut effectuer
10000 opérations par seconde. Que se passe-t-il si on obtient
un ordinateur 10 fois plus rapide?
21
Analyse d’un algorithme
Il existe souvent plusieurs algorithmes pour
résoudre un même problème.
– Ex: tri
– Ex: trouver le plus grand diviseur commun de deux
nombres
22
Temps versus opérations
Le temps d’exécution varie grandement d’un
ordinateur à un autre et même d’une exécution à
l’autre. Les facteurs suivants peuvent influencer le
temps d’exécution d’un algorithme:
• Le type d’architecture de la machine
• L’implémentation
• Le multitâche
• Etc.
23
Analyse d’un algorithme
Exemple d’un problème avec plusieurs solutions:
Étant donné un ensemble d’entier x1,x2,..,xN, trouver la
somme d’éléments consécutifs ayant la valeur maximum.
maxSubSum1(T[1..n]) maxSubSum2(T[1..n])
1. maxSum = 0 1. maxSum = 0
2. pour i = 1 à n 2. pour i = 1 à n
3. pour j = i à n 3. sum = 0
4. sum = 0 4. pour j = i à n
5. pour k = i à j 5. sum = sum + T[j]
6. sum = sum + T[k] 6. si sum > maxSum
7. si sum > maxSum 7. maxSum = sum
8. maxSum = sum 8. retourner maxSum
9. retourner maxSum
[Weiss]
24
Analyse expérimentale
Exemple d’un problème avec plusieurs solutions:
Étant donné un ensemble d’entier x1,x2,..,xN, trouver la
somme d’éléments consécutifs ayant la valeur maximum.
200
180
160
140
MaxSumSeq1
Temps (secondes)
120
MaxSumSeq2
100
80
60
40
20
0
0 0,1 0,2 0,3 0,4 0,5 0,6
n Millions
25
Analyse expérimentale
Exemple d’un problème avec plusieurs solutions:
Étant donné un ensemble d’entier x1,x2,..,xn, trouver la
somme d’éléments consécutifs ayant la valeur maximum.
26
Analyse d’un algorithme
Exemple d’un algorithme:
Algorithme(T[1..n])
1. d=∞
2. pour i = 1 à n
3. pour j = 1 à n
4. si i ≠ j et |T[i] – T[j]| < d
5. d = |T[i] – T[j]|
6. retourner d
27
Analyse d’un algorithme
Nouvelle version:
Algorithme(T[1..n])
1. d=∞
2. pour i = 1 à n
3. pour j = i+1 à n
4. si |T[i] – T[j]| < d
5. d = |T[i] – T[j]|
6. retourner d
28
Analyse d’un algorithme
Que fait cet algorithme?
F( T[ 1.. n ] )
1. pour i = 1 à n-1
2. min = T[i]
3. indexMin = i
4. pour j = i+1 à n
5. si T[j] < min
6. min = T[j]
7. indexMin = j
8. T[indexMin] = T[i]
9. T[i] = min
29
Tri par sélection
i min
5 7 3 6 2 8
i min
F( T[ 1.. n ] ) 2 7 3 6 5 8
1. pour i = 1 à n-1 i min
2. min = T[i]
2 3 7 6 5 8
3. indexMin = i
4. pour j = i+1 à n i min
2 3 5 6 7 8
2 3 5 6 7 8 30
Analyse d’un algorithme
Coût Nombre exact
d’exécutions
TriSélection( T[ 1.. n ] )
1. pour i = 1 à n-1 c1 𝑛
2. min = T[i] c2 𝑛−1
3. indexMin = i c3 𝑛−1
$
𝑛(𝑛 + 1)
4. pour j = i+1 à n c4 !𝑖 = −1
2
!"#
$
𝑛(𝑛 − 1)
5. si T[j] < min c5 !(𝑖 − 1) =
2
!"%
$
6. min = T[j] c6 𝑛(𝑛 − 1)
!(𝑖 − 1) =
2
!"%
$
7. indexMin = j c7 𝑛(𝑛 − 1)
!(𝑖 − 1) =
2
!"%
𝑐+ + 𝑐, + 𝑐- + 𝑐. / 𝑐+ − 𝑐, − 𝑐- − 𝑐.
𝑇 𝑛 = 𝑛 + 𝑐0 + 𝑐/ + 𝑐1 − + 𝑐2 + 𝑐3 𝑛 − (𝑐/ +𝑐1 + 𝑐+ + 𝑐24𝑐3 )
2 2
31
Analyse d’une fonction
Analyse détaillée d’un algorithme:
– Avantage :Très précise
– Désavantage : Long à calculer
32
Analyse Asymptotique
Pourquoi veut-on analyser l’algorithme avec des
données d’entrée de grande taille?
100
400 4000
80
300 3000
60
200 2000
40
20 100 1000
0 0 0
0 25 50 75 100 0 75 150 225 300 0 150 300 450 600 750 900
33
Analyse Asymptotique
Il y a 5 notations standards que l’on peut utiliser:
Grand-O
f(n) est en O(g(n)) si f(n) est asymptotiquement plus petit ou égale à g(n)
Grand-Oméga
f(n) est en Ω(g(n)) si f(n) est asymptotiquement plus grand ou égale à g(n)
Grand-Thêta
f(n) est en Θ(g(n)) si f(n) est asymptotiquement est égale à g(n)
Petit-oh
f(n) est en o(g(n)) si f(n) est asymptotiquement strictement plus petit à g(n)
Petit-omega
f(n) est en 𝜔(g(n)) si f(n) est asymptotiquement strictement plus grand à g(n)
34
Notation O
Définition formelle
f(n) ∈ O(g(n)) s’il existe deux constantes positives n0
et c tel que f(n) ≤ cg(n) pour tout n>n0
f(n) = O(g(n))
cg(n)
f(n)
temps
n0 n
Exemple: 4000
f(n) vs n2
3000
2500
f(n)
2000
f(n)
1500
n2
1000
500
0
0 10 20 30 40 50 60 36
n (taille des données)
Tri par insertion
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
37
Tri par insertion
InsertionSort( T[ 1.. n ] ) L’algorithme considère que le tableau a deux sections:
1. pour j = 2 à n • la section triée
2. key = T[j] • la section non triée
3. i = j -1
4. tant que i > 0 et T[i]>key
Au départ, la section trié ne contient que le premier
élément.
5. T[i+1] = T[i] j
6. i = i-1
5 7 3 6 2 8
7. T[i+1] = key
38
Tri par insertion
j
InsertionSort( T[ 1.. n ] ) 5 7 3 6 2 8
1. pour j = 2 à n j
2. key = T[j]
5 7 3 6 2 8
3. i = j -1
4. tant que i > 0 et T[i]>key
5. T[i+1] = T[i]
6. i = i-1
7. T[i+1] = key
39
Tri par insertion
j
InsertionSort( T[ 1.. n ] ) 5 7 3 6 2 8
1. pour j = 2 à n j
2. key = T[j]
5 7 6 2 8 key 3
3. i = j -1
j
4. tant que i > 0 et T[i]>key
5. T[i+1] = T[i] key
5 7 6 2 8 3
6. i = i-1
j
7. T[i+1] = key
5 7 6 2 8 key 3
j
3 5 7 6 2 8
40
Tri par insertion
j
InsertionSort( T[ 1.. n ] ) 3 5 7 6 2 8
1. pour j = 2 à n j
2. key = T[j]
3. i = j -1
3 5 7 2 8 key 6
5. T[i+1] = T[i]
3 5 7 2 8 key 6
6. i = i-1
j
7. T[i+1] = key
3 5 6 7 2 8
41
Tri par insertion
j
InsertionSort( T[ 1.. n ] ) 3 5 6 7 2 8
1. pour j = 2 à n j
2. key = T[j]
3. i = j -1 3 5 6 7 8 key 2
4. tant que i > 0 et T[i]>key j
5. T[i+1] = T[i]
3 5 6 7 8 key 2
6. i = i-1
j
7. T[i+1] = key
3 5 6 7 8 key 2
j
3 5 6 7 8 key 2
j
3 5 6 7 8 key 2
j
2 3 5 6 7 8 42
Tri par insertion
j
InsertionSort( T[ 1.. n ] ) 2 3 5 6 7 8
1. pour j = 2 à n j
2. key = T[j]
3. i = j -1 2 3 5 6 7 8
4. tant que i > 0 et T[i]>key
5. T[i+1] = T[i]
6. i = i-1
7. T[i+1] = key
43
Notation-O (Analyse d’un algorithme)
Nombre exact d’exécutions Analyse
asymptotique
(Pire cas)
InsertionSort( T[ 1.. n ] )
1. pour j = 2 à n 𝑛 𝑂(𝑛)
2. key = T[j] 𝑛−1 𝑂(𝑛)
3. i = j -1 𝑛−1 𝑂(𝑛)
$
4. tant que i > 0 et T[i]>key !𝑖 =
𝑛(𝑛 + 1)
−1 𝑂(𝑛/ )
2
!"#
$
5. T[i+1] = T[i] !(𝑖 − 1) =
𝑛(𝑛 − 1)
𝑂(𝑛/ )
2
!"#
$
6. i = i-1 𝑛(𝑛 − 1)
!(𝑖 − 1) =
2 𝑂(𝑛/ )
!"#
T(n) = O(3n2+4n)
= O(n2)
44
Notation Ω
Définition formelle
f(n) ∈ Ω(g(n)) s’il existe deux constantes positives n0
et c tel que f(n) ≥ cg(n) pour tout n>n0
f(n) = W(g(n))
f(n)
cg(n)
temps
n0 n
1. pour j = 2 à n 𝑛 Ω(𝑛)
2. key = T[j] 𝑛−1 Ω(𝑛)
3. i = j -1 𝑛−1 Ω(𝑛)
$
4. tant que i > 0 et T[i]>key !1 = 𝑛 − 1 Ω(𝑛)
&"#
6. i = i-1 0 Ω(1)
T(N) = W(5n+2)
= W(n)
46
Notation Θ
Définition formelle
f(n) ∈ Q(g(n)) s’il existe trois constantes positives n0,c1
et c2 tel que c1g(n) <= f(n) <= c2g(n) pour tout n>n0
f(n) = Q(g(n))
c1 g(n)
f(n)
c2 g(n)
temps
n0 n
n0
SelectionSort( T[ 1..n ] )
Analyse W Analyse O
InsertionSort( T[ 1..n ] )
49
Autres notations
Petit o
- La fonction g(n) doit être strictement plus grande
- f(n) ∈ o(g(n)) s’il existe deux constantes positives n0 et
c tel que f(n) < cg(n) pour tout n>n0
- Exemple:
- 3𝑛! + 2 ∈ 𝑂 𝑛!
- 3𝑛! + 2 ∈ 𝑂 𝑛"
- 3𝑛! + 2 ∈ 𝑜 𝑛"
- 3𝑛! + 2 ∉ 𝑜 𝑛!
Petit oméga
- La fonction f(n) doit être strictement plus petite
- f(n) ∈ 𝜔(g(n)) s’il existe deux constantes positives n0 et
c tel que f(n) > cg(n) pour tout n>n0
- Exemple:
- 3𝑛! + 2 ∈ Ω 𝑛!
- 3𝑛! + 2 ∈ Ω 𝑛
- 3𝑛! + 2 ∈ 𝜔 𝑛
- 3𝑛! + 2 ∉ 𝜔 𝑛!
50
Baromètres
Qu’est-ce qu’un baromètre?
– C’est une instruction qui s’exécute au moins autant de fois que chacune
des autres.
Comment ça fonctionne?
– Sélectionne un ensemble d’instructions significatives B={b1…bk}
– Détermine le nombre d’exécutions de chacun des baromètres dans B
– Temps total est la somme du nombre d’exécutions de chaque baromètre
Comment choisir l’ensemble B?
– Mettre systématiquement certains types
d’instructions(boucles,conditions,etc.)
– Estimer leurs nombres d’exécution maxima et minima selon que l’on
calcule le meilleur ou le pire cas.
– Simplifier B en gardant seulement les instructions qui s’exécutent le plus
souvent.
51
Baromètres: Sélection des instructions
52
Baromètres: sélection des instructions
1. F( T [ 0.. n [ ) bloc: 1, 2, 3, 9
2. i=0
3. tant que i < n
4. si T[ i ] > 0 bloc: 4, 8
5. j=0 bloc: 5, 6
6. tant que j < T [ i ]
7. j=j*2 bloc: 7
8. incrementer i
9. imprimer « j ai fini »
B = 1, 3, 4, 6, 7
53
Baromètres: exemple
Soit l‘algorithme suivant : De quelles variables dépend le
1. F( T [ 0.. n[ ) temps d’exécution?
2. i = 0
N et R=max(T)
3. tant que i < n
4. si T[ i ] > 0 Baromètres ?
5. j=0 Déterminer Emin Emax
6. tant que j < T [ i ]
instruction Emin Emax
7. j=j+1 1 1 1
3 N N
8. incrementer i 4 N N
9. imprimer « j ai fini » 6 0 N*R
7 0 N*R
Analyse W Analyse O
BubbleSort(T[1..n])
5. T[j] = T[j-1]
6. T[j-1] = temp
55
Analyse asymptotique
Trois algorithmes de tri:
Meilleur cas Pire cas
56
Analyse asymptotique
Comparaison des trois algorithmes (C++):
Nombres sélectionnés au hasard Données triés
400000 500000
350000
400000
300000
250000 300000
200000
150000 200000
100000
100000
50000
0 0
0 200000 400000 600000 800000 1000000 0 200000 400000 600000 800000 1000000
Tri par selection Tri par insertion Tri à bulles Tri par selection Tri par insertion Tri à bulles
57
Analyse asymptotique
Comparaison des trois algorithmes (Python):
Nombres sélectionnés au hasard Données triés
700 400
600 350
500 300
250
400
200
300
150
200 100
100 50
0 0
0 10000 20000 30000 40000 50000 60000 70000 0 10000 20000 30000 40000 50000 60000 70000
Tri par sélection Tri par insertion Tri à bulles Tir par sélection Tri par insertion Tri à bulles
Tri par sélection Tri par insertion Tri à bulles Tir par sélection Tri par insertion Tri à bulles
58
Exercice 1
Quel est l’ordre de cet algorithme?
Algorithme(T[1..n])
1. sum = 0
2. x=1
3. tant que x < n
4. sum = sum+T[x]
5. x = x*2
6. retourner sum
59
Exercice 2
Quel est l’ordre de cet algorithme?
Algorithme(T[1..n])
1. sum = 0
2. x=2
3. tant que x < n
4. sum = sum+T[x]
5. x = x2
6. retourner sum
60
Classes de complexité (communes)
n! 2n n3
n2
T(n)
n*log(n)
log(n)
log log(n)
Constant
n
61
Simplifier les séries
Sommes ou produits avec un nombre variable de termes.
Série Formule Résultat Exemple Q-
équivalente
62
Analyse de la mémoire de travail
Même principe que pour le temps d’exécution mais on
considère la dimension des variables et tableaux.
Analyse W Analyse O
CreateAndFillMatrix(n,m )
64
Conclusion
Ce qu’on a vu aujourd’hui
– Algorithmes de tri
– Calculer le temps d’exécution.
• Précisément
• Asymptotiquement
65