Académique Documents
Professionnel Documents
Culture Documents
Algorithmique avancée
Plan du cours
Rappels
Complexité et optimalité
La récursivité
Algorithmes de tri
Structures de données élémentaires
Programmation dynamique
Algorithmes gloutons
Graphes et arbres
Arbres de recherche
Plus courts chemins
Heuristiques
Bibliographie :
Instruction:
-déclaration
-affectation
-entrée
-sortie
Algorithmique?
Rappels : algorithmique I
Schéma de résolution d’un problème:
Rappels : algorithmique I
Caractéristiques de qualité d'un algorithme :
Lisible
Correct (preuve)
Efficace (complexité)
Rappels : algorithmique I
Différences entre algorithmes et programmes
Un programme est la réalisation (l’implémentation) d’un
algorithme au moyen d’un langage donné.
Exemple:
Torch
Rappels : algorithmique I
Double problématique de l’algorithmique ?
Definition 1 :
On dit que f=Ο (g) si et seulement si il existe c>0 et n0ϵN tel que :
Definition 2
On dit que f=Ω(g) si et seulement si:
g=O(f)
Exemples :
Montrer que:
5*n3+ 3*n+7=O(n3)
5*n3+ 3*n+7=Θ(n3)
Analyse de la complexité :
Complexité
Définition:
La complexité d’un algorithme est la
mesure du nombre d’opérations fondamentales
qu’il effectue sur un jeu de données.
Analyse de la complexité :
Exemple:
Analyse de la complexité :
Exemple:
Analyse de la complexité :
Exemple:
Analyse de la complexité :
Exemple:
Exercice:
// t tableau de n entiers
// n entier >0
Entier: max
max t[0]
Pour i=1 à n-1
si (max <t[i])
maxt[i]
Fin si
Fin pour
Exercice
Déterminez la complexité temporelle de
l’algorithme Check :
Solution
C) D)
for i = 1 to n do for i = 1 to n do
for j = i to n do for j = 1 to 2 ∗ i + 1 do
print (« Hello World ») print (« Hello World »)
end for end for
end for end for
E) F)
for i = 1 to n ∗ n do for (i = 0 to m) do
for j = 1 to i do t ← 1
print (« Hello World ») while (t < m) do
end for print (« Hello world »)
end for t ← t ∗ 2
end while
end for
Solution
a) O(n²). Ici la première boucle fait (n-1) itérations et la deuxième boucle 2n itérations, donc un total
de (n-1)*2n.
b) O(n). Ici la première boucle fait 10 itérations et la deuxième boucle n itérations, donc un total de
10n. Attention, selon certain calcul cela ferait 9 itérations suivi de n-1 itérations. Heureusement,
dans la notation de Landau cela ne change rien donc inutile de chipoter pour le comptage
d’itérations !
c) O(n²). Très classique, chaque boucle fait n-1 itérations.
d) O(n²). La première boucle est classique. La deuxième va de 1 à 2i+1, donc si on fait quelques
exemples : 3, 5, 7, …, 2n+1 (ici on fait fonctionner les deux boucles en même temps). On a donc la
somme des n premiers termes inpairs donc quadratique.
Il est aussi possible de calculer la complexité en multipliant la complexité de chacune des boucles.
La première boucle tend vers n itérations quand n est grand; la deuxième boucle tend vers n
itérations quand n est grand. Nous avons donc une complexité de O(n*n)=O(n²).
Attention à bien vérifier quand même le nombre d’itération quand n est grand, ce ne sera pas
toujours en O(n) !
e) O(n^4). La réflection est la même que pour l’algorithme d. Ici, nous avons les n premiers termes
au carré.
f) O(m log(m)). Pour la première boucle tout va bien, le problème va venir de la deuxième. Ici la
valeur de t double à chaque itération et la boucle s’arrête quand t dépasse la valeur de m. On pose k
le nombre d’itération réalisée. On s’arrête quand 2^k >m donc quand k > log(m). D’où la complexité.