实时趋势算法
Real-time trending algorithm
我正在开发一个系统,该系统必须 return 实时显示最热门的 'articles' 号。该文章的点击率。
我的第一个想法是为每篇文章存储编号。点击率与时间的关系。然后我将这个函数归一化,并计算它的一阶导数,它将 return 增长率。然后用二阶导数我就能知道它增长了多少,如果它达到某个阈值 -> 将其标记为趋势。
问题是:例如,我可以在一天结束时这样做 "offline",但我不知道如何连续做...
我知道存在诸如 Storm 之类的东西,但我正在寻找像这样具体的东西(用伪代码编写的算法或解决这个问题而不是通用问题的文章)。
跟踪最热门文章的一种简单方法是使用 LRU 缓存。这有效地跟踪其最近访问的元素。频繁访问的文章会将热点文章保留在 LRU 中,而不经常访问的文章会被丢弃。如果您想优化排名,可以修改 LRU 以跟踪文章收到的点击次数。
当然,还有更复杂的方法,但这很容易实现,具有良好的计算特性,并且可能会提供类似的响应。
您也可以尝试为每篇文章使用 circular buffer。一旦缓冲区填满,对文章的每次访问都可以用于更新一个变量,该变量指示对文章的最旧点击。由于您知道最新和最旧的命中,因此您可以估计每个时间单位的命中。缺点:占用大量内存,经常访问的文章统计不准确。
同样,您可以将每篇文章与包含 <Time,Count>
对的链表相关联。每次命中发生时,如果自 Time
以来不到一秒(或你有什么),则添加到链表顶部的计数。如果时间过长,请在列表的前面添加一对新的。然后,您可以将链表视为用于计算导数的数据系列。遍历列表时减少太旧的元素。
我正在开发一个系统,该系统必须 return 实时显示最热门的 'articles' 号。该文章的点击率。
我的第一个想法是为每篇文章存储编号。点击率与时间的关系。然后我将这个函数归一化,并计算它的一阶导数,它将 return 增长率。然后用二阶导数我就能知道它增长了多少,如果它达到某个阈值 -> 将其标记为趋势。
问题是:例如,我可以在一天结束时这样做 "offline",但我不知道如何连续做...
我知道存在诸如 Storm 之类的东西,但我正在寻找像这样具体的东西(用伪代码编写的算法或解决这个问题而不是通用问题的文章)。
跟踪最热门文章的一种简单方法是使用 LRU 缓存。这有效地跟踪其最近访问的元素。频繁访问的文章会将热点文章保留在 LRU 中,而不经常访问的文章会被丢弃。如果您想优化排名,可以修改 LRU 以跟踪文章收到的点击次数。
当然,还有更复杂的方法,但这很容易实现,具有良好的计算特性,并且可能会提供类似的响应。
您也可以尝试为每篇文章使用 circular buffer。一旦缓冲区填满,对文章的每次访问都可以用于更新一个变量,该变量指示对文章的最旧点击。由于您知道最新和最旧的命中,因此您可以估计每个时间单位的命中。缺点:占用大量内存,经常访问的文章统计不准确。
同样,您可以将每篇文章与包含 <Time,Count>
对的链表相关联。每次命中发生时,如果自 Time
以来不到一秒(或你有什么),则添加到链表顶部的计数。如果时间过长,请在列表的前面添加一对新的。然后,您可以将链表视为用于计算导数的数据系列。遍历列表时减少太旧的元素。