J'ai toujours entendu dire que la recherche linéaire est une approche naïve et que la recherche binaire est meilleure que la 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 car 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 quant à 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?
la source
Réponses:
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.
la source
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, fondamentalement, la recherche binaire est meilleure lorsque vous recherchez plusieurs fois la même liste 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.
la source
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 O (log n) recherches, le tri à l'avance vous rapportera un gain gagnant (
O(n log n + k log n)
vsO(k*n)
la source
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?
la source
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ées 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 tout au long de la durée de vie de votre application et y accédez régulièrement, la recherche binaire est une bien meilleure solution.
la source
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 une seule exécution).
Le «point de basculement» est calculé en résolvant l'équation de complexité asymptotique:
Comme vous pouvez le 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 de Mark Probst, qui comprend de belles mesures de performances en profondeur sur les processeurs actuels:
la source
Dans les mots du profane:
Si vous avez une liste non ordonnée avec dix milliards d'articles, et que l'article que vous recherchez 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.
la source
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.
la source