OVH Cloud OVH Cloud

rechercheV

15 réponses
Avatar
Kamel
Salut,

Y a t il sur Excel une formule comme rechercheV mais qui recherche la 1ere
valeur plus petite ? (et non pas égale comme dans rechercheV)

merci

5 réponses

1 2
Avatar
Daniel.M
Bonjour AV, Kamel,

La methode consistant à initialiser à VRAI le dernier argument de rechercheV
me semble la plus simple ....


Ca ne répond absolument pas à ta question !
Ou tu as changé la question ou tu l'as mal formulé !


Mon avis est qu'il y a 2 questions à régler:

1. Que signifie l'expression : "recherche la 1ere valeur plus petite?"
a. La valeur plus petite que x qui est la plus près de x.
b. La première valeur rencontrée dans la plage qui satisfait au critère (<x)

Si la réponse est a, alors la formule d'Alain est la bonne et on n'a même pas
besoin de se poser la 2e question : la cas est réglé.

Si la réponse est b, alors 2e question:
2. Les données sont-elles triées ascendantes?
a. Oui. Alors on vérifie la première cellule de la plg. C'est assurément la
plus petite, et si <x, on la retourne, sinon, il n'y en a pas.
b. Non.
Alors 1ère constatation : RECHERCHEV(;;;VRAI) ne fonctionnera pas et
retournera des valeurs complètement aléatoires.
On peut utiliser la matricielle suivante:
=INDEX(Plg;EQUIV(1;1/(Plg<x);-1))

Salutations,

Daniel M.


Avatar
AV
Salut Daniel,

d'interprétation en interprétation, je sens qu'on va finir à
{=MIN(SI(plg<x;plg))} ;-))

{=INDEX(Plg;EQUIV(1;1/(Plg<x);-1))}
?? pourquoi pas (plus classiquement)
{=INDEX(Plg;EQUIV(1;(Plg<x)*1;0))}

AV
Avatar
Daniel.M
Salut Alain,


{=INDEX(Plg;EQUIV(1;1/(Plg<x);-1))}
?? pourquoi pas (plus classiquement)
{=INDEX(Plg;EQUIV(1;(Plg<x)*1;0))}



Ça donne le même résultat en effet.
La première est une recherche dichotomique (au lieu de séquentielle) qui fera
beaucoup moins de comparaisons (pour Plg.Cells.Count = 1000, la première fera en
moyenne 11 comparaisons en moyenne alors que la deuxième en fera 500).

Mais je crois pas qu'on ne pourra pas mesurer cette différence pour UNE formule
et la tienne est plus claire (pour dans six mois quand on rouvre le classeur)
:-).

Salutations,

Daniel M.

Avatar
AV
La première est une recherche dichotomique (au lieu de séquentielle)
Voui..voui....;-)


qui fera beaucoup moins de comparaisons (pour Plg.Cells.Count = 1000, la
première fera en

moyenne 11 comparaisons en moyenne alors que la deuxième en fera 500).


Je ne sais pas si, compte-tenu du fait que dans un cas (ta proposition), la
matrice à examiner est faite de 1 ou #DIV0! et dans l'autre cas (ma
proposition), elle est constituée de 1 ou 0, la différence sera aussi sensible
que pour un cas classique de liste alpha ou num variée...

Mais je crois pas qu'on ne pourra pas mesurer cette différence pour UNE
formule

Ca je suis d'accord que ça va pas être fastoche...;-)

A quand la recherche par interpolation ?
;-)
AV

Avatar
Daniel.M
qui fera beaucoup moins de comparaisons (pour Plg.Cells.Count = 1000, la
première fera en

moyenne 11 comparaisons en moyenne alors que la deuxième en fera 500).


Je ne sais pas si, compte-tenu du fait que dans un cas (ta proposition), la
matrice à examiner est faite de 1 ou #DIV0! et dans l'autre cas (ma
proposition), elle est constituée de 1 ou 0, la différence sera aussi sensible
que pour un cas classique de liste alpha ou num variée...



Il serait en effet intéressant de savoir comment est codée la recherche
dichotomique lorsqu'on rencontre une valeur d'erreur. Il n'est pas sûr que ça
reste dans l'ordre Log à base 2 de N, ça se peut que la performance se dégrade.
Mais bon, j'ai pas accès au code source :-)

En plus, la formule procède au même nombre d'opérations sur la matrice (
1/(Plg<x) ) que la tienne (Plg<x)*1 et que ce sont ces opérations qui sont plus
nombreuses que celles de la recherche (EQUIV) proprement dite. Donc, on va
employer la tienne : OK Kamel? :-)

Salutations,

Daniel M.


1 2