Recherche d’un élément dans un tableau
La recherche d’éléments dans un tableau a déjà été évoquée en classe de première. Les deux algorithmes mis en œuvre à cette occasion, la recherche linéaire et la recherche dichotomique, utilisaient des boucles.
L’objectif de cette séance est de rapidement revoir ces algorithmes et de mettre en œuvres des algorithmes récursifs de même complexité. Quatre algorithmes de recherche vont donc être implémentés :
- La recherche linéaire itérative ;
- La recherche linéaire récursive ;
- La recherche dichotomique itérative ;
- La recherche dichotomique récursive.
Travail à faire
- Implémenter en Python les cinq algorithmes suivants et répondre aux questions.
- Un corrigé se trouve à cette adresse : https://repl.it/join/azqimfmv-dlatreyte
Recherche séquentielle (ou linéaire)
Recherche séquentielle itérative
Algorithme 1
Fonction : recherche(tab, valeur)
Action : recherche la valeur « valeur » dans le tableau « tab »
Début
i ⟵ 0
i_val ⟵ -1
nb ⟵ Longueur(tab)
TantQue i < nb Faire
Si tab[i] = valeur Alors
i_val ⟵ i
FinSi
i ⟵ i + 1
FinTantQue
Renvoyer i_val
Fin
-
Décrire le fonctionnement de l’algorithme pour les valeurs
tab = [1, 8, 3, 5, 9]
etval = 3
. -
Démontrer que l’algorithme se termine.
-
Démontrer que l’algorithme est correct.
-
Démontrer que l’algorithme est en O(N).
-
Comment pourrait-on améliorer l’efficacité de cet algorithme ?
Algorithme 2
Fonction : recherche(tab, valeur)
Action : recherche de la valeur « valeur » dans le tableau « tab »
Début
trouvé ⟵ Faux
i ⟵ 0
TantQue i < nb et (Non trouvé) Faire
Si tab[i] = valeur Alors
trouvé ⟵ Vrai
Sinon
i ⟵ i + 1
FinSi
FinTantQue
Si trouvé = Vrai Alors
Renvoyer i
Sinon
Renvoyer -1
Fin
- Expliquer pourquoi l’algorithme 2 est plus efficace que l’algorithme 1.
Recherche séquentielle récursive
Algorithme 3
Fonction : recherche(tab, valeur, i)
Action : recherche la valeur « valeur » dans le tableau « tab » à l’aide de l’indice i.
Début
nb ⟵ Longueur(tab)
Si i == nb Alors
Renvoyer -1
Sinon
Si tab[i] = valeur Alors
Renvoyer i
Sinon
Renvoyer recherche(tab, valeur, i + 1)
FinSi
FinSi
Fin
- Décrire le fonctionnement de l’algorithme pour les valeurs
tab = [1, 8, 3, 5, 9]
,i = 0
etval = 3
.
Établir, en particulier, l’arbre des appels.
Recherche dichotomique
Dès que le nombre de données devient important, la recherche séquentielle n’est plus envisageable. Sa complexité en $O(N)$ pénalise les autres traitements qui l’utilisent. Il faut diminuer le temps de traitement par l’emploi d’algorithmes plus performants, comme celui de la recherche dichotomique.
Recherche dichotomique itérative
Algorithme 4
Fonction : recherche(tab, valeur)
Action : recherche la valeur « valeur » dans le tableau « tab »
Début
trouvé ⟵ FAUX
résultat ⟵ -1
gauche ⟵ 0
droite ⟵ Longueur(tab) - 1
TantQue (gauche <= droite) ET (NON trouvé) Faire
milieu ⟵ (droite + gauche) // 2
Si tab[milieu] = valeur Alors
resultat ⟵ milieu
trouvé ⟵ VRAI
SinonSi tab[milieu] < valeur Alors
gauche ⟵ milieu + 1
Sinon
droite ⟵ milieu - 1
FinSi
FinTantQue
Renvoyer résultat
Fin
-
Décrire le fonctionnement de l’algorithme pour les valeurs
tab = [1, 3, 5, 8, 9]
etval = 3
. -
Démontrer que l’algorithme se termine.
-
Démontrer que l’algorithme est correct.
-
Démontrer que l’algorithme est en $O(\log_2 N)$.
Recherche dichotomique récursive
Algorithme 5
Fonction : recherche(tab, valeur, gauche, droite)
Action : recherche la valeur « valeur » dans le tableau « tab »
Début
Si gauche > droite Alors
Renvoyer -1
Sinon
milieu ⟵ (droite + gauche) // 2
Si tab[milieu] = valeur Alors
Renvoyer milieu
SinonSi tab[milieu] < valeur
Renvoyer recherche(tab, valeur, milieu + 1, droite)
Sinon
Renvoyer recherche(tab, valeur, gauche, milieu - 1)
FinSi
FinSi
Fin
- Décrire le fonctionnement de l’algorithme pour les valeurs
tab = [1, 3, 5, 8, 9]
,gauche = 0
,droite = 4
, etval = 3
.