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
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�?
A+
--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org
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...
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
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
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
Voil� qui confirme ce qu'on a dit tous les 3 ;-)
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.
En effet. Encore merci ᅵ tous les trois, ainsi qu'ᅵ Michel Olagnon.
JLH
"Olivier Miakinen" <om+...@miakinen.net> a ᅵcrit dans le message de
news:4ad2...@meta.neottia.net...
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