特定の時間枠で繰り返されるイベントの (おおよその) カウントを効率的に計算する方法が必要です。
例:ホストからファイルを繰り返しダウンロードしようとしています。通常は問題なく動作しますが、ネットワークが混雑しているとエラーが発生することがあります。これらの単一のエラーは気にしません。ただし、時々、ホストがオフラインになるため、すべての試行が失敗します。その場合、プログラムの再試行を自動的に停止したいと思います。
したがって、過去 x 分間に発生したエラーの数を調べる必要があります。数値が特定のしきい値を下回ると、何も起こりません。以上の場合は、アクションを起こしたい。カウントは 100% 正確である必要はありません。しきい値に達したかどうかを示すのに十分なだけ正確です。
単純だが効果的でない ( O(n)
) これを行う方法は、イベントのタイムスタンプを保存するだけで、新しいイベントごとに、それらを反復してタイムスタンプを比較することにより、以前のイベントの数を決定することです (時間枠が達した)。[余談]これはWHERE timestamp BETWEEN NOW() AND INTERVAL X MINUTES
、列にインデックスがない限り、SQLエンジンが に対して行うことだと思います。[/さておき]
O(1)
定数 ( ) の複雑さを持つソリューションが必要です。これまでのところ、イベントごとに 1 ずつ増加するイベントのカウンターを保持することを考えています。また、最新の発生のタイムスタンプも保存します。次に、新しいイベントが発生すると、数学の魔法によって、現在の時刻と保存されているタイムスタンプを使用してカウンターを減らし、過去 x 分間に発生したイベントの数を概算できます。
残念ながら、私の数学のスキルはその仕事に耐えられません。誰かがヒントを提供できますか?