Mam dużą kolekcję (ish -> 100K) odwzorowującą identyfikator użytkownika (int) na liczbę różnych produktów, które kupił (również int. Muszę ponownie zorganizować dane tak wydajnie, jak to tylko możliwe, aby dowiedzieć się, ilu użytkowników ma różną liczbę produktów. Na przykład, ilu użytkowników ma 1 produkt, ilu użytkowników ma dwa produkty itp.Wydajny sposób na ponowne zamówienie kolekcji opartej na mapach C++
Zrobiłem to poprzez odwrócenie oryginalnych danych z std::map
na std::multimap
(gdzie klucz i wartość są po prostu odwrócone). można wtedy wybrać się liczbę użytkowników mających N produktów wykorzystujących count(N)
(chociaż ja też jednoznacznie zapisane wartości w zestawie, więc mogłem być pewny dokładnej liczby wartości byłem iteracji nad i ich kolejność)
Code wygląda tak:
// 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;
}
Po prostu nie mogę oprzeć się wrażeniu, że nie jest to najskuteczniejszy sposób na zrobienie tego. Ktoś wie o sprytnej metodzie robienia tego?
jestem ograniczony w tym Nie mogę korzystać podwyższenie lub C++ 11 to zrobić.
O, na wypadek gdyby ktoś się zastanawiał, to nie jest praca domowa ani pytanie do wywiadu.
Cholerny! Wielkie umysły myślą podobnie;) –
"zaadaptuj ten kod, aby zwiększyć rozmiar wektora, jeśli jest to wymagane" - co w najprostszym jest jednym wierszem, 'if (uc.second> = uniqueCounts.size()) uniqueCounts.resize (uc .second + 1); '. Jeśli niektóre liczby są zbyt duże dla wektora (użytkownicy, którzy kupili setki milionów produktów?), Rozważmy rzadki kontener, taki jak "map" zamiast "wektora". –
Przypuszczam, że sprowadza się to do tego, czy potrzebuję danych intermedialnych w multimapie (tj. Liczba odwzorowań do identyfikatora użytkownika). Nie jestem pewien, czy robię to w danej chwili, ale jeśli nie, wydaje się, że to dobry sposób. –