Cols

Le but de cet exercice est d'étudier les cols d'un tableau.

Définition

Un col d'un tableau d'entiers $T$ de taille $n > 1$ est un indice $0 \leq i < n$ tel que :

  • soit $i = 0$ et $T[i] \leq T[1]$
  • soit $i = n-1$ et $T[i] \leq T[n-2]$
  • soit $0 < i < n-1$ et $T[i] \leq \min(T[i-1], T[i+1])$

Existence

Montrer que tout tableau d'entiers $T$ de taille $n > 1$ contient au moins 1 col.

Découverte

Donnez un algorithme nommé trouve(T) permettant de trouver un col d'un tableau d'entiers $T$ de taille $n > 1$ passé en paramètre en $\mathcal{O}(n)$ opérations.

Vous expliciterez :

  • que la complexité de votre algorithme est bien celle demandée,
  • qu'il trouve bien un col.

Rapidité

Démontrez que l'algorithme suivant permet de trouver un col d'un tableau d'entiers $T$ de taille $n > 1$ passé en paramètre.

algorithme trouve_vite(T: [entier])  entier:
    si T[0] <= T[1]:
        rendre 0

    si T[-1] <= T[-2]:
        rendre T.longueur - 1

    début  0
    fin  T.longueur - 1

    tant que Vrai:
        milieu  (fin + début) // 2
        si T[milieu] <= min(T[milieu - 1], T[milieu + 1]):
            rendre milieu

        si T[milieu] > T[milieu - 1]:
            fin  milieu
        sinon:
            début  milieu

code python

def trouve_vite(T):
    if T[0] <= T[1]:
        return 0

    if T[-1] <= T[-2]:
        return len(T) - 1

    début = 0
    fin = len(T) - 1

    while True:
        milieu = (fin + début) // 2
        if T[milieu] <= min(T[milieu - 1], T[milieu + 1]):
            return milieu

        if T[milieu] > T[milieu - 1]:
            fin = milieu
        else:
            début = milieu

Complexité

Donnez la complexité de l'algorithme trouve_vite(T).

complexité du problème

Après avoir formalisé le problème de la recherche d'un col dans un tableau, vous démontrerez que sa complexité est égale à la complexité de l'algorithme trouve_vite(T).

Généralisation

Définition

On appelle col d'une matrice un élément minimum global de sa ligne et maximum global de sa colonne.

  1. montrez qu'il n'existe pas forcément de col à une matrice
  2. donnez un algorithme linéaire en la taille de la matrice pour trouver un col s'il existe
  3. montrer que l'optimisation utilisée sur la ligne ne fonctionne pas sur les matrices.