Recherche Linéaire & Binaire

Comment trouver efficacement une valeur dans un tableau

Utilisez les flèches, cliquez ou glissez pour naviguer

Objectifs de la leçon

1. Implémenter une recherche linéaire

Parcourir un tableau élément par élément — O(n)

2. Comprendre la recherche binaire

Diviser pour régner — O(log n)

3. Implémenter la recherche binaire

Sur un tableau trié uniquement

4. Pourquoi trier aide à chercher

Le compromis tri/recherche

Plan du cours

1

Recherche linéaire

Parcourir un par un — O(n), simple mais lent

2

Le jeu du "plus grand, plus petit"

L'analogie parfaite pour la recherche binaire

3

Recherche binaire

Diviser pour régner — O(log n), nécessite un tableau trié

4

Live coding

Implémenter les deux algorithmes et comparer

5

Pourquoi trier d'abord ?

Quand le tri devient rentable

Le problème

Trouver une valeur spécifique dans un tableau

Exemple : Où se trouve le nombre 42 ?

[3, 7, 12, 42, 89, 156, 201]

Recherche linéaire : Le principe

Parcourir le tableau élément par élément

Comparer chaque valeur avec celle qu'on cherche

Tableau

3 7 12 42 ✓ 89 156 201

On teste chaque case jusqu'à trouver

Simple mais inefficace pour les grands tableaux

Pseudo-code : Recherche linéaire

// Cherche 'valeur' dans 'tableau'

FONCTION rechercheLineaire(tableau, valeur)

POUR i DE 0 À tableau.longueur - 1

SI tableau[i] = valeur

RETOURNER i // Trouvé! Retourne l'index

FIN SI

FIN POUR

RETOURNER -1 // Non trouvé

FIN FONCTION

On retourne l'index si trouvé, sinon -1

Implémentation JavaScript

function rechercheLineaire(tableau, valeur) {

for (let i = 0; i < tableau.length; i++) {

if (tableau[i] === valeur) {

return i; // Trouvé!

}

}

return -1; // Non trouvé

}

Exemple d'utilisation :

const nombres = [3, 7, 12, 42, 89];

rechercheLineaire(nombres, 42); // → 3

rechercheLineaire(nombres, 100); // → -1

Complexité : O(n)

Dans le pire cas, on parcourt tout le tableau

Si la valeur est à la fin ou absente → n comparaisons

10 éléments

10 ops

1 000 éléments

1 000 ops

1 000 000 éléments

1 000 000 ops

Le jeu du "Plus grand, Plus petit"

Devinez un nombre entre 1 et 100

Je pense à un nombre... Proposez!

Je répondrai : "Plus grand" ou "Plus petit"

La stratégie optimale

Mauvaise stratégie

1, 2, 3, 4, 5, 6...

Jusqu'à 100 essais!

Bonne stratégie

Commencer par 50 (le milieu)

Diviser par 2 à chaque fois!

Exemple : Le nombre est 73

50 "Plus grand" 75 "Plus petit" 62 "Plus grand" 73 ✓

C'est exactement la recherche binaire!

Au lieu de tester chaque nombre, on divise l'espace de recherche par 2

Recherche linéaire

1, 2, 3, 4, 5... jusqu'à trouver

Jusqu'à 100 essais

Recherche binaire

50 → 75 → 62 → 68 → 71 → 73...

Maximum 7 essais!

log₂(100) ≈ 7 — Seulement 7 étapes max!

Recherche Binaire

Diviser pour régner — O(log n)

À chaque étape, on élimine la moitié des possibilités

⚠️ Précondition CRITIQUE

Le tableau DOIT être TRIÉ

Si le tableau n'est pas trié, la recherche binaire ne fonctionne PAS

On ne peut pas savoir quelle moitié éliminer!

Pseudo-code : Recherche binaire

// Le tableau DOIT être trié!

FONCTION rechercheBinaire(tableau, valeur)

gauche = 0

droite = tableau.longueur - 1

TANT QUE gauchedroite

milieu = (gauche + droite) / 2

SI tableau[milieu] = valeur

RETOURNER milieu // Trouvé!

SINON SI tableau[milieu] < valeur

gauche = milieu + 1 // Chercher à droite

SINON

droite = milieu - 1 // Chercher à gauche

FIN TANT QUE

RETOURNER -1 // Non trouvé

FIN FONCTION

Implémentation JavaScript

