Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 我如何设计一个系统,在一个时间窗口中查找前K个趋势帖子_Algorithm_System Design - Fatal编程技术网

Algorithm 我如何设计一个系统,在一个时间窗口中查找前K个趋势帖子

Algorithm 我如何设计一个系统,在一个时间窗口中查找前K个趋势帖子,algorithm,system-design,Algorithm,System Design,我正在处理一个系统设计问题,我需要在5分钟、1小时和24小时的窗口中显示前K个趋势帖子 我了解通过使用哈希映射跟踪频率和堆按频率对K个项目进行排序来查找Top K元素的方法 但是,我不知道如何解释时间成分。我一直在读有关桶/计数器等的文章,但我无法想出解决方案 我希望在了解如何以分布式方式构建算法之前,先了解算法 多谢各位 您可以使用自平衡二叉搜索树而不是堆:对于堆允许的所有操作,它们具有相同的时间和空间复杂性,但也允许在O(logn)时间(而不是O(n)时间)内删除元素。大多数语言使用这些树实

我正在处理一个系统设计问题,我需要在5分钟、1小时和24小时的窗口中显示前K个趋势帖子

我了解通过使用哈希映射跟踪频率和堆按频率对K个项目进行排序来查找Top K元素的方法

但是,我不知道如何解释时间成分。我一直在读有关桶/计数器等的文章,但我无法想出解决方案

我希望在了解如何以分布式方式构建算法之前,先了解算法


多谢各位

您可以使用自平衡二叉搜索树而不是堆:对于堆允许的所有操作,它们具有相同的时间和空间复杂性,但也允许在O(logn)时间(而不是O(n)时间)内删除元素。大多数语言使用这些树实现某种“有序字典”容器抽象;在C++中,它被称为代码> map < /C> > < /P> 对于每个时间窗口,维护一个单独的树。让我们考虑5m窗口的具体性。

每当新元素到达时,将其添加到树中,并安排一个5分钟的计时器再次删除它;插入和删除的成本分别为O(logn),其中n是树增长到的最大大小,即5分钟窗口中发生的最大事件数。要查找前k个项目,只需开始按顺序遍历树,并在报告k个项目后停止。这需要O(k)时间,并允许k的不同选择。确保您或您的语言的底层容器实现允许并发修改容器

这种方法很简单,但为每个新元素安排一个计时器可能会产生大量开销。您也可以“延迟”执行删除:当新元素xNew在时间tNew到达时,像往常一样将xNew添加到树中,但不是安排计时器,还可以:

  • 将(xNew,tNew)添加到单独的FIFO队列
  • 从队列中提取元素(x,t),直到t>=tNew-5

  • 您很可能需要对数据进行缓存和分析。在我看来,像Cassandra这样的东西非常适合这样的问题,因为它可以索引时间戳字段,这是Cassandra中的一种原生数据类型。