Vous êtes sur la page 1sur 36

Cours :

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 :

 Introduction to Algorithms par Thomas H. Cormen, Charles


E. Leiserson, and Ronald L. Rivest
 Types de données et algorithmes par Christine Froidevaux,
Marie-Claude Gaudel, Michèle Soria.
Rappels : algorithmique I
 Qu’est-ce que l’algorithmique ?

 Définition (Algorithme). Un algorithme est suite finie


d’opérations élémentaires constituant un schéma de calcul
ou de résolution d’un problème.

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

De haut niveau: peuvent être traduit en n'importe quel langage

Précis ne doit pas porter à confusion

Concis ne doit pas dépasser une page

Structuré doit être composé de différentes parties.

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 ?

Trouver une méthode


de résolution Trouver une méthode
(exacte ou approchée) efficace.
du problème.

=>Savoir résoudre un problème est une chose, le résoudre


efficacement en est une autre, ou encore montrer qu' ’il est
correcte …!!
 Exemple 1:
 problème Détection de visage
 Exemple 1:
 problème Détection de visage
 Algorithmes
 Exemple 1:
 problème Détection de visage
 Exemple 1:
 problème Détection de visage

 Laquelle choisir? et pourquoi?


Deep Neural Network for face detection (2017)

=>Analyse de la complexité des algorithmes


 Exemple 1:
 problème Détection de visage
Rappels : algorithmique I
 Exemple 2:
 problème : calculer xn
données : x : réel , n: entier
Méthode 1 : x0 = 1; xi = x* xi-1 i >0 T=n
Méthode 2 : x0 = 1;
T = log n
xi = xi/2 * xi/2 , si i est pair;
xi = x*xi’/'2 * xi’/2 si i est impair
...
résultats : y = xn
 Laquelle choisir? et pourquoi?
 Plutôt la deuxième.

=>Analyse de la complexité des algorithmes


Exercice:
Donner un algorithme qui permet de calculer la somme :
Sn= 1 +2+ 3+ …+n
Rappels : algorithmique I
Exemple 3:
problème : Tri d’un tableau
Rappels : algorithmique I
Évaluation d'un algorithme

Efficacité d'un algorithme :


• temps d'exécution
• mémoire occupée

évaluer le temps d ’exécution = évaluer le nombre d'opérations à


exécuter par l'algorithme, en fonction de la taille des données.

opérations « élémentaires » : +, -, *, /, >, =, et, ou

taille des données = espace occupe


Rappels : algorithmique I
Conclusion:
Un bon algorithme est comme un couteau tranchant

L’emploi d’un mauvais algorithme pour résoudre un problème


revient à essayer de couper un steak avec un tournevis :
le résultat aura peu de chances d’être esthétiquement
satisfaisant.
Complexité
Objectifs

Avoir des outils pour concevoir un ‘’bon’’


(correct et efficace) algorithme pour
résoudre un problème.
Calcul de la complexité :
Analyser un algorithme revient à:

-prévoir les ressources -mesurer son temps


nécessaires. d'exécution.

L’analyse de plusieurs algorithmes candidats pour un problème


donné :

Nécessite des outils mathématiques.


Analyse de la complexité :
Notation asymptotique
Les fonctions que l'on considère dans cette section sont des
fonctions de N dans N . Soient  f et g deux fonctions.

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)

Definition 3   On dit que f=Θ(g)  si et seulement si:


f=O(g)
et g=O(f)
Analyse de la complexité :

 Exemples :

0 : n=O(n), (prendre n0 =1, c=1)


2n = O(3n) (prendre n0 =1 c = 2/3)

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:

Soit l’algorithme suivant:

// t tableau de n entiers
// n entier >0

Entier: max
max t[0]
Pour i=1 à n-1
si (max <t[i])
maxt[i]
Fin si
Fin pour
Exercice
 Déterminez la complexité temporelle de
l’algorithme Check :
Solution

 Avant de calculer la complexité, il faut vérifier


si l’algorithme se termine. Les éléments de la
matrice sont des entiers, donc peuvent
dépasser la valeur de 9, ce qui signifie que
tab[value-1] sort de la taille du tableau.
L’algorithme n’est donc pas viable et inutile
de continuer l’analyse plus loin.
Exercice
Solution
Exercice
 Quel est le temps d’exécution (asymptotique)
de chacun des algorithmes suivants, en
fonction de n ? Justifiez vos réponses.
A) B)
for i = 1 to n do for i = 1 to 10 do
   for j = 1 to 2n + 1 do    for j = 1 to n do
      print (« Hello World)       print (« Hello World »)
   end for    end for
end for end for

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é.

Vous aimerez peut-être aussi