Tengo una colección grande (ish -> 100K) mapeo un identificador de usuario (un int) para el recuento de diferentes productos que han comprado (también un int.) Necesito reorganizar los datos de la manera más eficiente posible para encontrar cuántos usuarios tienen diferentes números de productos. Por ejemplo, cuántos usuarios tienen 1 producto, cuántos usuarios tienen dos productos, etc.Manera eficiente de reordenar una colección basada en mapas C++
He logrado esto invirtiendo los datos originales de std::map
en un std::multimap
(donde la clave y el valor simplemente se invierten). a continuación, puede elegir el número de usuarios que tienen N productos utilizando count(N)
(aunque también almacenan únicamente los valores en un conjunto para poder estar seguro del número exacto de los valores que estaba interactuando sobre y su orden)
Código se ve así:
// uc is a std::map<int, int> containing the original
// mapping of user identifier to the count of different
// products that they've bought.
std::set<int> uniqueCounts;
std::multimap<int, int> cu; // This maps count to user.
for (map<int, int>::const_iterator it = uc.begin();
it != uc.end(); ++it)
{
cu.insert(std::pair<int, int>(it->second, it->first));
uniqueCounts.insert(it->second);
}
// Now write this out
for (std::set<int>::const_iterator it = uniqueCounts.begin();
it != uniqueCounts.end(); ++it)
{
std::cout << "==> There are "
<< cu.count(*it) << " users that have bought "
<< *it << " products(s)" << std::endl;
}
No puedo evitar sentir que esta no es la forma más eficiente de hacerlo. Alguien sabe de un método inteligente de hacer esto?
Estoy limitado en que No puedo usar Boost o C++ 11 para hacer esto.
Ah, también, en caso de que alguien se pregunte, esto no es tarea, ni una pregunta de la entrevista.
¡Maldito! Las grandes mentes piensan igual;) –
"adapte este código para aumentar el tamaño del vector si es necesario" - que en su forma más simple es una línea, 'if (uc.second> = uniqueCounts.size()) uniqueCounts.resize (uc .second + 1); '. Si algunos recuentos son demasiado grandes para un vector (usuarios que han comprado cientos de millones de productos), considere un contenedor disperso como 'map' en lugar del' vector'. –
Supongo que todo se reduce a si necesito los datos intermedios en el multimap (es decir, el recuento de mapeo a la identificación del usuario) No estoy seguro de si lo hago en este momento, pero si no, esto me parece una buena forma de hacerlo. –