N个最常见的事件,今天有计数

时间:2017-04-15 11:58:17

标签: algorithm analytics counter

我们不要假设我们为网站构建Google Analytics,并希望今天显示N个最受欢迎的网页。该算法应满足两个要求 - 恒定内存移动计数器

常量记忆

可能有数十亿页,我们不想保留所有页面的数量。算法应该使用某种使用常量内存的智能概率计数器。有Count–min sketch但似乎它试图估计所有元素的计数,这里我们不关心所有元素,只关于前N个,所以也许有一些更好更简单的估算器?

移动计数器

前N页每天都不同,今天前2页可能是/cats.html/dogs.html,但明天可能是 与/pizza.html/donuts.html完全不同的东西。最简单的方法是每天重新启动计数器,这很好,但也许有一些更聪明的方法,比如移动平均线?

事件流示例:

[
 { page: '/cats.html',   time: 'today, 12:00' }, 
 { page: '/cats.html',   time: 'today, 11:00' }, 
 { page: '/dogs.html',   time: 'today, 10:00' }, 
 { page: '/dogs.html',   time: 'today, 09:00' }, 
 { page: '/donuts.html', time: 'today, 08:00' }, 
 { page: '/donuts.html', time: 'yesterday, 20:00' }, 
 { page: '/cats.html',   time: 'yesterday, 19:00' }, 
 ...
]

1 个答案:

答案 0 :(得分:1)

如果我没记错的话,你可以通过常量内存获得最常用的值,但我不认为它适用于多个值。

如果近似答案足够好,您可能需要查看HyperLogLog算法。这不是完全相同的问题,因为它计算了唯一值的数量,但是那里使用的技术可能对解决您的问题很有用。

This question也是相关的,但它没有常量的内存约束。