【发布时间】:2012-09-09 12:10:34
【问题描述】:
我正在努力寻找在我的朋友网络中最受欢迎的点赞。 “在我的朋友网络中最受欢迎”被定义为“我的朋友喜欢的次数最多”。
假设每个朋友都有一个唯一的 id 并且有许多喜欢的页面。所以,给定一组这样的朋友,我想找出点赞最多的朋友,以及也喜欢这个东西的朋友。本质上,我想展示“你的朋友 X、Y 和 Z 喜欢这个”之类的内容。
我的第一个解决方案是使用 Map(用于存储反向映射:like->set)和 Priority Queue(用于查找前 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 在内部使用红黑树来实现映射,并为优先级队列使用最小/最大堆,这种方法对我来说似乎很快。但是如果我有 100 个朋友,每个人都有 100 个喜欢,那么内存使用量会很大。当然,我应该使用朋友 id 和点赞 id 进行所有计算,而不是存储整个对象,这会大大减少内存使用量。
还有哪些算法或数据结构可以用来提高效率(提高速度,减少内存)?出于某种原因,我无法针对每个喜欢存储朋友列表,它必须在运行时计算。我正在使用 C++ 进行开发,因此使用 STL 或 boost 的解决方案会更好。
【问题讨论】:
-
即使是一千个有一千个赞的朋友也只是一百万个赞。今天,计算机可以处理数十亿个对象。
-
也就是说,这通常是我在 SQL 中执行的操作。数据库可以处理数十亿行,而这种分组是 SQL 的生计。
-
@MSalters 问题是它可以在大约 100 个线程中并行运行,因此减少内存占用是一个显着的好处。
标签: c++ algorithm stl popularity top-n