1
2
3
4
5
6
7
8
9

Notions avancées d'algorithmique

Après avoir acquis les bases de l'algorithmique dans la première UE, cette partie du cours vous permettra d'aller plus loin. Nous apprendrons d'abord à évaluer la performance d'un algorithme, en analysant sa complexité en temps et en espace mémoire. Nous mettrons ensuite en pratique ces notions en implémentant des algorithmes classiques de recherche et de tri.

Il est en effet important de comprendre que l'efficacité d'un algorithme ne se limite pas à vérifier qu'il "fonctionne". Deux algorithmes peuvent donner le même résultat mais l'un sera bien plus rapide ou utilisera moins de mémoire que l'autre. Pour évaluer cette efficacité, on utilise la notation Grand O, qui décrit comment le temps d'exécution ou la mémoire consommée croissent en fonction de la taille des données.

1. Pourquoi mesurer la complexité ?

Lorsque la quantité de données augmente, le temps de calcul peut exploser. Un tri efficace sur 100 éléments peut devenir inutilisable sur un million. Plutôt que de mesurer en secondes (qui dépendent du matériel ou du langage), on préfère une mesure abstraite : combien d'opérations l'algorithme effectue en fonction du nombre d'entrées n. Cette mesure permet de comparer des algorithmes indépendamment de la machine.

2. La notation Grand O

La notation O(f(n)) exprime un ordre de grandeur : elle donne une borne supérieure du nombre d'opérations pour des données de taille n. Dire qu'un algorithme est en O(n) signifie que le nombre d'étapes croît au plus linéairement avec n. On ignore les constantes et les termes moins significatifs, car pour de grands n seul le comportement dominant compte.

Exemple : si un algorithme effectue 3n + 5 comparaisons, on écrit O(n) : les constantes 3 et 5 deviennent négligeables lorsque n devient grand.

3. Complexité en temps

La complexité en temps mesure la durée théorique d'exécution.

Exemple comparatif

Supposons deux fonctions : Pour n = 1 000 000, f1 effectue en moyenne un million de comparaisons, f2 seulement une vingtaine.

4. Complexité en espace

L'espace mémoire est tout aussi important.
On évalue combien de mémoire supplémentaire l'algorithme requiert au-delà des données initiales.
Minimiser l'espace est essentiel sur les systèmes embarqués ou quand les données sont volumineuses.

5. Le Cas moyen, le meilleur cas et pire

La complexité peut varier : Pour quicksort par exemple, le cas moyen est O(n log n), mais un pivot mal choisi peut mener à O(n²) dans le pire cas.

Exercice

Problème du Maximum Subarray (version naïve)


1. Complexité en temps (Grand-O)

  1. Analysez les deux boucles imbriquées pour déterminer le nombre total d'opérations en fonction de n, la taille du tableau.
  2. Exprimez la complexité temporelle dans le pire des cas.

2. Complexité en espace (mémoire)

  1. Listez les variables supplémentaires utilisées.
  2. Déterminez l'espace additionnel requis en fonction de n.

Que se passe-t-il si le tableau contient un million d'éléments ?
Proposez une idée d'optimisation pour améliorer la complexité en temps.

Correction

Autonomie : Tout savoir sur l'algorithme de tri Quicksort

Autonomie : Tout savoir sur l'algorithme de recherche binaire


← Réalisation d'une classe Dé et extension au jeu du 421 Module 2 →