【问题标题】:Design a service to calculate the top k listened to songs in past 24 hrs设计一个服务来计算过去 24 小时内听过的前 k 首歌曲
【发布时间】: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


【解决方案1】:

您似乎想获得听过的前 k 首歌曲

您应该考虑 Misra Gries 算法 Misra gries

它保留了 k 个元素的数组及其估计值,对您而言重要的是它保留了流中最频繁的 k 个元素(您的通知歌曲列表)

【讨论】:

    【解决方案2】:

    这通常看起来像推荐系统设计。

    Recommender systems

    您可以简单地认为堆算法使用 maxheap 来检索最后 k 个元素并通过构建复杂的约束来增强。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-13
      • 2022-09-24
      • 1970-01-01
      • 2017-11-12
      • 2012-05-10
      • 1970-01-01
      相关资源
      最近更新 更多