我们不要假设我们为网站构建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' },
...
]
答案 0 :(得分:1)
如果我没记错的话,你可以通过常量内存获得最常用的值,但我不认为它适用于多个值。
如果近似答案足够好,您可能需要查看HyperLogLog算法。这不是完全相同的问题,因为它计算了唯一值的数量,但是那里使用的技术可能对解决您的问题很有用。
This question也是相关的,但它没有常量的内存约束。