web-dev-qa-db-fra.com

Où la recherche binaire est-elle utilisée en pratique?

Tous les programmeurs apprennent que la recherche binaire est un moyen rapide et efficace de rechercher une liste ordonnée de données. Il existe de nombreux exemples de manuels d'utilisation de la recherche binaire, mais qu'en est-il de la programmation réelle: où la recherche binaire est-elle réellement utilisée dans les programmes réels?

25
tjdonaldson

La recherche binaire est utilisée partout . Prenez n'importe quelle collection triée dans n'importe quelle bibliothèque de langue (Java, .NET, C++ STL, etc.) et ils utiliseront tous (ou auront l'option d'utiliser) une recherche binaire pour trouver des valeurs. Il est vrai que vous devez rarement l’appliquer, mais vous devez tout de même en comprendre les principes pour en tirer parti.

26
Grey Panther

La recherche binaire peut être utilisée pour accéder rapidement aux données commandées lorsque l’espace mémoire est restreint . Supposons que vous souhaitiez stocker un ensemble de 100 000 entiers 32 bits dans une structure de données ordonnée pouvant faire l'objet d'une recherche, mais que vous n'alliez pas le modifier souvent. Vous pouvez facilement stocker les entiers dans un tableau trié de 400 000 octets, et vous pouvez utiliser la recherche binaire pour y accéder rapidement. Mais si vous les mettez par exemple dans une structure B-tree, RB-tree ou toute structure de données "plus dynamique", vous commencez à subir une surcharge de mémoire. En guise d'illustration, le stockage des entiers dans tout type d'arborescence dans lequel vous avez laissé des pointeurs enfant et droit vous ferait consommer au moins 1 200 000 octets de mémoire (en supposant une architecture de mémoire 32 bits). Bien sûr, il y a des optimisations que vous pouvez faire, mais c'est comme ça que ça fonctionne en général.

Comme il est très lent de mettre à jour un tableau ordonné (effectuer des insertions ou des suppressions), la recherche binaire n’est pas utile lorsque le tableau change souvent.

