给具有电影首选项的 N 个用户,检索至少 K 个用户喜欢的电影列表。
找到答案的最有效的[运行时/内存]算法是什么?
如果 N = K 很简单,因为您可以:
(4)在任何其他情况下都是有问题的,因为即使没有交集,仍然存在“潜在”
我曾想创建一个哈希图来“计数”每个电影首选项的交集数量,但这听起来效率很低。尤其是在电影喜好很大的情况下。
有什么想法/提示吗?谢谢。
答案 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)
,但实际上要小得多。