ユーザー識別子(int)を購入したさまざまな製品の数(int)にマッピングする大規模な(ish - > 100K)コレクションがあります。見つけるために、データをできるだけ効率的に再編成する必要があります異なる数の製品を持っているユーザーの数。たとえば、1 つの製品を持っているユーザーの数、2 つの製品を持っているユーザーの数などです。
元のデータを a から a に逆にすることでこれを達成しstd::map
ました(キーと値が単純に逆になっています)。次に、 N 個の製品を使用しているstd::multimap
ユーザーの数を抽出できます(ただし、値をセットに一意に保存したので、繰り返していた値の正確な数とその順序を確認できます)count(N)
コードは次のようになります。
// 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;
}
これが最も効率的な方法ではないと感じずにはいられません。これを行う賢い方法を知っている人はいますか?
Boost または C++11 を使用してこれを行うことができないという制限があります。
ああ、また、誰かが疑問に思っているかもしれませんが、これは宿題でも面接の質問でもありません.