Pourquoi la recherche binaire, qui nécessite des données triées, est-elle considérée comme meilleure que la recherche linéaire?

20

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?

Aseem Bansal
la source
6
Comme pour tant d'autres choses, tout se résume à: "Cela dépend ...;)"
Jeff B
Si la liste est déjà triée, pensez-vous que la recherche linéaire est encore meilleure? C'est peut-être quelque chose à considérer ici.
JB King
3
Pour tous ceux qui envisagent de changer le titre , veuillez ne pas retirer la partie sur les données triées, car la suppression de cela fait que cela semble être une question complètement différente.
Aseem Bansal

Réponses:

53

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.

Michael Borgwardt
la source
Si vous ne faites quelque chose qu'une seule fois, il est inutile de l'optimiser.
14

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.

Uwe Plonus
la source
2
Si vous recherchez souvent et insérez souvent, vous pourriez regarder des structures de données plus compliquées (par exemple des arbres binaires).
MarkJ
@MarkJ, la question fondamentale de l'affiche originale concernait la recherche dans une liste. Sinon, je suis entièrement d'accord avec vous.
Uwe Plonus
7

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)

monstre à cliquet
la source
5

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?

Gort le robot
la source
3

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.

Programmeur amish
la source
3

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:

n log n + log n = n

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:

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.

LorenzCK
la source
2

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.

Tulains Córdova
la source
2

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.

tofro
la source