Bonjour Salseropom
multimap::insert ajoute chacun nouveau élément dans la map en fonction du classement de la clé. La recherche de la position correcte est une complexité log donc pas possible d'avoir plus rapide je pense (ref:
http://www.cplusplus.com/reference/stl/multimap/insert/).
De toute façon, la recherche de tous les éléments de la map qui ne sont plus utiles est forcement linéaire (obligation de tester tous les éléments). Ton insertion sera moins pénalisant que la suppression.
PS: 250000 éléments ! Moi qui me croyait pas chanceux avec mes dizaine de milliers d'individus a classer

Dans un espace à combien de dimensions ?
Edit: en fait, il est peut être possible d'éviter l'étape de suppression des paires inutiles...
Puisse que tu t'intéresse à la distance minimale (c'est à dire la première paire de ta map), il te suffit simplement de vérifier que la première paire concernant 2 éléments qui n'ont pas encore été traités. Si c'est le cas, tu supprimes et tu passes à la paire suivante. Sinon tu calcules le barycentre de cette paire.
Pour conserver l'information des éléments déjà traités, tu peux utiliser un simple std::set<int>.
Re-edit: Après le café pour réveiller un peu les neurones...
complexité pour l'étape avec k éléments restant.
* méthode avec std:map
- recherche de la distance minimale : constant (premier de la map)
- ajout de k-1 éléments calculés à partir du barycentre (chaque insertion étant en log() ) : compexité n.log(n)
* méthode avec std:list
- recherche de la distance minimale (sur liste non trié) : complexité linéaire (regarder chaque distance 1 par 1)
- ajout de k-1 éléments (chaque insertion étant de compexité constante) : complexité linéaire.
La suppression des 2k éléments peut se faire à l'étape k-1 lors de la recherche de la distance minimale (complexité constance).
Donc au final, on a une complexité linéaire pour std::list vs une complexité n.log(n) pour std:multimap (pour chaque itération).
Pour l'algorithme complet, on doit faire n-1 itérations avec k éléments à chaque étape, donc un complexité de n², c'est à dire n³ pour std:list et n³.log(n) pour std:multimap... dans tous les cas, ça va être long
Partager