Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Garder les N meilleurs

0 views
Skip to first unread message

Olivier Miakinen

unread,
Oct 11, 2009, 9:32:10 AM10/11/09
to
Bonjour,

J'ai un petit algorithme ᅵ ᅵcrire, et je ne sais pas comment le faire
pour qu'il soit efficace.


Voilᅵ. J'ai une liste ordonnᅵe d'objets possᅵdant plusieurs attributs
(ou propriᅵtᅵs, ou variables, je ne sais pas quel est le terme le plus
appropriᅵ), dont un nombre qui s'appelle ᅵ score ᅵ. Les objets ne sont
pas triᅵs par score, et plusieurs objets peuvent avoir le mᅵme score.

Je voudrais extraire de la liste N objets ayant les meilleurs scores.
En d'autres termes, je voudrais qu'il existe un score S tel que les N
objets choisis aient tous un score >= S, et que tous les objets non
choisis aient un score <= S. Parmi les objets de score ᅵgal ᅵ S s'il y
en a plusieurs, peu importe lesquels sont choisis et lesquels sont ᅵliminᅵs.

Pour fixer les idᅵes, je devrais avoir quelques milliers d'objets au
total avant extraction de N d'entre eux, avec N aux alentours de 100.


Variante, dans le cas favorable oᅵ les objets ne sont pas donnᅵs ᅵ
l'avance : je construis les objets un ᅵ un et les place dans une liste.
Aprᅵs avoir construit les N premiers objets, pour chaque nouvel objet
je peux calculer le score avant d'avoir tout construit. Je peux donc
dᅵcider d'arrᅵter de le construire si son score est infᅵrieur ou ᅵgal ᅵ
ceux des N dᅵjᅵ dans la liste, ou au contraire le terminer, l'ajouter ᅵ
la liste, et supprimer l'un de ceux qui ont le plus petit score.


Auriez-vous des idᅵes pour traiter ces deux cas, ou simplement des
critᅵres de recherche pour trouver les algos correspondants sur la
toile via un moteur de recherche ?

Cordialement,
--
Olivier Miakinen

Mehdi Tibouchi

unread,
Oct 11, 2009, 9:56:30 AM10/11/09
to
Olivier Miakinen wrote in message <4ad1...@meta.neottia.net>:

>
> Je voudrais extraire de la liste N objets ayant les meilleurs scores.
> En d'autres termes, je voudrais qu'il existe un score S tel que les N
> objets choisis aient tous un score >= S, et que tous les objets non
> choisis aient un score <= S. Parmi les objets de score �gal � S s'il y
> en a plusieurs, peu importe lesquels sont choisis et lesquels sont �limin�s.
>
> Pour fixer les id�es, je devrais avoir quelques milliers d'objets au

> total avant extraction de N d'entre eux, avec N aux alentours de 100.

