【发布时间】:2018-10-16 21:00:32
【问题描述】:
这是一个系统设计问题。
假设我们有一个服务可以在听到歌曲时通知我们。让我们设计一个新服务,它能够返回过去 24 小时内听过最多的 K 首歌曲。假设我们有约 10 亿首歌曲和约 2 亿用户。
将您的答案集中在缓存、数据结构和数据库架构的设计上。
跟进:我们如何按类型区分它?例如。如果我想要过去 24 小时内听摇滚歌曲最多的前 k 名,该怎么办?
真的只是好奇你们会说什么/你们怎么想!不必给出一个超级完美的解决方案,想法也很棒。
【问题讨论】:
-
使用最大堆怎么样?解决方案时间复杂度约为 k log (n),其中
n是歌曲数。 -
如何确保最大堆只存储最近 24 小时的数据?您必须进行某种修剪以不断删除超过 24 小时的歌曲计数,对吗?这将如何运作?
-
也许我们每 24 小时创建一个新的最大堆?问题是,如果有人在当天创建堆后立即询问热门歌曲,他们将不会得到太多结果。由于堆已经完成,也许我们会在那时取昨天的结果。那么你的结果总是有 1 天的时间
-
如果堆是为那一天创建的,为什么我们不能返回它们?
-
假设我们每天上午 12 点创建一个新的(空)堆。然后在接下来的 24 小时内,我们收集当天所需的数据。如果有人在凌晨 1 点请求热门歌曲,在创建新堆之后会发生什么?然后,您只会获得最近一小时请求的热门歌曲。如果您返回昨天的堆,那么您的结果是关闭的并且不包括最后一小时
标签: algorithm sorting database-design system-design