在用户社交网络中找到前k个喜欢的内容

时间:2013-10-25 23:31:56

标签: java algorithm graph graph-algorithm

不是家庭作业问题或类似的任何问题。所以,这是一个简单的问题陈述: 你有一堆用户U 1 ,U 2 ,...,U n 。 每个用户都有一组朋友,这是整个用户集的子集。 U 1 - > U 2 ,U 5 ,U 8 ,...,U k

类似地,U 2 可以有朋友U 1 ,U 11 ,...,U k2 。现在有一堆“喜欢”实体L 1 ,L 2 ,L 3 ,......很明显,每个用户都喜欢子集Like对象。所以U 1 - > L 1 ,L 2 ,L 5 ,L 10 ,... U 2 - > L 4 ,L 8 ,L 10 ,......

现在问题是,给定一个像上面这样的网络,给定一个用户ID,我们需要返回HIS网络中的顶级喜欢以及喜欢它的几个朋友(朋友可能没有特定的顺序)。

我的想法: 一个想法是维护用户及其朋友的哈希图。这是全球性的。

User-Friends HashMap

|用户|朋友和他们喜欢的地图|

现在每个用户,我们还将维护他的喜欢的最大堆,按他们在网络中的频率排序。我们需要某种不相交的设置,以及实际的最大堆。当查询进入时,给定一个用户ID,我们从喜欢的堆中检索顶部条目,对于每个类似,我们检索喜欢它的朋友。

总的来说,从数据结构的角度来看,我们正在查看每个用户不相交集的每个用户最大堆的全局散列映射。

这是解决此问题的最佳方法吗?我完全迷失了:(:( 建议多欢迎。我们可以在这里使用最短路径/ bfs / dfs吗?

1 个答案:

答案 0 :(得分:1)

  

现在每个用户,我们还会根据他们在网络中的频率对他的喜欢的最大堆进行排序。

为什么呢?这意味着您不断为每个人提供查询答案,而不仅仅是您被问到的人。因此,对图表的任何更改现在变得更加昂贵,因为您必须更新所有这些堆。加上每个节点的内存占用量,而不是常数,取决于他拥有的朋友数量和他们有多少喜欢。

按照您的描述保留图表,即只是朋友和类似的关系。

然后,当您收到有关用户ID的查询时:

  1. 制作一个散列图。
  2. 对于用户所拥有的每一个,插入到散列图中:L i - > count i (从1开始)。
  3. 对于每个朋友,重复步骤2.如果hashmap中已经存在类似内容,请增加其计数。
  4. 在哈希地图中查找前k个计数。
  5. 返回步骤4中的结果,并销毁计数hashmap。