J'ai une structure de données comme ceci:Comment obtenir un sous-vecteur TRIES d'un vecteur Sorted, rapide
struct X {
float value;
int id;
};
un vecteur de ceux (taille N (pensez 100000), triées par valeur (reste constante pendant l'exécution du programme):
std::vector<X> values;
maintenant, je veux écrire une fonction
void subvector(std::vector<X> const& values,
std::vector<int> const& ids,
std::vector<X>& out /*,
helper data here */);
qui remplit le sur paramètre avec un sous-ensemble de classement de valeurs, donné par les passés ids (taille M < N (environ 0,8 fois N)), rapide (la mémoire n'est pas un problème, et cela sera fait à plusieurs reprises, donc la construction de lookuptables (les données d'aide à partir des paramètres de la fonction) ou quelque chose d'autre qui est fait qu'une seule fois est entièrement ok).
Ma solution à ce jour:
Construire LookupTable LUT contenant id -> décalage dans valeurs (préparation, exécution de manière constante)
créer std::vector<X> tmp
, la taille N, rempli d'ids invalides (linéaire en N)
pour chaque id, copier values[lut[id]]
-tmp[lut[id]]
(linéaire en M)
boucle sur tmp, copie des articles à sur (linéaire N)
c'est linéaire dans N (comme il est plus grand que M), mais la variable temporaire et des bugs de copie répétées me. Y a-t-il un moyen de le faire plus rapidement que cela? Notez que M sera proche de N, donc les choses qui sont O (M journal N) sont défavorables.
Edit: http://ideone.com/xR8Vp est un exemple d'implémentation de l'algorithme mentionné, pour rendre la sortie désirée claire et prouver qu'elle est faisable en temps linéaire - la question est sur la possibilité d'éviter la variable temporaire ou de l'accélérer d'une autre manière, quelque chose qui n'est pas linéaire n'est pas plus rapide :).
Et quel est le but de ce 'tmp'? D'où vient-il en premier lieu? Pourquoi ne construisez-vous pas votre sortie directement dans 'out' sans temporaires intermédiaires? – AnT
En outre, ce que vous essayez de construire n'est pas bien décrit dans votre question. Au départ, vous semblez dire que vous avez besoin d'une sortie de taille «M». Pourtant, votre algorithme tente de construire une sortie de taille «N» dans tous les cas. Alors, qu'est-ce que vous essayez d'obtenir dans le tableau 'out' après tout est fait? – AnT
concernant "d'où vient tmp" - je l'ai créé. concernant "pourquoi ne suis-je pas en train de le construire directement" - je ne sais pas où placer l'élément à l'avance, je ne connais pas la position dans le sous-directeur. et non, ma sortie est de taille M, elle est seulement linéaire dans N car je teste chaque élément dans tmp. et oui, les valeurs 'id' sont uniques. – etarion