Voici quelques exemples pratiques où j'ai utilisé la recherche binaire:

  • Implémentation d'une construction "switch () ... case:" dans une machine virtuelle où les étiquettes de cas sont des entiers individuels. Si vous avez 100 observations, vous pouvez trouver l'entrée correcte en 6 à 7 étapes à l'aide de la recherche binaire, où une séquence de branches conditionnelles prend en moyenne 50 comparaisons.
  • Effectuer une recherche rapide de sous-chaînes à l'aide de tableaux de suffixes, qui contiennent tous les suffixes de l'ensemble de chaînes pouvant faire l'objet d'une recherche dans l'ordre lexiographique (je souhaitais conserver de la mémoire et garder une implémentation simple)
  • Trouver des solutions numériques à une équation (quand vous êtes paresseux et que cela ne vous dérange pas d'appliquer la méthode de Newton)
19
Antti Huima

Chaque programmeur doit savoir utiliser la recherche binaire lors du débogage.

Lorsque vous avez un programme et que vous savez qu'un bogue est visible à un moment donné de son exécution, vous pouvez utiliser la recherche binaire pour localiser l'endroit où il se produit réellement. Cela peut être beaucoup plus rapide que de parcourir un grand nombre de parties du code.

15
user25148

La recherche binaire est un moyen rapide et efficace!

Avant l'arrivée de STL et du framework .NET, etc., vous pourriez assez souvent vous heurter à des situations où vous deviez créer vos propres classes de collection personnalisées. Chaque fois qu'un tableau trié serait un endroit possible pour stocker les données, la recherche binaire serait le moyen de localiser les entrées dans ce tableau.

Je suis à peu près sûr que la recherche binaire est très répandue aujourd'hui, même si elle est prise en charge par la bibliothèque pour votre commodité.

7
SteinNorheim

J'ai implémenté des recherches binaires dans les implémentations de BTree.

Les algorithmes de recherche BTree ont été utilisés pour trouver le prochain bloc de nœud à lire, mais dans le bloc 4K lui-même (qui contenait un nombre de clés basé sur la taille de la clé), une recherche binaire était utilisée pour trouver le numéro d'enregistrement (pour un nœud feuille ) ou le bloc suivant (pour un noeud non-feuille).

Une rapidité aveuglante comparée à la recherche séquentielle puisque, à la manière d'arbres binaires équilibrés, vous supprimez la moitié de l'espace de recherche restant à chaque vérification.

6
paxdiablo

Répondre à votre question avec un exemple pratique.

Dans le langage de programmation R, il y a un paquet data.table . Il est connu de C, implémenté, syntaxe courte, extension hautes performances pour la transformation de données. Il utilise la recherche binaire. Même sans recherche binaire, il évolue mieux que ses concurrents.
Vous pouvez trouver des repères vs - python pandas et vs R dplyr dans le projet wiki groupement 2E9 - données à ordre aléatoire.
Il existe également un benchmark de Nice vs bases de données vs bigdata benchm-database .

Dans la version récente de data.table (1.9.6), la recherche binaire a été étendue et peut maintenant être utilisée comme index sur toute colonne atomique.

Je viens de trouver un joli résumé avec lequel je suis tout à fait d’accord - voir .

Toute personne effectuant des comparaisons R doit utiliser data.table au lieu de data.frame. Plus encore pour les repères. data.table est le meilleur langage de structure/requête de données que j'ai trouvé dans ma carrière. Il ouvre la voie dans le monde R et, à ma manière, dans toutes les langues axées sur les données.

Donc oui, recherche binaire est utilisé et le monde est bien meilleur endroit grâce à cela.

3
jangorecki

Nous l'utilisons encore beaucoup dans notre code pour rechercher des milliers d'AACS plusieurs milliers de fois par seconde. C'est utile car les ACL sont statiques une fois qu'elles sont entrées dans un fichier et nous pouvons supporter le coût de la croissance du tableau au fur et à mesure que nous l'ajoutons au démarrage. Blazingly rapide une fois sa course aussi.

Lorsque vous pouvez rechercher un tableau de 255 éléments dans au plus 7 comparaisons/sauts (511 sur 8, 1023 sur 9, etc.), vous pouvez voir que la recherche binaire est presque aussi rapide que vous pouvez obtenir.

3
Adam Hawes

Une fois, je l'ai implémenté (sans même savoir qu'il s'agissait bien d'une recherche binaire) pour un contrôle graphique affichant des données bidimensionnelles dans un graphique. En cliquant avec la souris, le curseur de données doit être positionné sur le point avec la valeur x la plus proche. Lorsque l'on traitait un grand nombre de points (plusieurs milliers, cela remontait à une époque où x86 commençait tout juste à dépasser la fréquence du processeur de 100 MHz), cela n'était pas vraiment utilisable de manière interactive - je faisais une recherche linéaire dès le début. Après avoir réfléchi, je me suis dit que je pouvais aborder cette question de façon partagée. Il m'a fallu du temps pour que cela fonctionne dans tous les cas Edge.

Ce n’est que quelque temps plus tard que j’ai appris qu’il s’agissait bien d’un algorithme fondamental de CS ...

3
mghie

Un exemple est le jeu stl. La structure de données sous-jacente est un arbre de recherche binaire équilibré qui prend en charge la recherche, l'insertion et la suppression dans O (log n) en raison de la recherche binaire.

Un autre exemple est un algorithme de division entier qui s'exécute en temps de journal.

2
MrDatabase

Eh bien, la recherche binaire est maintenant utilisée dans 99% des jeux et applications 3D. L'espace est divisé en une arborescence et une recherche binaire est utilisée pour récupérer les subdivisions à afficher en fonction d'une position 3D et d'une caméra.

Doom a été l'une de ses plus grandes vitrines. Les arbres binaires et la recherche associée ont amélioré le rendu.

2
karlipoppins

La recherche binaire peut être utilisée pour déboguer avec Git. Cela s'appelle git bisect .