function rechercheBinaire(tableau, valeur) {

let gauche = 0;

let droite = tableau.length - 1;

while (gauche <= droite) {

const milieu = Math.floor((gauche + droite) / 2);

if (tableau[milieu] === valeur) {

return milieu;

} else if (tableau[milieu] < valeur) {

gauche = milieu + 1;

} else {

droite = milieu - 1;

}

}

return -1;

}

Exemple :

const nombres = [3, 7, 12, 42, 89, 156, 201];

rechercheBinaire(nombres, 42); // → 3

Visualisation : Division par 2

Cherchons 42 dans [3, 7, 12, 42, 89, 156, 201]

Étape 1 : milieu = 3 (valeur 42)

3 7 12 42 ✓ 89 156 201

Trouvé en 1 seule étape!

Si on cherchait 156 :

3 7 12 42 89 156 201

42 < 156 → on garde la moitié droite → 156 trouvé à l'étape 2

La puissance du log₂

log₂(1 000 000) ≈ 20

Seulement 20 étapes pour chercher dans 1 million d'éléments!

Recherche linéaire

1 000 000 ops

Recherche binaire

20 ops

Comparaison : O(n) vs O(log n)

N éléments O(n) Linéaire O(log n) Binaire Ratio
10 10 ~4 2.5x
100 100 ~7 14x
1 000 1 000 ~10 100x
100 000 100 000 ~17 5 882x
1 000 000 1 000 000 ~20 50 000x

Pour 1 million : 50 000 fois plus rapide!

Visualisation de la croissance

N (nombre d'éléments) Opérations O(n) O(log n) Écart énorme!

O(log n) reste presque plat même avec des millions d'éléments

Quand utiliser quelle recherche ?

Recherche linéaire

Tableau non trié
Petit tableau
Recherche unique

O(n)

Recherche binaire

Tableau trié
Grand tableau
Recherches multiples

O(log n)

Live Coding

Implémentons les deux algorithmes ensemble

Comparons le nombre d'opérations pour différents tableaux

⚠️ Piège #1 : Off-by-one errors

Les erreurs de décalage sont très fréquentes!

❌ Incorrect

while (gauche < droite) { // < au lieu de <=

milieu = Math.floor((gauche + droite) / 2);

if (tableau[milieu] < valeur) {

gauche = milieu; // Oubli du +1

✅ Correct

while (gauche <= droite) { // <= important!

milieu = Math.floor((gauche + droite) / 2);

if (tableau[milieu] < valeur) {

gauche = milieu + 1; // +1 essentiel

💡 gauche <= droite pour inclure le dernier élément

💡 milieu ± 1 pour éviter de retester le milieu

⚠️ Piège #2 : Tableau non trié

La recherche binaire ne fonctionne PAS sur un tableau non trié!

❌ Tableau non trié

42 7 156 3 89

On ne peut pas diviser intelligemment!

✅ Tableau trié

3 7 42 89 156

On peut éliminer la moitié!

Les étudiants oublient souvent cette précondition!

Comment éviter ces pièges

✅ Vérifier les bornes avec des exemples simples

Tester avec tableau = [5] et chercher 5 → doit retourner 0

✅ Toujours vérifier que le tableau est trié

Ajouter un commentaire ou une assertion au début de la fonction

✅ Tester les cas limites

Élément au début, à la fin, absent, tableau vide

Points clés à retenir

1. Recherche linéaire = O(n)

Simple, fonctionne toujours, mais lent pour les grands tableaux

2. Recherche binaire = O(log n)

Ultra rapide, mais nécessite un tableau trié

3. Le jeu "plus grand/plus petit" = recherche binaire

Diviser par 2 à chaque étape → log₂(n) opérations max

Pourquoi trier d'abord peut être rentable ?

Si on effectue plusieurs recherches, le tri devient rentable

1 recherche

Linéaire

Pas besoin de trier

10 recherches

À évaluer

Dépend de la taille

100+ recherches

Binaire + Tri

Très rentable!

Trier = O(n log n), mais ensuite chaque recherche = O(log n)

Pour k recherches : O(n log n) + k × O(log n) vs k × O(n)

Exercices pratiques

1. Implémenter rechercheLineaire()

Tester avec différents tableaux et valeurs

2. Implémenter rechercheBinaire()

Attention aux bornes gauche/droite!

3. Comparer les performances

Créer un tableau de 10 000 éléments et mesurer le temps

4. Défi : Trouver le bug

On vous donne une recherche binaire avec un bug off-by-one

Questions?

Recherche linéaire vs binaire — Choisir le bon outil

À retenir : log₂(1 000 000) ≈ 20

Seulement 20 étapes pour chercher dans 1 million!