Pour ces ordres de grandeur, � moins que la m�moire soit extr�mement
contrainte, il me semble que l'algorithme consistant � trier puis prendre
les N premiers est largement assez efficace, non�? (Pas besoin de faire
de copie bien s�r�--�il est possible par exemple de trier une liste de
couples (score, r�f�rence sur l'objet correspondant)).

> Variante, dans le cas favorable o� les objets ne sont pas donn�s �
> l'avance : je construis les objets un � un et les place dans une liste.
> Apr�s avoir construit les N premiers objets, pour chaque nouvel objet


> je peux calculer le score avant d'avoir tout construit. Je peux donc

> d�cider d'arr�ter de le construire si son score est inf�rieur ou �gal �
> ceux des N d�j� dans la liste, ou au contraire le terminer, l'ajouter �


> la liste, et supprimer l'un de ceux qui ont le plus petit score.

Faire exactement �a, mais en rangeant les objets construits dans un arbre
binaire de recherche plut�t qu'une liste�?

Jean-Marc Bourguet

unread,
Oct 11, 2009, 10:41:01 AM10/11/09
to

Un tas (celui du heap sort) tri� de sorte que sa t�te soit le plus petit
�l�ment dans lequel tu ne laisses que N �l�ments. Tu enl�ves la t�te et tu
ajoutes le nouvel �l�ment si il est plus grand que la t�te.

A+

--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

zwim

unread,
Oct 11, 2009, 6:39:52 PM10/11/09
to
Le Sun, 11 Oct 2009 15:56:30 +0200
Mehdi Tibouchi a �crit
>Olivier Miakinen wrote in message <4ad1...@meta.neottia.net>:
>>
>> Je voudrais extraire de la liste N objets ayant les meilleurs scores.
>> En d'autres termes, je voudrais qu'il existe un score S tel que les N
>> objets choisis aient tous un score >= S, et que tous les objets non
>> choisis aient un score <= S. Parmi les objets de score �gal � S s'il y
>> en a plusieurs, peu importe lesquels sont choisis et lesquels sont �limin�s.
>>
>> Pour fixer les id�es, je devrais avoir quelques milliers d'objets au
>> total avant extraction de N d'entre eux, avec N aux alentours de 100.
>
>Pour ces ordres de grandeur, � moins que la m�moire soit extr�mement
>contrainte, il me semble que l'algorithme consistant � trier puis prendre
>les N premiers est largement assez efficace, non�? (Pas besoin de faire
>de copie bien s�r�--�il est possible par exemple de trier une liste de
>couples (score, r�f�rence sur l'objet correspondant)).

A priori pas besoin de trier enti�rement, par exemple quicksort est un
algo � pivot qui range les �l�ments plus grands que le pivot dans une
premi�re partie de tableau et le reste dans la seconde moiti�.

Donc en appliquant un quicksort partiel, on devrait se retrouver assez
vite avec N �l�ments en d�but de tableau plus grands que le reste.

>> Variante, dans le cas favorable o� les objets ne sont pas donn�s �
>> l'avance : je construis les objets un � un et les place dans une liste.
>> Apr�s avoir construit les N premiers objets, pour chaque nouvel objet
>> je peux calculer le score avant d'avoir tout construit. Je peux donc
>> d�cider d'arr�ter de le construire si son score est inf�rieur ou �gal �
>> ceux des N d�j� dans la liste, ou au contraire le terminer, l'ajouter �
>> la liste, et supprimer l'un de ceux qui ont le plus petit score.
>
>Faire exactement �a, mais en rangeant les objets construits dans un arbre
>binaire de recherche plut�t qu'une liste�?

--
zwim.
Rien n'est impossible que la mesure de la volont� humaine...

Olivier Miakinen

unread,
Oct 11, 2009, 6:58:09 PM10/11/09
to
Bonjour Mehdi,

Le 11/10/2009 15:56, Mehdi Tibouchi a ᅵcrit :
>>
>> Pour fixer les idᅵes, je devrais avoir quelques milliers d'objets au


>> total avant extraction de N d'entre eux, avec N aux alentours de 100.
>

> Pour ces ordres de grandeur, ᅵ moins que la mᅵmoire soit extrᅵmement
> contrainte, il me semble que l'algorithme consistant ᅵ trier puis prendre


> les N premiers est largement assez efficace, non ? (Pas besoin de faire

> de copie bien sᅵr -- il est possible par exemple de trier une liste de
> couples (score, rᅵfᅵrence sur l'objet correspondant)).

La mᅵmoire n'est pas trᅵs contrainte, non. Je n'avais pas pensᅵ ᅵ la
possibilitᅵ de trier des rᅵfᅵrences au lieu des objets eux-mᅵmes : il
faut dire que je n'ai jamais eu ce genre de besoin. En tout cas, ᅵa me
semble une trᅵs bonne idᅵe.

>> Variante, dans le cas favorable oᅵ les objets ne sont pas donnᅵs ᅵ

>> l'avance : [...]
>
> Faire exactement ᅵa, mais en rangeant les objets construits dans un arbre
> binaire de recherche plutᅵt qu'une liste ?

Je pourrais faire ᅵa dans un second temps, si je le code en C ou en C++.

Mais dans un premier temps je le fais en PHP, et j'aime autant utiliser
les fonctions dᅵjᅵ codᅵes en C, pour des raisons de performances. Or je
ne vois pas de gestion d'arbre binaire dans les fonctions de base.

Merci en tout cas pour les idᅵes !
--
Olivier Miakinen

Olivier Miakinen

unread,
Oct 11, 2009, 7:02:57 PM10/11/09
to
Le 11/10/2009 16:41, Jean-Marc Bourguet a ᅵcrit :
> Un tas (celui du heap sort) triᅵ de sorte que sa tᅵte soit le plus petit
> ᅵlᅵment dans lequel tu ne laisses que N ᅵlᅵments. Tu enlᅵves la tᅵte et tu
> ajoutes le nouvel ᅵlᅵment si il est plus grand que la tᅵte.

Je ne connais pas ce tri (d'ailleurs je n'en connais aucun ᅵ vrai dire)
mais j'ai commencᅵ ᅵ lire <http://fr.wikipedia.org/wiki/Tri_par_tas>
pour essayer de comprendre.

Merci !
--
Olivier Miakinen

Olivier Miakinen

unread,
Oct 11, 2009, 7:06:42 PM10/11/09
to
Le 12/10/2009 00:39, zwim a ᅵcrit :
>
> A priori pas besoin de trier entiᅵrement, par exemple quicksort est un
> algo ᅵ pivot qui range les ᅵlᅵments plus grands que le pivot dans une
> premiᅵre partie de tableau et le reste dans la seconde moitiᅵ.

>
> Donc en appliquant un quicksort partiel, on devrait se retrouver assez
> vite avec N ᅵlᅵments en dᅵbut de tableau plus grands que le reste.

Oui, ᅵa semble assez prometteur, et je vais lire aussi la page sur le
tri rapide <http://fr.wikipedia.org/wiki/Tri_rapide>.

Merci ᅵ toi !
--
Olivier Miakinen

zwim

unread,
Oct 11, 2009, 7:31:15 PM10/11/09
to
Le Sun, 11 Oct 2009 15:32:10 +0200
Olivier Miakinen a �crit
>Bonjour,
>
>J'ai un petit algorithme � �crire, et je ne sais pas comment le faire

>pour qu'il soit efficace.
>
>
>Voil�. J'ai une liste ordonn�e d'objets poss�dant plusieurs attributs
>(ou propri�t�s, ou variables, je ne sais pas quel est le terme le plus
>appropri�), dont un nombre qui s'appelle � score �. Les objets ne sont
>pas tri�s par score, et plusieurs objets peuvent avoir le m�me score.

>
>Je voudrais extraire de la liste N objets ayant les meilleurs scores.
>En d'autres termes, je voudrais qu'il existe un score S tel que les N
>objets choisis aient tous un score >= S, et que tous les objets non
>choisis aient un score <= S. Parmi les objets de score �gal � S s'il y
>en a plusieurs, peu importe lesquels sont choisis et lesquels sont �limin�s.
>
>Pour fixer les id�es, je devrais avoir quelques milliers d'objets au

>total avant extraction de N d'entre eux, avec N aux alentours de 100.
>
>
>Variante, dans le cas favorable o� les objets ne sont pas donn�s �
>l'avance : je construis les objets un � un et les place dans une liste.
>Apr�s avoir construit les N premiers objets, pour chaque nouvel objet

>je peux calculer le score avant d'avoir tout construit. Je peux donc
>d�cider d'arr�ter de le construire si son score est inf�rieur ou �gal �
>ceux des N d�j� dans la liste, ou au contraire le terminer, l'ajouter �

>la liste, et supprimer l'un de ceux qui ont le plus petit score.
>
>
>Auriez-vous des id�es pour traiter ces deux cas, ou simplement des
>crit�res de recherche pour trouver les algos correspondants sur la

>toile via un moteur de recherche ?
>
>Cordialement,

Voil� qui confirme ce qu'on a dit tous les 3 ;-)

http://stackoverflow.com/questions/814186/c-efficient-algorithm-to-find-greatest-m-elements-in-an-n-x-n-matrix

Michel Olagnon

unread,
Oct 12, 2009, 4:55:44 AM10/12/09
to
zwim wrote:
> Le Sun, 11 Oct 2009 15:56:30 +0200
> Mehdi Tibouchi a �crit
>
>>Olivier Miakinen wrote in message <4ad1...@meta.neottia.net>:
>>
>>>Je voudrais extraire de la liste N objets ayant les meilleurs scores.
>>>En d'autres termes, je voudrais qu'il existe un score S tel que les N
>>>objets choisis aient tous un score >= S, et que tous les objets non
>>>choisis aient un score <= S. Parmi les objets de score �gal � S s'il y
>>>en a plusieurs, peu importe lesquels sont choisis et lesquels sont �limin�s.
>>>
>>>Pour fixer les id�es, je devrais avoir quelques milliers d'objets au
>>>total avant extraction de N d'entre eux, avec N aux alentours de 100.
>>
>>Pour ces ordres de grandeur, � moins que la m�moire soit extr�mement
>>contrainte, il me semble que l'algorithme consistant � trier puis prendre
>>les N premiers est largement assez efficace, non ? (Pas besoin de faire
>>de copie bien s�r -- il est possible par exemple de trier une liste de
>>couples (score, r�f�rence sur l'objet correspondant)).
>
>
> A priori pas besoin de trier enti�rement, par exemple quicksort est un
> algo � pivot qui range les �l�ments plus grands que le pivot dans une
> premi�re partie de tableau et le reste dans la seconde moiti�.
>
> Donc en appliquant un quicksort partiel, on devrait se retrouver assez
> vite avec N �l�ments en d�but de tableau plus grands que le reste.
>

C'est en effet ce que je fais.
http://www.fortran-2000.com/rank/index.html

>
>>>Variante, dans le cas favorable o� les objets ne sont pas donn�s �
>>>l'avance : je construis les objets un � un et les place dans une liste.
>>>Apr�s avoir construit les N premiers objets, pour chaque nouvel objet
>>>je peux calculer le score avant d'avoir tout construit. Je peux donc
>>>d�cider d'arr�ter de le construire si son score est inf�rieur ou �gal �
>>>ceux des N d�j� dans la liste, ou au contraire le terminer, l'ajouter �
>>>la liste, et supprimer l'un de ceux qui ont le plus petit score.
>>
>>Faire exactement �a, mais en rangeant les objets construits dans un arbre
>>binaire de recherche plut�t qu'une liste ?
>
>

N aux alentours de 100 me parait un peu eleve pour appliquer ce genre
de methode, qui ressemble a un tri insertion incomplet, que j'aurais plutot
vu meilleur seulement pour N inferieur a 20 ou moins encore.

Olivier Miakinen

unread,
Oct 12, 2009, 5:42:50 AM10/12/09
to
Le 12/10/2009 01:31, zwim m'a rᅵpondu :
>
> Voilᅵ qui confirme ce qu'on a dit tous les 3 ;-)
>
> http://stackoverflow.com/questions/814186/c-efficient-algorithm-to-find-greatest-m-elements-in-an-n-x-n-matrix

En effet. Encore merci ᅵ tous les trois, ainsi qu'ᅵ Michel Olagnon.

JLH974

unread,
Oct 19, 2009, 12:12:11 PM10/19/09
to
Bonsoir ᅵ tous
Juste un point qui peut sembler secondaire mais j'adore couper les cheveux
en 2^10 ;-)
Sᅵlectionner les N meilleurs peut dᅵboucher sur un problᅵme insoluble
surtout si on prᅵcise que plusieurs "candidats" peuvent avoir le mᅵme score.
Le tri par ordre classe les "candidats" par ordre dᅵcroissant et le
programme doit sᅵlectionner tous les candidats ayant le mᅵme rang.
Pour prendre un exemple plus parlant : Soit ᅵ sᅵlectionner les 4 meilleurs
scores parmi un ensemble composᅵ de :
1 candidat ayant le score 100 (par exemple)
2 candidats ayant le score 80
3 candidats ayant le score 70
Et lᅵ... catastrophe...
En conclusion : si on veut sᅵlectionner N meilleurs scores dans un ensemble
oᅵ plusieurs candidats peuvent avoir le mᅵme score, il faut obligatoirement
un autre critᅵre pour dᅵpartager les ex-aequo

JLH

"Olivier Miakinen" <om+...@miakinen.net> a ᅵcrit dans le message de
news:4ad2...@meta.neottia.net...

Olivier Miakinen

unread,
Oct 19, 2009, 12:29:24 PM10/19/09
to
Bonjour,

Le 19/10/2009 18:12, JLH974 a ᅵcrit :


>
> Juste un point qui peut sembler secondaire

> [...]

Tu m'as dᅵjᅵ fait cette remarque par courriel privᅵ, et je t'ai
dᅵjᅵ signalᅵ que j'y avais rᅵpondu par anticipation dans l'article
d'origine... ;-)

Cordialement,
--
Olivier Miakinen

0 new messages