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

Version la plus rapide

16 réponses
Avatar
Michaël Delva
Bonsoir à tous,

une petite question sur la version de ce code qui vous paraît être la
plus rapide, ou du moins celle que vous utiliseriez. Ce code permet
d'éviter les doublons dans une liste:

//-----------------------------------------------------------------------

int nbre_noeuds = XML->GetCount();

if (nbre_noeuds > 0)
{
std::vector<AnsiString> liste_strategies(nbre_noeuds);
XML->Push(0);
for (int i=0; i < nbre_noeuds; i++)
{
XML->Modify(i);
liste_strategies[i] = XML->GetAttr("Nom");
}

std::sort(liste_strategies.begin(),liste_strategies.end());
std::vector<AnsiString>::iterator p = std::unique
(liste_strategies.begin(),liste_strategies.end());
liste_strategies.erase(p,liste_strategies.end());
}

//-----------------------------------------------------------------------

Ou bien

//-----------------------------------------------------------------------

int nbre_noeuds = XML->GetCount();

if (nbre_noeuds > 0)
{
std::set<AnsiString> liste_strategies;
XML->Push(0);
for (int i=0; i < nbre_noeuds; i++)
{
XML->Modify(i);
liste_strategies.insert(XML->GetAttr("Nom"));
}
}

//-----------------------------------------------------------------------

Je me posais la question car cet article ne conseille vraiment pas
d'utiliser les std::set...

http://www.lafstern.org/matt/col1.pdf

Merci d'avance!!

Et bonne nuit pour ceux qui dorment pas ;-)

6 réponses

1 2
Avatar
Fabien LE LEZ
On 03 Mar 2004 21:51:52 GMT, "Michaël Delva"
wrote:

Bon ben merci


De rien, Mich ;-)

--
;-)

Avatar
Michel Michaud
Dans news:, Michaël
Mais je pensais vraiment qu'insérer directement dans un set était
quand même plus rapide que 3 opérations: sort,unique,erase...


Quicksort est vraiment étonnamment rapide (toute proportion gardée).
Si l'insertion dans un arbre balancé (ce qu'est normalement un
std::set) était si rapide, on s'en servirait plutôt que les
algorithmes de tri courants : on s'en sert parfois, mais pas pour
trier des données ordinaires en mémoire. Il ne faut pas oublier
tout ce qu'il faut faire pour maintenir un arbre. Et un arbre
balancé, c'est pire.

D'autres ont continué la discussion sur cet aspect. Je voulais
simplement ajouter dire que la méthode la plus rapide, s'il s'agit
simplement d'enlever les doublons, est probablement l'emploi
d'une table de hachage. Je me demande d'ailleurs si, dans peu
de temps, tu ne serais pas revenu avec une question sur la
recherche dans ton vecteur. Ne pas oublier que dans un vecteur
trié la recherche (binaire) est O(log N), alors que dans une
table de hachage, on peut avoir O(1) ! Le seul défaut avec la
table de hachage, c'est que les données ne sont pas en ordre.
Mais c'est bien moins souvent nécessaire qu'on peut le croire.

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
kanze
"Michaël Delva" wrote in message
news:...
"Michel Michaud" wrote in news:VUb1c.13844$qA2.646611
@news20.bellglobal.com:
Dans news:, Michaël
une petite question sur la version de ce code qui vous paraît être
la plus rapide, ou du moins celle que vous utiliseriez. Ce code
permet d'éviter les doublons dans une liste:


