给N个具有电影首选项的用户,检索至少K个用户喜欢的电影列表

时间:2019-05-23 19:49:43

标签: algorithm

给具有电影首选项的 N 个用户,检索至少 K 个用户喜欢的电影列表。

找到答案的最有效的[运行时/内存]算法是什么?

如果 N = K 很简单,因为您可以:

  1. 交集=第一个用户首选项。
  2. 对于其余用户:
  3. 交集=相交(交集,user_i)
  4. 如果路口是空的,那就没有意义了。

(4)在任何其他情况下都是有问题的,因为即使没有交集,仍然存在“潜在”

我曾想创建一个哈希图来“计数”每个电影首选项的交集数量,但这听起来效率很低。尤其是在电影喜好很大的情况下。

有什么想法/提示吗?谢谢。

1 个答案:

答案 0 :(得分:1)

如果您想优化运行时间,那么创建histogram的方法就是一个不错的选择。基本上,运行所有数据,然后运行map:movie->#users。然后,在地图上进行一次迭代即可为您提供k+用户喜欢的电影列表。

这是O(N+k)时间和O(k)的记忆。

请注意,可以使用map-reduce有效地分发此方法。

map:(user,movie)->(movie,1)
reduce:(movie,list<int>)->movie if sum(list)>k else none

如果要使用最少的内存来这样做,则可以按影片名称对数据使用一些就地排序算法。然后,对数据进行迭代,并计算电影重复播放自身的次数(如果大于或等于k,则得出结果)。

这是O(NlogN)运行时,添加的内存最少。

  • 在两种解决方案中,N代表输入大小(条目数),可能为O(n*k),但实际上要小得多。