ウェブサイトのアナリティクスを構築し、今日最も人気のあるページをN個表示したいとします。アルゴリズムは、定数メモリと移動カウンタの2つの要件を満たす必要があります。今日のカウントで最も頻繁に発生するイベント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' },
...
]