Je lisais à propos de la recherche binary … Je sais que la méthode traditionnelle de recherche de valeur moyenne est la suivante:
mid=(hi+lo)/2
Mais je vois aussi que pour éviter le débordement, la valeur moyenne est calculée comme ça
mid=lo+(hi-lo)/2
Mais pourquoi?? Je ne pouvais pas trouver la raison réelle … Est-ce que quelqu’un peut me donner la raison avec exemple? C’est différent d’une autre question parce que d’autres questions n’avaient pas la réponse que je voulais avec exemple …
Supposons que vous cherchiez un tableau de 4000000000 éléments en utilisant un unsigned int
32 bits en tant qu’index.
La première étape donnait l’impression que l’élément recherché, s’il était présent, figurerait dans la moitié supérieure. La valeur de lo
est 2000000000
et celle de hi
est 4000000000
.
hi + lo
déborde et produit une valeur inférieure au 6000000000
prévu. Il produit réellement 6000000000-2 32 . En conséquence, (hi + lo) / 2
est une petite valeur. Ce n’est même pas entre lo
et hi
!
A partir de là, la recherche sera fausse (il sera probablement conclu que l’élément est absent même s’il était présent).
En revanche, même avec les valeurs extrêmes de cet exemple, lo + (hi - lo) / 2
calcule toujours un indice situé à mi-chemin entre hi
et lo
, comme prévu par l’algorithme.
Mathématiquement, ils sont équivalents.
En termes informatiques, mid=(hi+lo)/2
a moins d’opérations, mais mid=lo+(hi-lo)/2
est préférable pour éviter les débordements.
Supposons que l’élément que vous recherchez se trouve à la fin du tableau, puis hi+lo
une 2*size
presque égale à 2*size
. Puisque la size
peut être presque aussi grande que votre index maximum, une 2*size
et donc hi+lo
peut déborder.