Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Retour de la fonction bsearch

59 réponses
Avatar
candide
Bonjour,

Juste un avis perso : le retour de la fonction bsearch est peu exploitable.


Bien souvent, face à une liste croissante, on ne se préoccupe pas
essentiellement de savoir si un élément donné s'y trouve ou ne s'y
trouve pas, on cherche à savoir où il est placé dans la liste (et
éventuellement hors de la liste à gauche ou à droite). Or, quel que soit
l'algorithme utilisé par bsearch (recherche séquentielle ou
dichotomique), bsearch serait en mesure sans coût supplémentaire
excessif de donner cette position. Hélas bsearch se contente de donner
une réponse binaire. Et je trouve particulièrement agaçant d'avoir à me
recoder un truc aussi classique qu'une recherche dichotomique, pas vous ?

10 réponses

1 2 3 4 5
Avatar
candide
Jean-Marc Bourguet a écrit :

Si la valeur n'est pas trouvee, faire ++ et -- sur NULL, ca marche pas trop
bien.



Ah, enfin !
Avatar
Jean-Marc Bourguet
candide writes:

Jean-Marc Bourguet a écrit :

> Je crois qu'il voudrait que bsearch se comporte d'une maniere similaire a
> std::equal_range en C++;

D'après la doc C++ que je viens de regarder, c'est plus ou moins ça.

> mais il faut retourner plus qu'une simple
> position.

Une position suffit (l'ordre est total) après c'est une question de
convention (le plus ou le plus grand, peu importe). Mais surtout, et c'est
ça que j'ai du mal à comprendre, c'est que ça ne coûterait _rien de plus_ à
bsearch de nous sortir cette position puisque forcément il la calcule.



Un equivalent de lower_bound ou upper_bound alors?

Ca couterait a l'utilisation normale (chez moi; j'utilise des structures
plus complexes qu'un tableau trie si ce que tu desires est necessaire; note
que les fonctions du C++ sont valables pour autre chose que des tableaux)
un test supplementaire pour savoir si ce que bsearch retourne est un
element trouve ou bien la position ou il faudrait mettre un element non
trouve.

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Marc Boyer
On 2008-10-01, candide wrote:
Marc Boyer a écrit :

Sauf que bsearch ne travaille pas avec des listes,



J'ai employé le terme de liste dans un sens informel, ça ne change rien
au problème, ce qui compte c'est qu'on ait une succession d'"objets" (au
sens informel encore).



Et pourtant ça change plein de choses, en algorithmique déjà, et en C
encore plus.

mais avec des
tableaux, et qu'avec l'arithméique des pointeurs, quand tu as
l'adresse d'une donnée (et son type), ben, t'a les voisins...



Je vois pas ce que l'arithmétique des pointeurs vient faire là-dedans.
Tu n'as pas compris ma question.

Bien sûr que j'ai les voisins si bsearch répond != NULL. Mais si bsearch
te renvoie NULL, c'est quoi le voisin ?????? pourtant il existe et dans
sa recherche, bsearch le rencontre mais dans sa réponse, il l'ignore.



Ah, c'était ça ta demande.

Ce que je dis là ne me parait pas bien compliqué à comprendre.



Ce que tu dis dans ce message ci en effet. Mais je n'avais
pas compris avec les messages précédents. Et Jean-marc non plus
puisque std::range_equal ne correspond pas à ce que tu demandes.

D'ailleurs, une recherche dichotomique dans une liste, ça
va être dur...



Tu fais une fixation ou quoi ?



Non, mais j'ai des réflexes d'informaticien.

Avant d'aller faire tes courses au
supermarché, tu te fais un _tableau_ de courses ? Bon moi je fais une
liste.



Oui, mais chaque domaine spécialise un certain nombre de termes.
En info, une liste, c'est une liste chainée.
Un truc qui va de [0,n-1] dans T (avec T un type), sans présumer
de la représentation interne, on appelle plutôt ça une séquence
il me semble.

