Parcours de tableau 2
- Compter des occurrences.
- Filtrer un tableau.
- Parcourir plusieurs tableaux ou sous-tableaux.
1 Rappel
Les algorithmes de parcours simples de tableau à \(n\) éléments ont une complexité en \(O(n)\), on dit que la complexité est linéaire. Nous allons voir dans cette partie des parcours qui nécessitent davantage de traitements et nous verrons leur complexité.
2 Comptage d’occurrences
Principe : Je veux compter le nombre d’occurrences d’un élément cible dans un tableau. Il faut donc parcourir le tableau et garder en mémoire le nombre de fois où la cible a été rencontrée.
Pseudo-code générique :
DEBUT
compteur ← 0
i ← 1
TQ i ≤ n FAIRE
SI T[i] = cible ALORS
compteur ← compteur + 1
FSI
i ← i+1
FTQ
RENVOYER compteur
FIN
La boucle principale parcourt toutes les cases du tableau et à chaque passage de boucle le nombre d’opérations est en \(\Theta(1)\). Donc la complexité de cet algorithme est en \(\Theta(n)\).
Adapter cet algorithme pour compter le nombre de fois qu’apparaît chaque élément dans le cas où le tableau parcouru est composé d’entiers strictement positifs inférieurs ou égaux à \(N\).
3 Filtrage de tableau
Principe : On va parcourir le tableau et traiter les éléments qui vérifient une certaine condition.
Par exemple, on peut extraire les éléments pairs d’un tableau.
Pseudo-code :
VARIABLES :
i : entier
Reponse : tableau vide
DEBUT
i ← 1
TQ i ≤ n FAIRE
SI T[i] mod 2 = 0 ALORS
Ajouter T[i] à Reponse
FSI
i ← i+1
FTQ
RENVOYER Reponse
FIN
De la même façon que dans la recherche d’occurrences, la complexité est en \(\Theta(n)\).
Écrire un algorithme qui additionne tous les nombres impairs d’un tableau.
4 Parcours double
Principe : On a deux tableaux (ou des sous-tableaux), et on veut les parcourir avec deux indices différents. Il faut donc deux boucles pour le faire.
Par exemple, on peut compter le nombre de paires \((i,j)\) telles que \(T[i] < T[j]\) avec \(i < j\).
Pseudo-code :
DEBUT
compteur ← 0
i ← 1
TQ i ≤ n FAIRE
j ← i+1
TQ j ≤ n FAIRE
SI T[i] < T[j] ALORS
compteur ← compteur + 1
FSI
j ← j+1
FTQ
i ← i+1
FTQ
RENVOYER compteur
FIN
Analyse de complexité :
Pour chaque valeur de \(i\) de 1 à \(n\), on parcourt les indices \(j\) de \(i+1\) à \(n\). Le nombre total d’opérations est :
\[\sum_{i=1}^{n} \sum_{j=i+1}^{n} \Theta(1) = \sum_{i=1}^{n} (n-i) = \sum_{k=0}^{n-1} k = \frac{n(n-1)}{2}\]
La complexité est donc en \(\Theta(n^2)\), on dit que c’est une complexité quadratique.
Les boucles imbriquées conduisent souvent à une complexité quadratique ou pire. Il est important d’analyser si cette complexité est nécessaire ou si on peut optimiser l’algorithme.
- Écrire un algorithme qui compte le nombre de paires d’éléments égaux dans un tableau.
- Écrire un algorithme qui vérifie si un tableau contient des doublons.
- Quelle est la complexité de ces algorithmes ?
5 Comparaison de complexités
Voici un tableau récapitulatif des complexités vues :
| Type de parcours | Complexité | Exemple |
|---|---|---|
| Parcours simple | \(\Theta(n)\) | Recherche d’un élément, comptage |
| Filtrage | \(\Theta(n)\) | Extraction d’éléments pairs |
| Parcours double | \(\Theta(n^2)\) | Recherche de paires, doublons |
- Un parcours simple avec traitement en \(\Theta(1)\) → complexité \(\Theta(n)\)
- Deux boucles imbriquées avec traitement en \(\Theta(1)\) → complexité \(\Theta(n^2)\)
- Trois boucles imbriquées avec traitement en \(\Theta(1)\) → complexité \(\Theta(n^3)\)