Programmation Algorithmique/Nombre d'opérations optimal

Un livre de Wikibooks.

La rapidité d'un algorithme est exprimé sous la forme du nombre d'opérations effectué par celui-ci. En général, ce nombre dépend des données d'entrées.

Il existe différent nombres d'opération :

  • le nombre d'opération minimal, qui se produit dans le meilleur des cas,
  • le nombre d'opération maximal, qui se produit dans le pire des cas,
  • le nombre moyen d'opérations, qui est une moyenne de ce que l'on peut espérer d'un algorithme dans la plupart des cas.

Exemple: Un algorithme de tri d'un tableau de n éléments effectuera un nombre moyen d'opérations dépendant de n (la taille du tableau) :

  • L'algorithme de tri à bulle s'effectue en O(n²) ;
  • L'algorithme de tri rapide (appelé Quicksort) s'effectue en moyenne en O(n*log(n)).

Sections

[modifier] Comparaison de quelques algorithmes

[modifier] Calcul de np

But: Élever un nombre entier n à la puissance p (entier également).

[modifier] Algorithme simple

L'implémentation simple de cet algorithme est la suivante :

ENTIER resultat
resultat <- 1
pour i de 1 à p
faire
  resultat <- resultat * n
finfaire

Cet algorithme s'effectue en O(p)

[modifier] Algorithme plus complexe

Cet algorithme est plus complexe, mais effectue moins d'opérations que le précédent :

ENTIER resultat
resultat <- 1
tantque p > 0
faire
  si p ET 1 <> 0 alors          # test du bit 0 de p
    resultat <- resultat * n
  finsi
  n <- n * n
  p <- p / 2   # division entière ou décalage de bits
finfaire

Cet algorithme s'effectue en O(log(p))

Cet algorithme fonctionne de la façon suivante :

  • A chaque itération de la boucle, n vaut successivement n, n2, n4, n8, ...
  • La valeur de l'exposant p en binaire s'exprime de la façon suivante :
p = \sum_{i=0}^\infty p_i \times 2^i
  • Chaque bit i de p est testé, s'il vaut 1, il faut multiplier le résultat temporaire par n^{2^i}. La relation mathématique entre les puissances est utilisée. Par exemple : n^{2^1} \times n^{2^3} = n^{2^1+2^3}. Donc pour tous les bits de p, on a :
\begin{matrix} && p_0 \times n^{2^0} \times p_1 \times n^{2^1} \times \cdots\\
=&& n^{p_0 \times 2^0 + p_1 \times 2^1 + \cdots}\\
=&& n^p \end{matrix}