Si en théorie avoir un algorithme pour résoudre un problème permet de le résoudre, en pratique c'est plus compliqué car intervient la contrainte du temps : chaque tache demande du temps pour être exécutée
et au final le temps d’exécution peut être considérable.
Si vous avez besoin de temps réel (arrêt automatique d'une voiture), vous ne pouvez avoir un algorithme qui prend une seconde à s’exécuter.
Des systèmes de cryptographie peuvent être cassé en décomposant un nombre en produit de facteurs, on s'est le faire mais pour des grands nombres cela demande des siècles. A l'usage les algorithmes de cryptage offrent une bonne sécurité.
Étudier le nombre d'opérations nécessaire à la résolution d'un problème revient à étudier sa complexité.
Ordre de grandeur.
Les comparaisons asymptotiques de fonctions est du niveau BAC+2, on ne rentrera pas dans les détails.
Soit deux fonctions f et g définient sur \(\mathbf{R}\) sont de même ordre si il existe deux constantes k1 et k2 tel que pour tout n :
$$ k_1 g(x) \le f(x) \le k_2 g(x) $$
dés que x est suffisamment grand.
La notation utilisée est \(f = \Theta(g)\). On trouve aussi la notation \(f = O(g)\) qui a plus le sens f est dominé asymptotiquement par g.
Echelle de complexité
Pour tester les fonction on pourra utiliser le wrapper suivant :
\(\Theta(1)\)
Un algorithme est en \(\Theta(1)\) quand il ne dépend pas de la taille de la donnée et que son cout est donc constant
\(\Theta(ln(n))\)
La fonction logarithme est une fonction très importante, c'est l'inverse de la fonction exponentielle et elle est au programme de terminale. En physique vous la rencontrez au moment de parler du PH.
Si un algorithme est en ln(n) alors son coup croit très doucement en fonction des données, doubler la taille des données ne provoque qu'un nombre fixe d'opération en plus.
Attachée à la fonction ln il existe des fonction logarithmes qui sont liées, logn et qui diffère d'un coefficient multiplicateur.
Pour en donner une version entière log2(n) est le nombre k le plus grand tel que 2k ≤ n. Par exemple log2(7) = 2 car 2
\(\Theta(n)\)
Un algorithme est en \(\Theta(n)\) s'il est proportionnel à la taille des données, des données deux fois plus grande provoque un doublement du temps d’exécution.
\(\Theta(nln(n))\)
Si un algorithme est en \(\Theta(nln(n))\) alors il est presque linéaire.
\(\Theta(n²)\)
Si un algorithme est en \(\Theta(n²)\) alors doubler la taille quadruple le temps d’exécution.
\(\Theta(n^3\))
En pratique les algorithmes en \(\Theta(n^3\)) commencent à être long. Doubler la donnée multiplie par 8 le temps d’exécution.
Complexité exponentielle.
Quand des algorithmes sont exponentielles \(\Theta(2^n)\) ils sont rapidement peu utilisables. On passe alors à d'autres algorithmes qui a défaut de donner des résultats exacts donnent des très bons résultats à des coûts moindres.
Complexité factorielle.
Encore pire que les problèmes exponentielles.
Comparatif du temps d'execution.
Donner le nombre limite d'opérations : .
Alors le nombre donné à l'algorithme doit être au plus de :
\(\Theta(1)\) : potentiellement infini.
\(\Theta(ln(n))\) :
\(\Theta(n)\) :
\(\Theta(nln(n))\) :
\(\Theta(n^2)\) :
\(\Theta(n^3)\) :
\(\Theta(2^n)\) :
\(\Theta(n!)\) :
Donner la taille de la donnée : .
Alors, sur une machine qui fait 1000 000 000 opérations par seconde (1Ghz), le temps de calcul est au moins :
\(\Theta(1)\) : 1 nano seconde =\(10^{-9}\).
\(\Theta(ln(n))\) :
\(\Theta(n)\) :
\(\Theta(nln(n))\) :
\(\Theta(n^2)\) :
\(\Theta(n^3)\) :
\(\Theta(2^n)\) :
\(\Theta(n!)\) :
QCM
Vidéo
Dans cette vidéo on parle de la complexité et d'un célèbre problème mathématiques :