C'est quoi une liste pour toi ? une liste chainée ? Ça reste une
succession d'objets, je vois donc pas le problème.



Ben, le problème de faire une recherche dichotomique dans une
liste.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)
Avatar
Marc Boyer
On 2008-10-01, candide wrote:
Marc Boyer a écrit :

Sauf que bsearch ne travaille pas avec des listes,



J'ai employé le terme de liste dans un sens informel, ça ne change rien
au problème, ce qui compte c'est qu'on ait une succession d'"objets" (au
sens informel encore).



Et pourtant ça change plein de choses, en algorithmique déjà, et en C
encore plus.

mais avec des
tableaux, et qu'avec l'arithméique des pointeurs, quand tu as
l'adresse d'une donnée (et son type), ben, t'a les voisins...



Je vois pas ce que l'arithmétique des pointeurs vient faire là-dedans.
Tu n'as pas compris ma question.

Bien sûr que j'ai les voisins si bsearch répond != NULL. Mais si bsearch
te renvoie NULL, c'est quoi le voisin ?????? pourtant il existe et dans
sa recherche, bsearch le rencontre mais dans sa réponse, il l'ignore.



Ah, c'était ça ta demande.

Ce que je dis là ne me parait pas bien compliqué à comprendre.



Ce que tu dis dans ce message ci en effet. Mais je n'avais
pas compris avec les messages précédents.

D'ailleurs, une recherche dichotomique dans une liste, ça
va être dur...



Tu fais une fixation ou quoi ?



Non, mais j'ai des réflexes d'informaticien quand je suis
sur fclc.

Avant d'aller faire tes courses au
supermarché, tu te fais un _tableau_ de courses ? Bon moi je fais une
liste.



Oui, mais chaque domaine spécialise un certain nombre de termes.
En info, une liste, c'est une liste chainée.
Un truc qui va de [0,n-1] dans T (avec T un type), sans présumer
de la représentation interne, on appelle plutôt ça une séquence
il me semble.

C'est quoi une liste pour toi ? une liste chainée ? Ça reste une
succession d'objets, je vois donc pas le problème.



Ben, le problème de faire une recherche dichotomique dans une
liste.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)

--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)
Avatar
candide
Jean-Marc Bourguet a écrit :
candide writes:

Jean-Marc Bourguet a écrit :

Je crois qu'il voudrait que bsearch se comporte d'une maniere similaire a
std::equal_range en C++;


D'après la doc C++ que je viens de regarder, c'est plus ou moins ça.

mais il faut retourner plus qu'une simple
position.


Une position suffit (l'ordre est total) après c'est une question de
convention (le plus ou le plus grand, peu importe). Mais surtout, et c'est
ça que j'ai du mal à comprendre, c'est que ça ne coûterait _rien de plus_ à
bsearch de nous sortir cette position puisque forcément il la calcule.



Un equivalent de lower_bound ou upper_bound alors?




Oui, ça doit être ça, mais je connais pas le C++ : "life is too short
..." tu connais la suite.



Ca couterait a l'utilisation normale (chez moi; j'utilise des structures
plus complexes qu'un tableau trie si ce que tu desires est necessaire; note
que les fonctions du C++ sont valables pour autre chose que des tableaux)
un test supplementaire pour savoir si ce que bsearch retourne est un
element trouve ou bien la position ou il faudrait mettre un element non
trouve.



Oui, ça couterait, un chouilla par rapport à l'exécution complète de
l'algorithme et ça rapporterait pas mal.
Avatar
Jean-Marc Bourguet
candide writes:

Oui, ça couterait, un chouilla par rapport à l'exécution complète de
l'algorithme et ça rapporterait pas mal.



Non seulement ca coute, mais ca complique l'utilisation.

Mais, c'est ou nos opinions different: ca ne m'aurait jamais rapporte rien
du tout.

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
candide
Marc Boyer a écrit :

J'ai employé le terme de liste dans un sens informel, ça ne change rien
au problème, ce qui compte c'est qu'on ait une succession d'"objets" (au
sens informel encore).



