私は友達のネットワークで最も人気のあるいいねを見つける方法に取り組んでいます。「友達ネットワークで最も人気がある」とは、「友達のいいねが一番多い」と定義されています。
各友達が一意のIDを持ち、いいねされたページがいくつかあるとします。ですから、そのような友達がたくさんいるので、一番好きな友達、そしてこれが好きな友達を見つけたいと思います。基本的には、「友達のX、Y、Zがこれが好き」のようなものを見せたいと思います。
私の最初の解決策は、マップ(逆マッピングを保存するため:like-> set)と優先度付きキュー(上位Nを見つけるため)を使用することです。これが私のアルゴリズムです(C ++ STLを使用):
map< like, set<friend> > like2friendsMap;
for each friend {
for each like {
like2friendsMap[like].insert(friend); //populate the map
}
}
priority_queue< pair<like, int> > pq;
for each like in like2friendsMap {
int count = like2friendsMap[like].size(); //no. of friends who like this or "popularity"
pq.push(like, count); //count is the priority
}
map< like, set<friend> > result
for i in 1 to N { //N is how many popular items I want
result = pq.top(); //gives me the element with highest priority (most popular like)
pq.pop();
}
STLは内部的に赤黒木を使用して優先キューのマップと最小/最大ヒープを実装しているため、このアプローチは私にはかなり速いように思われます。しかし、私に数百人の友達がいて、それぞれに数百人のいいねがあるとしたら、メモリ使用量は膨大になります。もちろん、オブジェクト全体を保存する代わりに、すべての計算にフレンドIDとライクIDを使用する必要があります。これにより、メモリ使用量が大幅に削減されます。
効率を改善する(速度を上げる、メモリを減らす)ために他にどのようなアルゴリズムまたはデータ構造を使用できますか?何らかの理由で、友達のリストをそれぞれのいいねに対して保存することはできません。実行時に計算する必要があります。私はこれをC++を使用して開発しているので、STLまたはブーストを使用するソリューションはさらに優れています。