Algorithm 我如何设计一个系统,在一个时间窗口中查找前K个趋势帖子
我正在处理一个系统设计问题,我需要在5分钟、1小时和24小时的窗口中显示前K个趋势帖子 我了解通过使用哈希映射跟踪频率和堆按频率对K个项目进行排序来查找Top K元素的方法 但是,我不知道如何解释时间成分。我一直在读有关桶/计数器等的文章,但我无法想出解决方案 我希望在了解如何以分布式方式构建算法之前,先了解算法Algorithm 我如何设计一个系统,在一个时间窗口中查找前K个趋势帖子,algorithm,system-design,Algorithm,System Design,我正在处理一个系统设计问题,我需要在5分钟、1小时和24小时的窗口中显示前K个趋势帖子 我了解通过使用哈希映射跟踪频率和堆按频率对K个项目进行排序来查找Top K元素的方法 但是,我不知道如何解释时间成分。我一直在读有关桶/计数器等的文章,但我无法想出解决方案 我希望在了解如何以分布式方式构建算法之前,先了解算法 多谢各位 您可以使用自平衡二叉搜索树而不是堆:对于堆允许的所有操作,它们具有相同的时间和空间复杂性,但也允许在O(logn)时间(而不是O(n)时间)内删除元素。大多数语言使用这些树实
多谢各位 您可以使用自平衡二叉搜索树而不是堆:对于堆允许的所有操作,它们具有相同的时间和空间复杂性,但也允许在O(logn)时间(而不是O(n)时间)内删除元素。大多数语言使用这些树实现某种“有序字典”容器抽象;在C++中,它被称为代码> map < /C> > < /P> 对于每个时间窗口,维护一个单独的树。让我们考虑5m窗口的具体性。 每当新元素到达时,将其添加到树中,并安排一个5分钟的计时器再次删除它;插入和删除的成本分别为O(logn),其中n是树增长到的最大大小,即5分钟窗口中发生的最大事件数。要查找前k个项目,只需开始按顺序遍历树,并在报告k个项目后停止。这需要O(k)时间,并允许k的不同选择。确保您或您的语言的底层容器实现允许并发修改容器 这种方法很简单,但为每个新元素安排一个计时器可能会产生大量开销。您也可以“延迟”执行删除:当新元素xNew在时间tNew到达时,像往常一样将xNew添加到树中,但不是安排计时器,还可以:
您很可能需要对数据进行缓存和分析。在我看来,像Cassandra这样的东西非常适合这样的问题,因为它可以索引时间戳字段,这是Cassandra中的一种原生数据类型。