Tengo una estructura de datos de la siguiente manera:Cómo conseguir un subvector resuelto de un vector ordenado, rápido
struct X {
float value;
int id;
};
un vector de las personas (tamaño N (piensa 100000), ordenados por valor (se mantiene constante durante la ejecución del programa):
std::vector<X> values;
Ahora, quiero escribir una función
void subvector(std::vector<X> const& values,
std::vector<int> const& ids,
std::vector<X>& out /*,
helper data here */);
que llena el cabo parámetro con un subconjunto ordenada de valores, dada por los pasaron ids (tamaño M < N (alrededor de 0,8 veces N)), rápido (la memoria no es un problema, y esto se hará de forma repetida, por lo que construir tablas de consulta (como datos auxiliares desde los parámetros de la función) u otra cosa que se haga una sola vez es completamente correcto).
Mi solución hasta el momento:
Build LookupTable LUT contiene Identificación del -> desplazamiento en valores (preparación, tiempo de ejecución de modo constante)
crear std::vector<X> tmp
, tamaño N, lleno de ids no válidos (lineal en N)
para cada ID, copia values[lut[id]]
-tmp[lut[id]]
(lineal en M)
bucle sobre tmp, copiar elementos a cabo (lineal en N)
esto es lineal en N (ya que es más grande que M), pero la variable temporal y repetidos me errores de copia. ¿Hay alguna manera de hacerlo más rápido que esto? Tenga en cuenta que M estará cerca de N, así que las cosas que son O (M registro N) son desfavorables.
Edit: http://ideone.com/xR8Vp es una implementación de ejemplo del algoritmo mencionado, para hacer que el resultado deseado sea claro y demostrar que es factible en tiempo lineal; la pregunta es sobre la posibilidad de evitar la variable temporal o acelerarla de alguna otra manera, algo que no es lineal no es más rápido :).
¿Y cuál es el propósito de ese 'tmp'? ¿De dónde vino en primer lugar? ¿Por qué no estás construyendo tu salida directamente en 'out' sin intermedios intermedios? – AnT
Además, lo que intentas construir no está bien descrito en tu pregunta. Inicialmente, pareces decir que necesitas una salida de tamaño 'M'. Sin embargo, su algoritmo intenta generar una salida de tamaño 'N' en todos los casos. Entonces, ¿qué es lo que estás tratando de obtener en 'out' array una vez que todo está hecho? – AnT
con respecto a "de dónde viene tmp" - lo creé. con respecto a "por qué no lo estoy construyendo en 'out' directamente" - no sé dónde colocar el elemento de antemano, no sé la posición en el subvector. y no, mi salida es de tamaño 'M', solo es lineal en N porque pruebo cada elemento en tmp. y sí, los valores de 'id' son únicos. – etarion