2
Sanghyun Lee

Entre autres, j'ai un interpréteur avec une table de noms de commandes et un pointeur sur la fonction pour interpréter cette commande. Il y a environ 60 commandes. Il ne serait pas incroyablement coûteux d’utiliser une recherche linéaire, mais j’utilise une recherche binaire.

1
Jonathan Leffler

Le tri binaire est utile pour ajuster les polices à la taille du texte avec une dimension constante de la zone de texte.

1
Marek Bardoński

J'avais un programme qui parcourait une collection pour effectuer des calculs. Je pensais que c'était inefficace, j'ai donc trié la collection puis utilisé une recherche binaire unique pour trouver un élément d'intérêt. J'ai retourné cet article et ses voisins correspondants. J'avais en effet filtré la collection.

En réalité, cela a été plus lent que de parcourir la collection entière et de rechercher les éléments correspondants.

J'ai continué à ajouter des éléments à la collection en sachant que les performances de tri et de recherche finiraient par rattraper l'itération. Il a fallu une collection d'environ 600 objets jusqu'à ce que la vitesse soit identique. 1000 objets présentaient un net avantage en termes de performances.

J'examinerais également le type de données avec lequel vous travaillez, les doublons et la diffusion. Cela aura un effet sur le tri et la recherche.

Ma réponse est d'essayer les deux méthodes et de les chronométrer.

1
Neil

C'est la base de hg bisect

1
Ken

Les programmes de test à semi-conducteurs utilisés pour mesurer la synchronisation numérique ou les niveaux analogiques font largement appel à la recherche binaire. Les équipements de test automatique (ATE) de Advantest, Teradyne, Verigy et autres peuvent être considérés comme des générateurs de vérité, appliquant une logique d’entrée et vérifiant les états de sortie d’une pièce numérique.

Imaginez une porte simple, la logique d'entrée changeant à l'instant = 0 de chaque cycle et la transition X ns après le changement de la logique d'entrée. Si vous testez la sortie avant T = X, la logique ne correspond pas à la valeur attendue. Strobe plus tard que le temps T = X, et la logique correspond à la valeur attendue. La recherche binaire est utilisée pour trouver le seuil entre la dernière valeur à laquelle la logique ne correspond pas et la partie la plus ancienne à laquelle elle correspond (un système Teradyne FLEX résout la temporisation à une résolution de 39 pS, les autres testeurs étant comparables). C'est un moyen simple de mesurer le temps de transition. La même technique peut être utilisée pour résoudre le temps de configuration, le temps de maintien, les niveaux d'alimentation pouvant être utilisés, l'alimentation par rapport au retard, etc.

Tout type de microprocesseur, mémoire, FPGA, logique et de nombreux circuits à signaux mixtes analogiques utilisent la recherche binaire pour le test et la caractérisation.

-- Mike

1
Mike

Les utilisateurs de Delphi peuvent profiter de la recherche binaire lors de la recherche de chaîne dans TStringList trié.

0
Michał Niklas

La recherche binaire offre une fonctionnalité que de nombreuses implémentations carte/dictionnaire prêtes à l'emploi ne proposent pas: la recherche de correspondances non exactes.

Par exemple, j'ai utilisé la recherche binaire pour implémenter la géolocalisation de photos basée sur les journaux GPS: placez tous les points de cheminement GPS dans un tableau trié par horodatage et utilisez la recherche binaire pour identifier le point de cheminement le plus proche dans le temps de l'horodatage de chaque photo.

0

Je crois que .NET SortedDictionary utilise un arbre binaire dans les coulisses (un peu comme la carte STL) ... donc une recherche binaire est utilisée pour accéder aux éléments de la SortedDictionary

0
Polaris878

La recherche des racines d'une équation est probablement l'une des choses très simples que vous souhaitez effectuer avec un algorithme très simple, comme la recherche binaire.

0
dirkgently

La méthodelist.sort() de Python utilise Timsort qui (autant que je sache) utilise la recherche binaire pour localiser les positions des éléments.

0
MAK