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:

  1. Sauvegarder la valeur du dernier élément du tableau.
  2. Remplacer le dernier élément du tableau par la valeur recherchée (la sentinelle).
  3. Parcourir le tableau avec une boucle while, comparant chaque élément à la valeur recherchée.
  4. Si la valeur est trouvée, vérifier si l'indice correspond au dernier élément. Si oui, la valeur recherchée n'était pas dans le tableau initial. Sinon, la valeur a été trouvée.
  5. Restaurer la valeur originale du dernier élément du tableau.

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

  • La sentinelle évite un test de fin de tableau en plaçant la valeur recherchée à la fin.
  • Les heuristiques de réorganisation (move-to-front, transpose) améliorent les performances si certaines valeurs sont recherchées plus fréquemment que d'autres.
  • Ces optimisations ne modifient pas la complexité asymptotique (O(n)) mais peuvent améliorer les performances en pratique.

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.