Numérique et Sciences Informatiques > Algorithmique : Tris et Recherche > Algorithmes de Recherche > Recherche linéaire
Optimisation de la Recherche Linéaire
Explorez les techniques d'optimisation de la recherche linéaire (séquentielle) dans des contextes spécifiques. Bien que la complexité de base reste O(n), des améliorations peuvent être apportées. Adapté aux élèves de lycée.
Sentinelle (Sentinel Search)
La technique de la sentinelle est une optimisation subtile de la recherche linéaire qui peut éviter un test dans la boucle principale. L'idée est de placer la valeur recherchée à la fin du tableau (en remplaçant temporairement le dernier élément). De cette façon, on est sûr de trouver la valeur recherchée (au moins une fois, à la fin). On peut alors supprimer la condition de vérification de la fin du tableau dans la boucle.
Principe:
while
, comparant chaque élément à la valeur recherchée.
Pseudo-code avec sentinelle
Fonction rechercheLineaireSentinelle(tableau, valeurRecherchee):
n = taille(tableau)
dernierElement = tableau[n-1]
tableau[n-1] = valeurRecherchee
i = 0
Tant que tableau[i] != valeurRecherchee faire:
i = i + 1
Fin Tant Que
tableau[n-1] = dernierElement // Restaurer la valeur originale
Si i < n - 1 OU valeurRecherchee == dernierElement alors:
Retourner i // La valeur a été trouvée à l'indice i
Sinon:
Retourner -1 // La valeur n'a pas été trouvée
Fin Si
Fin Fonction
Implémentation en Python avec Sentinelle
def recherche_lineaire_sentinelle(tableau, valeur_recherchee):
n = len(tableau)
dernier_element = tableau[n-1]
tableau[n-1] = valeur_recherchee
i = 0
while tableau[i] != valeur_recherchee:
i += 1
tableau[n-1] = dernier_element # Restaurer la valeur originale
if i < n - 1 or valeur_recherchee == dernier_element:
return i # La valeur a été trouvée à l'indice i
else:
return -1 # La valeur n'a pas été trouvée
Recherche Linéaire avec Heuristique (Pour les Données Non Ordonnées avec Probabilités)
Si vous effectuez plusieurs recherches dans le même tableau non trié, et que certaines valeurs sont plus susceptibles d'être recherchées que d'autres, vous pouvez réorganiser le tableau après chaque recherche réussie. L'idée est de rapprocher les valeurs fréquemment recherchées du début du tableau pour accélérer les recherches futures. Voici deux approches courantes: Move-to-Front: Après avoir trouvé une valeur, déplacez-la au début du tableau. Cela garantit qu'elle sera trouvée rapidement lors de la prochaine recherche. Transpose: Après avoir trouvé une valeur, échangez-la avec l'élément précédent. Cela la rapproche du début du tableau sans perturber complètement l'ordre relatif des autres éléments. Note Importante: Ces heuristiques ne réduisent pas la complexité dans le pire des cas (O(n)), mais peuvent améliorer les performances en moyenne si certaines valeurs sont recherchées plus souvent que d'autres. Elles introduisent également une modification du tableau original.
Quand utiliser ces optimisations?
La sentinelle est une petite optimisation qui peut être utile dans des boucles internes très critiques pour la performance. Les heuristiques de réorganisation sont utiles lorsque vous avez une distribution de probabilité non uniforme des recherches et que vous pouvez vous permettre de modifier le tableau. Il est important de noter que ces optimisations rendent le code un peu plus complexe, donc il faut bien peser le pour et le contre avant de les utiliser.
Ce qu'il faut retenir
FAQ
-
La technique de la sentinelle affecte-t-elle la complexité de la recherche linéaire?
Non, la complexité reste O(n). La sentinelle est une optimisation mineure qui réduit le nombre d'opérations dans la boucle, mais ne change pas le comportement asymptotique. -
Les heuristiques de réorganisation sont-elles toujours bénéfiques?
Non. Elles ne sont bénéfiques que si la distribution des recherches est non uniforme. Si toutes les valeurs sont recherchées avec la même probabilité, elles peuvent même dégrader les performances. -
Faut-il utiliser ces optimisations par défaut?
Non. Il est important de mesurer les performances avant et après l'application de ces optimisations pour s'assurer qu'elles apportent une amélioration significative. La lisibilité du code doit également être prise en compte.