Module 04 · Leçon 3
Recherche séquentielle et dichotomique
Ce que vous saurez faire
- Implémenter la recherche séquentielle
- Implémenter la recherche dichotomique (tableau trié)
- Comparer leurs complexités O(n) vs O(log n)
Avant de commencer
Vous cherchez un mot dans un dictionnaire. Naturellement, vous n'ouvrez pas page 1 pour parcourir page par page — vous ouvrez au milieu, vous voyez si le mot est avant ou après, et vous coupez la moitié restante en deux. C'est la recherche dichotomique.
1. Recherche séquentielle
DEF FN RechSeq(T : Tab, n : entier, val : entier) : entier
i ← 1
Tant que (i <= n) ET (T[i] ≠ val) Faire
i ← i + 1
FinTantQue
Si i > n Alors
RechSeq ← -1 { non trouvé }
Sinon
RechSeq ← i { position trouvée }
FinSi
Fin RechSeq
FUNCTION RechSeq(T : Tab; n, val : integer) : integer;
VAR
i : integer;
BEGIN
i := 1;
WHILE (i <= n) AND (T[i] <> val) DO
i := i + 1;
IF i > n THEN
RechSeq := -1
ELSE
RechSeq := i;
END;
Complexité : pire cas O(n) (val à la fin ou absente).
2. Recherche dichotomique
DEF FN RechDicho(T : Tab, n : entier, val : entier) : entier
inf ← 1
sup ← n
trouve ← Faux
Tant que (inf <= sup) ET (NON trouve) Faire
milieu ← (inf + sup) div 2
Si T[milieu] = val Alors
trouve ← Vrai
Sinon Si val < T[milieu] Alors
sup ← milieu - 1
Sinon
inf ← milieu + 1
FinSi
FinTantQue
Si trouve Alors
RechDicho ← milieu
Sinon
RechDicho ← -1
FinSi
Fin RechDicho
FUNCTION RechDicho(T : Tab; n, val : integer) : integer;
VAR
inf, sup, milieu : integer;
trouve : boolean;
BEGIN
inf := 1; sup := n;
trouve := false;
milieu := 0;
WHILE (inf <= sup) AND NOT trouve DO
BEGIN
milieu := (inf + sup) DIV 2;
IF T[milieu] = val THEN
trouve := true
ELSE IF val < T[milieu] THEN
sup := milieu - 1
ELSE
inf := milieu + 1;
END;
IF trouve THEN
RechDicho := milieu
ELSE
RechDicho := -1;
END;
3. Pourquoi la dichotomie est-elle si rapide ?
À chaque étape, on divise par 2 la taille du segment à fouiller.
Au bout de k étapes, il reste n / 2^k éléments.
On s'arrête quand n / 2^k = 1, soit k = log₂(n).
| n | Recherche séquentielle (pire cas) | Recherche dichotomique (pire cas) |
|---|---|---|
| 100 | 100 | 7 |
| 1 000 | 1 000 | 10 |
| 1 000 000 | 1 000 000 | 20 |
4. Trace d'exécution dichotomique
Sur T = [2, 5, 8, 12, 16, 23, 38, 56, 72, 91] (n=10), on cherche 23.
| N° | Instruction | inf | sup | milieu | T[milieu] |
|---|---|---|---|---|---|
| 01 | ··· | ? | ? | ? | ? |
| 02 | ··· | ? | ? | ? | ? |
| 03 | ··· | ? | ? | ? | ? |
| 04 | ··· | ? | ? | ? | ? |
5. Exercices
Sur T = [3, 7, 11, 15, 22, 30, 41], dérouler la recherche dichotomique
de la valeur 11. Donner les valeurs successives de inf, sup,
milieu.
Voir le corrigé
- Étape 1 : inf=1, sup=7, milieu=4, T[4]=15. 11 < 15, sup ← 3.
- Étape 2 : inf=1, sup=3, milieu=2, T[2]=7. 11 > 7, inf ← 3.
- Étape 3 : inf=3, sup=3, milieu=3, T[3]=11. Trouvé en position 3.
Écrire une fonction Compter(T, n, val) qui retourne le nombre
d'occurrences de val dans T. Quelle méthode (séquentielle ou
dichotomique) utiliser ?
Voir le corrigé
Recherche séquentielle : il faut visiter tous les éléments pour compter. La dichotomie trouve une occurrence mais ne sait pas compter sans parcourir.
FUNCTION Compter(T : Tab; n, val : integer) : integer;
VAR
i, cpt : integer;
BEGIN
cpt := 0;
FOR i := 1 TO n DO
IF T[i] = val THEN
cpt := cpt + 1;
Compter := cpt;
END;
Étant donné un tableau T trié de taille n et une valeur val,
écrire une procédure qui insère val à la bonne position en
décalant les éléments supérieurs.
Utiliser la recherche dichotomique pour trouver la position d'insertion.
Voir le corrigé
PROCEDURE Inserer(VAR T : Tab; VAR n : integer; val : integer);
VAR
inf, sup, milieu, i : integer;
BEGIN
{ Recherche dichotomique de la position d'insertion }
inf := 1; sup := n;
WHILE inf <= sup DO
BEGIN
milieu := (inf + sup) DIV 2;
IF val < T[milieu] THEN
sup := milieu - 1
ELSE
inf := milieu + 1;
END;
{ À la sortie, inf est la position d'insertion }
{ Décalage }
FOR i := n DOWNTO inf DO
T[i + 1] := T[i];
T[inf] := val;
n := n + 1;
END;
6. Erreurs fréquentes au bac
- Utiliser la dichotomie sur un tableau non trié → résultat erroné.
- Oublier
inf ← milieu + 1(ousup ← milieu - 1) : sans +1/−1, on peut boucler infiniment. - Confondre
infetsupau moment du milieu :(inf + sup) div 2. - Renvoyer
milieumême quandtrouve = Faux: il faut tester avant.
7. Quiz
Quiz (5 questions)
Sur un tableau de 1 000 000 éléments, la dichotomie fait au plus :
La recherche dichotomique exige :
Pour rechercher dans un tableau non trié, on doit utiliser :
Le `milieu` se calcule par :
Quelle condition de sortie est correcte dans Tant que (recherche dichotomique) ?