Reconnaissance d'un tableau trié

Définissions le problème de décision associé au problème de savoir si oui ou non un tableau d'entiers est trié :

Problème de décision

  • nom : est trié ?
  • données : un tableau $T$ d'entiers
  • réponse : $T$ est-il trié de façon croissante ?

Il existe un algorithme très simple pour le résoudre.

Algorithme

def est_trie(T):

    for i in range(1, len(T)):
        if T[i] < T[i-1]:
            return False
    return True

Tests de Fonctionnement

L'algorithme rend bien :

Preuve

La finitude de l'algorithme est claire puisqu'il n'y a qu'une boucle for avec autant d'itérations que la taille du tableau passé en paramètre.

La preuve va être aisée si l'on démontre l'invariant suivant :

Invariant de boucle

À la fin d'un itération, les $i + 1$ premiers éléments du tableau sont triés.

  1. à la fin de la première itération, si l'on est pas sorti de la boucle c'est que $T[i] \geq T[i-1]$ pour $i=1$ : les 2 premiers éléments du tableau sont bien triés.
  2. Si l'invariant est vrai à la fin de l'itération $i-1$, à la fin de l'itération $i$ on à $T[i] \geq T[i-1]$ et comme les $i + 1$ premiers éléments du tableau sont triés : les $i + 1$ premiers éléments du tableau sont triés.

Au final :

Proposition

L'algorithme est_trie est une solution au problème "est trié ?"

Complexité

Ligne à ligne :

  1. définition de la fonction $\mathcal{O}(1)$
  2. une boucle for de $k$ itérations
  3. un tests de deux valeurs dans un tableau : $\mathcal{O}(1)$
  4. un retour de fonction $\mathcal{O}(1)$
  5. un retour de fonction $\mathcal{O}(1)$

Que l'on sorte par le retour de la ligne 5 ou 6, le complexité est : $\mathcal{O}(k)$. Dans le cas le pire, on parcourt tout le tableau, donc :

La complexité de l'algorithme est_trie est $\mathcal{O}(n)$ avec $n$ la taille du tableau en entrée.

Complexité du problème de la reconnaissance

Comme toute case du tableau peut rendre le tableau non trié, on utilise l'argument de la complexité du problème de la "recherche", un algorithme résolvant ce problème doit considérer toutes les cases du tableau et donc une borne min du problème "est trié ?" est $\Omega(n)$ où $n$ est la taille du tableau en entrée. Comme la complexité de est_trie est de $\mathcal{O}(n)$. On en conclut :

Proposition

La complexité du problème "est trié ?" est de $\Theta(n)$ où $n$ est la taille du tableau en entrée.