J'ai toujours entendu dire que la recherche linéaire est une approche naïve et que la recherche binaire est meilleure qu'en performance en raison d'une meilleure complexité asymptotique. Mais je n'ai jamais compris pourquoi est-ce mieux que la recherche linéaire lorsque le tri est requis avant la recherche binaire?
La recherche linéaire est O(n)
et la recherche binaire est O(log n)
. Cela semble être la base pour dire que la recherche binaire est meilleure. Mais la recherche binaire nécessite un tri qui est O(n log n)
pour les meilleurs algorithmes. La recherche binaire ne devrait donc pas être plus rapide as elle nécessite un tri.
Je lis CLRS dans lequel l'auteur implique qu'en tri par insertion au lieu d'utiliser l'approche de recherche linéaire naïve, il est préférable d'utiliser la recherche binaire pour trouver l'endroit où l'élément doit être inséré. Dans ce cas, cela semble être justifié car à chaque itération de boucle, il existe une liste triée sur laquelle la recherche binaire peut être appliquée. Mais dans le cas général où il n'y a aucune garantie sur l'ensemble de données dans lequel nous devons rechercher, la recherche binaire n'est-elle pas pire que la recherche linéaire en raison des exigences de tri?
Y a-t-il des considérations pratiques que j'écarte qui rendent la recherche binaire meilleure que la recherche linéaire? Ou la recherche binaire est-elle considérée comme meilleure que la recherche linéaire sans tenir compte du temps de calcul requis pour le tri?
Y a-t-il des considérations pratiques que j'écarte qui rendent la recherche binaire meilleure que la recherche linéaire?
Oui - vous devez effectuer le tri O (n log n) une seule fois, puis vous pouvez effectuer la recherche binaire O (log n) aussi souvent que vous le souhaitez, tandis que la recherche linéaire est O(n) à chaque fois.
Bien sûr, cela n'est un avantage que si vous effectuez plusieurs recherches sur les mêmes données. Mais les scénarios "écrire une fois, lire souvent" sont assez courants.
L'hypothèse de base est que vous ne faites pas une seule recherche.
Donc, si vous devez rechercher les mêmes données plusieurs fois, vous n'avez qu'à trier une seule fois et vous pouvez profiter de la recherche binaire.
Si vous recherchez souvent et que vous avez des données changeantes, il vaut la peine d'utiliser une liste triée où les nouvelles entrées sont triées dans la liste.
Donc, la recherche binaire est meilleure lorsque vous effectuez une recherche dans la même liste plusieurs fois sans avoir besoin de recourir.
Lorsque vous devez trier à chaque fois avant de rechercher, il n'y a aucun avantage.
Veuillez noter qu'il existe des algorithmes de tri qui sont très rapides lorsque la liste est déjà triée (ou presque triée). La plupart des déterminations de performances attendent une liste non triée.
car une fois que vous avez une liste triée, vous n'avez pas besoin de la trier à nouveau à chaque fois, ce qui signifie que si vous avez plus de recherches O (log n), le tri à l'avance vous rapportera un gain gagnant (O(n log n + k log n)
vs O(k*n)
Imaginez deux annuaires téléphoniques.
Un annuaire téléphonique a les noms par ordre alphabétique. Pour trouver l'entrée que vous voulez, vous ouvrez au milieu, vérifiez l'entrée, puis avancez ou reculez selon que vous avez dépassé ou sous-dépassé.
L'autre annuaire téléphonique a les noms dans un ordre aléatoire. Pour trouver l'entrée que vous voulez, vous commencez au début et continuez jusqu'à ce que vous trouviez ce que vous voulez.
Le deuxième livre fonctionnera-t-il dans n'importe quelle ville de taille raisonnable?
Je pense que la valeur de la recherche binaire sur la recherche linéaire est contextuelle. Si vous commencez avec un énorme ensemble de données non ordonné et prévoyez seulement d'en extraire un petit nombre d'éléments, le tri et l'exécution d'une recherche binaire seront lents. Cependant, si vous maintenez une liste ordonnée pendant toute la durée de vie de votre application et y accédez régulièrement, la recherche binaire est une bien meilleure solution.
Comme beaucoup d'autres ont répondu, la recherche binaire est en effet préférable car l'étape de tri ne peut être effectuée qu'une seule fois et la recherche réelle peut ensuite être effectuée autant de fois que vous le souhaitez. Cependant, pour certaines valeurs de n (c'est-à-dire certaines tailles d'entrée), la recherche binaire est toujours plus performante que la recherche linéaire (même pour un seul passage).
Le "point de basculement" est calculé en résolvant l'équation de complexité asymptotique:
n log n + log n = n
Comme vous pouvez voir sur Wolfram Alpha il existe une valeur numérique pour n qui garantit que la recherche et le tri binaires sont toujours plus rapides que la recherche linéaire seule. Bien sûr, la valeur réelle de n qui fonctionne dans votre cas dépend de nombreux facteurs qui peuvent être difficiles à estimer.
Selon cet article intéressant par Mark Probst, qui comprend quelques mesures de performances approfondies de Nice sur les processeurs actuels:
Si vous devez rechercher dans un tableau trié d'entiers et que les performances sont vraiment très importantes, utilisez la recherche linéaire si votre tableau est inférieur à environ 64 éléments, la recherche binaire si elle est supérieure.
Dans les mots du profane:
Si vous avez une liste non ordonnée avec dix milliards d'articles, et que l'article que vous cherchez est le dernier, vous finirez par lire les dix milliards d'articles.
Dans le cas de la recherche binaire, l'indexation ne peut être effectuée qu'une seule fois. Des insertions ultérieures peuvent être faites au bon endroit pour maintenir l'ordre.
Alors que de nombreuses bonnes raisons pour "la recherche binaire est meilleure" ont déjà été répertoriées, nous pourrions également examiner les avantages du point de vue de l'utilisateur:
Bien que vous puissiez normalement très bien vivre avec le petit temps d'attente divisé entre les actions de saisie de données lorsque vous effectuez une insertion triée, vous souhaitez que la "recherche" soit aussi rapide que possible. Du point de vue de l'utilisateur, un insert trié combiné à une recherche binaire offre la meilleure expérience utilisateur possible.