Cet algorithme peut-il toujours être considéré comme un algorithme de recherche binaire?


14

En faisant le deuxième code kata (qui vous demande d'implémenter cinq fois un algorithme de recherche binaire, à chaque fois avec une méthode différente), j'ai trouvé une solution légèrement différente qui fonctionne comme suit:

Si j'ai un tableau trié de longueur 100 et que je vois que son champ de départ contient le nombre 200 et son champ de fin contient le nombre 400, moi, en tant qu'étudiant en mathématiques, je serais susceptible de commencer à chercher autour du champ 35 si je cherchais le numéro 270, et non le champ 50 comme dans un algorithme de recherche binaire normal.

Ensuite, si le nombre sur le champ 35 du tableau est 270, 35 est l'index que je cherchais.

Si ce n'est pas le cas, je peux comparer le nombre obtenu (disons 280) et répéter l'opération en prenant la partie inférieure du tableau (j'ai donc 35 champs avec le champ de départ contenant 200 et le champ de fin contenant 280) si le le nombre que j'ai trouvé est supérieur à ce que je recherche, ou à la partie supérieure du tableau (disons que j'en ai 260: maintenant j'ai 65 index, le premier contenant 260 et le dernier contenant 400. Orientativement, je me dirigerais vers torward index 4 de ce sous-tableau, qui est l'index 39 de l'ensemble du tableau) si le nombre que j'ai obtenu est inférieur au nombre que je recherche.

La question est: cet algorithme peut-il être considéré comme un algorithme de recherche binaire? Sinon, a-t-il son propre nom?


2
Que ce soit une recherche binaire ou non semble être uniquement une question d'opinion. Essentiellement, la seule réponse que vous pouvez donner est «Ouais, c'est assez proche de la recherche binaire pour l'appeler recherche binaire» ou «Non, ce n'est pas le cas». L'argument s'ensuit.
David Richerby

Réponses:


23

Je n'appellerais pas cela une recherche binaire.

Il est clairement similaire à la recherche binaire et il est naturel de le voir comme un raffinement de la recherche binaire. Cependant, il a des caractéristiques de complexité d'algorithme significativement différentes, la recherche d'interpolation a prévu un temps d'exécution de O (log (log (n)) en supposant que les données sont uniformément distribuées, mais il paie pour cela en ayant O (n) le pire temps d'exécution.

Je préfère dire "Le pire temps d'exécution de la recherche binaire est O (log (n))" plutôt que "Selon le choix des éléments de délimitation, le pire temps d'exécution de la recherche binaire est O (log (n))". Cela signifie que je ne peux pas classer la recherche d'interpolation comme un algorithme de recherche binaire.


Vraisemblablement, si vous interrompez la recherche par interpolation lorsque cela se passe mal, vous pouvez conserver O (log n) dans le pire des cas et O (log log n) sur des données suffisamment linéaires. Ma conjecture est que quelque chose comme "si je n'ai pas trouvé la cible après des tentatives de log n puis passer à la recherche binaire" fonctionnera, mais je suis trop paresseux pour le prouver. Il y aura bien sûr une classe d'entrées tueuses sur laquelle cela prend essentiellement deux fois plus de temps qu'une recherche binaire.
Steve Jessop

Cette idée de tueur est intéressante. Que se passe-t-il si au lieu de permettre aux entrées de tueur d'affecter négativement la recherche (c'est-à-dire en se séparant près de la fin d'un tableau) nous limitons / coupons la "plage séparable" au 2ème tiers du tableau ou similaire. Cela aurait un pire cas log3 (n) mais toujours un meilleur casier log (log).
Andrew Gallasch

1
@SteveJessop Rappelez-vous que la complexité asymthotique n'est pas l'image complète. O (log n) est très rapide. De plus, la recherche binaire fait très peu de travail dans chaque boucle. Le problème de la recherche d'interpolation est donc déjà que vous avez besoin d'une entrée très longue pour compenser le fait que vous travaillez davantage sur chaque boucle. Votre suggestion ajoute plus de travail à cela. Si je n'ai pas pu accepter O (n) pour des données qui n'étaient pas uniformes, je soupçonne que la meilleure solution est d'opter pour une recherche binaire pure, plutôt que pour une approche hybride.
Taemyr

@SteveJessop: Pas besoin de changer d'algorithme; cela peut se faire en parallèle. Étant donné une plage R, vous pouvez déterminer le point P1 comme le point milieu habituel pour la recherche binaire et P2 en utilisant l'interpolation. Vous avez maintenant trois sous-gammes, dont aucune ne peut être supérieure à la moitié de la plage d'origine. Vérifiez la valeur cible par rapport à la fois à P1 et P2, et vous savez laquelle des trois sous
gammes utiliser pour recurse

17

O(loglogn)


Cool. Maintenant, la question est de savoir si je peux l'utiliser pour le code kata, mais c'est mon problème lol. Je trouve cela plus compliqué que la recherche binaire, alors pourquoi pas.
user6245072

J'ai découvert cela une fois en écrivant du code pour indexer un fichier journal il y a quelques années. J'ai également découvert que pour mes données, l'alternance des étapes entre l'interpolation et la tranche binaire était meilleure que l'une ou l'autre option en soi. Je ne sais pas si cela a un nom ou s'il s'agit d'un effet connu.
Neil Slater

@NeilSlater recherche d'interpolation couverte peut-être?
Steve Cox

@SteveCox: Je viens de chercher ce terme et je n'ai rien trouvé. Décidé de poser cela comme une nouvelle question: cs.stackexchange.com/questions/59750/…
Neil Slater

-1

Je pense que la terminologie correcte serait une recherche réfléchie dychotomiale.

Vous recherchez dans un tableau plat avec une recherche réfléchie ultérieure basée sur la distribution plate supposée des nombres qu'il contient.

Cela correspond à la façon dont une personne rechercherait un mot dans un dictionnaire. Mais cela peut être très inefficace si la distribution des données est irrégulière.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.