Si desea asociar un valor con un índice y encontrar el índice rápidamente, puede usar std::map
o std::unordered_map
. También puede combinarlos con otras estructuras de datos (por ejemplo, std::list
o std::vector
) dependiendo de las otras operaciones que desee realizar en los datos.
Por ejemplo, al crear el vector también creamos una tabla de búsqueda:
vector<int> test(test_size);
unordered_map<int, size_t> lookup;
int value = 0;
for(size_t index = 0; index < test_size; ++index)
{
test[index] = value;
lookup[value] = index;
value += rand()%100+1;
}
ahora para buscar el índice simplemente:
size_t index = lookup[find_value];
El uso de una estructura de datos basada en la tabla hash (por ejemplo, the unordered_map) es una compensación de espacio/tiempo bastante clásica y puede superar la realización de una búsqueda binaria para este tipo de operación de búsqueda "inversa" cuando necesite hacer muchas búsquedas. La otra ventaja es que también funciona cuando el vector no está ordenado.
Para la diversión :-) He hecho una referencia rápida en comparación VS2012RC código binario de búsqueda de James con una búsqueda lineal y con el uso de unordered_map para la búsqueda, todo en un vector:
A ~ 50000 elementos unordered_set significativamente (x3-4) supera la búsqueda binaria que exhibe el comportamiento esperado O (log N), el resultado algo sorprendente es que unordered_map pierde su comportamiento O (1) más allá de 10000 elementos, presumiblemente debido a colisiones hash, tal vez una implementación problema.
EDITAR: max_load_factor() para el mapa desordenado es 1 por lo que no debería haber colisiones. La diferencia en el rendimiento entre la búsqueda binaria y la tabla hash para vectores muy grandes parece estar relacionada con el almacenamiento en caché y varía según el patrón de búsqueda en el punto de referencia.
Choosing between std::map and std::unordered_map habla de la diferencia entre los mapas ordenados y desordenados.
¿esto incluso compila? – Ulterior
@Ulterior: Sí, es copia-pasta de mi biblioteca CxxReflect. Ver [algorithm.hpp] (http://cxxreflect.codeplex.com/SourceControl/changeset/view/8ffbb562ad38#cxxreflect%2fcore%2falgorithm.hpp). –
¿Por qué no compilaría? No veo evidencia de error. – Puppy