Et pourtant ça change plein de choses, en algorithmique déjà,



"Plein de choses", ça se discute parce que ça dépend du point de vue ou
de la hauteur où tu te places. Un algorithme change-t-il vraiment si la
structure de données est une liste ou un tableau ? Le tri par insertion
ou le tri fusion s'implémentent plus facilement avec une liste certes
mais il me semble que la complexité n'est pas modifiée, la liste va
juste t'épargner des recopies mais les algorithmes dans leur principe
restent strictement identiques. Idem quand tu travailles avec des
graphes, que tu travailles avec des matrices d'adjacence ou des listes
d'adjacence, l'algorithme de Dijkstra reste l'algorithme de Disjstra.
Idem pour les nuances qu'on peut faire entre itératif et récursif, un
DFS reste un DFS.

et en C
encore plus.




De toute façon en C, la notion de liste chainée n'existe pas
officiellement. Et puis un jour faudra qu'on discute des réels avantages
des listes chaînées, je trouve ça souvent très couteux (multiples malloc
et free faits séquentiellement).





Ben, le problème de faire une recherche dichotomique dans une
liste.



Oui, d'accord, dans le sens où on n'a plus d'accès direct.
Avatar
Marc Boyer
On 2008-10-01, candide wrote:
Marc Boyer a écrit :

J'ai employé le terme de liste dans un sens informel, ça ne change rien
au problème, ce qui compte c'est qu'on ait une succession d'"objets" (au
sens informel encore).



Et pourtant ça change plein de choses, en algorithmique déjà,



"Plein de choses", ça se discute parce que ça dépend du point de vue ou
de la hauteur où tu te places.



Je ne connais pas tant de points de vue que cela en algorithmique.

Un algorithme change-t-il vraiment si la structure de données est
une liste ou un tableau ?



Ben, une recherche par dichotomie dans un tableau, c'est O(log n),
et dans une liste chainée, c'est O(n).

Le tri par insertion
ou le tri fusion s'implémentent plus facilement avec une liste certes
mais il me semble que la complexité n'est pas modifiée, la liste va
juste t'épargner des recopies mais les algorithmes dans leur principe
restent strictement identiques. Idem quand tu travailles avec des
graphes, que tu travailles avec des matrices d'adjacence ou des listes
d'adjacence, l'algorithme de Dijkstra reste l'algorithme de Disjstra.
Idem pour les nuances qu'on peut faire entre itératif et récursif, un
DFS reste un DFS.



Enumerer les cas où les différences sont faibles ne dit pas que
les choses sont identiques.
Dans un tableau, un acces quelconque est en O(1) et une insertion
en O(n), et l'inverse pour les listes.
Si un algo fait autant d'insertion que d'accès, ça donnera la même
chose. De même, s'il fait des acces "en séquence" et pas d'insertion.


et en C encore plus.



De toute façon en C, la notion de liste chainée n'existe pas



Dans la norme C, non. Mais dans les programmes en C, souvent, il y
en a. Idem pour des choses comme "complexité", "performance', etc.

Et puis un jour faudra qu'on discute des réels avantages
des listes chaînées, je trouve ça souvent très couteux (multiples malloc
et free faits séquentiellement).



Si tu veux.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)
Avatar
candide
Jean-Marc Bourguet a écrit :

Mais, c'est ou nos opinions different: ca ne m'aurait jamais rapporte rien
du tout.



Dois-je comprendre tu n'as jamais dû réimplémenter en C une recherche
dichotomique pour des besoins spécifiques ?
Avatar
Jean-Marc Bourguet
candide writes:

Jean-Marc Bourguet a écrit :

> Mais, c'est ou nos opinions different: ca ne m'aurait jamais rapporte rien
> du tout.

Dois-je comprendre tu n'as jamais dû réimplémenter en C une recherche
dichotomique pour des besoins spécifiques ?



Je ne me souviens pas d'une fois ou ce que tu proposes aurais evite de
devoir le faire.

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org
1 2 3 4 5