[Comparaison d'utilisation de sort+unique vs un set]

En principe, utiliser un set pour mettre des données en ordre est
plus lent que trier un vecteur (par un bon algo évidemment). Donc si
tu as peu de doublons, la méthode du tri suivi de unique sera
certainement plus rapide. Par contre, si tu as très peu de données
et beaucoup de doublons ça pourrait être plus rapide de passer par
set car il y aura moins de manipulations (copie) de données, mais ça
dépendra aussi de la taille de tes données....

Où se situe le point où une méthode sera meilleure que l'autre ? Ça
dépend de trop de facteurs pour qu'on puisse le dire. Mon impression
(comme tu parles de XML et que tu manipules des strings que je
suppose pas trop longue), c'est que tu auras assez de données pour
que sort/unique soit toujours mieux.


Effectivement c'est le cas... Je vais donc garder cette méthode. Mais
je pensais vraiment qu'insérer directement dans un set était quand
même plus rapide que 3 opérations: sort,unique,erase...


Ce n'est pas une opération comparée à trois opérations. Dans les deux
cas, tu as N insertions. Or, une insertion dans un set est bien plus
chère qu'une insertion dans un vector. D'une part, l'insertion dans le
vector est O(1), l'insertion dans un set O(ln N). Mais j'imagine que la
plupart du temps, c'est plutôt la différence dans les constantes qui va
faire la différence -- dans le cas de vector, la plupart du temps, une
insertion n'est que l'incrémentation d'un pointeur et la copie de
l'objet, tandis que dans le cas de set, il y a une allocation dynamique
de la mémoire à chaque coup. Sur une machine moderne, la localité joue
aussi un rôle -- le fait que les éléments dans un set sont éparpillés
partout dans la mémoire risque d'augmenter les cache misses, voir les
page faults.

Alors, toutes ces différences fait que dans les faits, on risque de
gagner assez sur les insertions pour pouvoir se payer un coup de sort,
unique et erase. Au moins que la copie et l'échange (swap) des éléments
soit très, très cher.

Comme quoi...


Comme quoi, il n'y a que les mésures qui diront la vérité. Mais à mon
avis, ce n'est pas la peine de faire tant de travail (pour faire les
mésures, etc.) avant de savoir si tu as un problème. J'utiliserai
probablement set, simplement parce que ça me donne le résultat voulu
« automatiquement », sans que je me soucis des opérations
supplémentaires à la fin.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16



Avatar
Michaël Delva
"Michel Michaud" wrote in news:Pkv1c.16646$qA2.873990
@news20.bellglobal.com:

Quicksort est vraiment étonnamment rapide (toute proportion gardée).
Si l'insertion dans un arbre balancé (ce qu'est normalement un
std::set) était si rapide, on s'en servirait plutôt que les
algorithmes de tri courants : on s'en sert parfois, mais pas pour
trier des données ordinaires en mémoire. Il ne faut pas oublier
tout ce qu'il faut faire pour maintenir un arbre. Et un arbre
balancé, c'est pire.

D'autres ont continué la discussion sur cet aspect. Je voulais
simplement ajouter dire que la méthode la plus rapide, s'il s'agit
simplement d'enlever les doublons, est probablement l'emploi
d'une table de hachage. Je me demande d'ailleurs si, dans peu
de temps, tu ne serais pas revenu avec une question sur la
recherche dans ton vecteur. Ne pas oublier que dans un vecteur
trié la recherche (binaire) est O(log N), alors que dans une
table de hachage, on peut avoir O(1) ! Le seul défaut avec la
table de hachage, c'est que les données ne sont pas en ordre.
Mais c'est bien moins souvent nécessaire qu'on peut le croire.



Problème: je ne sais pas ce qu'est une table de hachage ;-)

Avatar
Michel Michaud
Dans news:, Michaël
Problème: je ne sais pas ce qu'est une table de hachage ;-)


Si tu ne sais pas ce qu'est une table de hachage alors je dirais
sérieusement (sans t'insulter) que tu n'es pas assez compétent
en général pour être à l'étape de te poser des questions de
performance entre X et Y. Il y a très certainement des endroits
de ton code où les différences entre ce que tu sais faire et ce
que tu devrais faire seront bien plus importantes que les
différences de vitesse en deux méthodes de même ordre...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Michaël Delva
"Michel Michaud" wrote in news:nVD1c.16994$qA2.970139
@news20.bellglobal.com:

Dans news:, Michaël
Problème: je ne sais pas ce qu'est une table de hachage ;-)


Si tu ne sais pas ce qu'est une table de hachage alors je dirais
sérieusement (sans t'insulter) que tu n'es pas assez compétent
en général pour être à l'étape de te poser des questions de
performance entre X et Y. Il y a très certainement des endroits
de ton code où les différences entre ce que tu sais faire et ce
que tu devrais faire seront bien plus importantes que les
différences de vitesse en deux méthodes de même ordre...



Curieusement, c'est l'idée que je me suis faite tout au long de cette
discussion... ;-)
Et heureusement pour toi, sinon je l'aurai pris comme une insulte!! ;-)


1 2