Algorithm 设计一个服务来计算过去24小时内听过的前k首歌曲

Algorithm 设计一个服务来计算过去24小时内听过的前k首歌曲,algorithm,sorting,database-design,system-design,Algorithm,Sorting,Database Design,System Design,这是一个系统设计问题 假设我们有一个服务,可以在听到歌曲时通知我们。让我们设计一个新的服务,能够返回过去24小时内收听最多的K首歌曲。假设我们有约10亿首歌曲和约2亿用户 回答的重点是缓存、数据结构和数据库模式的设计 跟进:我们怎样才能按体裁来区分它?例如,如果我想要在过去24小时内听摇滚歌曲最多的前k名怎么办 真的很好奇你们会说什么/你们会怎么想!不必给出一个超级完美的解决方案,想法也很好 看来你想获得前k名的歌曲 你应该考虑MISRA GRIES算法 它保留了k个元素的数组及其估计值,对您来

这是一个系统设计问题

假设我们有一个服务,可以在听到歌曲时通知我们。让我们设计一个新的服务,能够返回过去24小时内收听最多的K首歌曲。假设我们有约10亿首歌曲和约2亿用户

回答的重点是缓存、数据结构和数据库模式的设计

跟进:我们怎样才能按体裁来区分它?例如,如果我想要在过去24小时内听摇滚歌曲最多的前k名怎么办


真的很好奇你们会说什么/你们会怎么想!不必给出一个超级完美的解决方案,想法也很好

看来你想获得前k名的歌曲

你应该考虑MISRA GRIES算法


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

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


您可以简单地考虑使用maxheap的heap算法来检索最后k个元素,并通过构建复杂的约束来增强性能。

使用max heap如何?解决方案时间复杂度大约为k log(n),其中
n
是歌曲数。如何确保最大堆只存储过去24小时的数据?你需要做一些修剪来不断删除超过24小时的歌曲,对吗?这将如何工作?也许我们每24小时创建一个新的最大堆?问题是,如果有人在当天的歌曲堆创建完成后立即询问热门歌曲,他们就不会得到多少结果。因为堆已经完成,所以我们可能会在那个时候使用昨天的结果。那么您的结果总是1天前的,如果堆是为当天创建的,为什么我们不能返回它们呢?假设我们每天上午12点创建一个新的(空)堆。然后在接下来的24小时内,我们收集当天所需的数据。如果有人在凌晨1点,在新堆创建之后,请求播放最热门的歌曲,会发生什么?那你就只能得到最后一个小时的热门歌曲了。如果返回昨天的堆,则结果为off,不包括最后一个小时