正確なオンラインアルゴリズムを得るには、すべてのものを複数コピーする必要があります。赤黒の木のようなソートされたデータ構造のキーを値で追跡する必要があります。あなたはキーで追跡する必要があります。クイックキールックアップの値 - ハッシュが機能します。 1時間以上経過したものを取り除くことができるように、何らかのイベントループ/観測待ち行列が必要です。それと
、観察を追加するためのあなたのプロセスは、次のようになります。削除するには、現在あるすべての観測値を削除し
- 。 (1分でそれを行う方法の詳細はこちらをご覧ください)
- 削除するタイムスタンプとともに、to-deleteのキューに観測を追加します。
- キーで、キーによる値のハッシュの現在の合計値を見つけます。
- 値+ keyによって、平衡バイナリツリーのエントリを見つけて削除します。
- keyのvalueハッシュの現在の合計値を更新します。
- キーの値のハッシュに新しい値を挿入します。
トップ10を見つけるには、同様のパスを実行する必要があります。
- 現在削除しているすべての観測を削除します。 (1分でそれを行う方法の詳細はこちらをご覧ください)
- トップ10の観測については、平衡二分木を見てください。
とキューを削除するには、トップの要素が一時間以上古いですが、削除するために現在の観測値を削除するには:
- をキューを削除するからキー/値のペアをポップ。
- 合計値のハッシュ値をキーで検索します。
- 平衡バイナリツリーから値を削除します。
- 合計値のハッシュの合計値をキーで更新します。
- バランスのとれたバイナリキーに新しい値/キーを挿入します。
OK、費用と時間はどうですか?
私たちはすべての観察の3つのコピーを保持します。オーバーヘッドを伴う複雑なデータ構造のものつまり、過去1時間のイベントのためにおそらく5倍のスペースを使用しています。観測ごとに多くの操作がありますが、すべて対数です。実際、データ構造を最新に保ち、トップ10を返すために、観測ごとの合計労力はO(log(n))
のようになります。
オーバーヘッドが大きくなりすぎると、単純な解決策は近似することです。大量の近似アルゴリズムがありますが、最も簡単なことはデータ構造にランダムに含めることです。たとえば、100を超える値を持つものはその値の1%に含まれ、以下の値を持つものは含まれる可能性があります。次に、最終的な答えに100を掛けます。平均値が1〜10の範囲にある場合、O(1)
フィルタは、必要なデータストレージと作業の90-99%
を削除しました。しかし、おおよその答えが表示されます。
正確な回答が必要ですか、おおよその答えがありますか?また、オンラインアルゴリズム(常にトップ10を利用可能)が必要ですか、またはオフラインバッチ処理(マップ削減など)で十分ですか? – btilly
私は正確なものを好みますが、おおよその数字でもOKです。しかし、私はこれにインタビューの質問をし、オンラインアルゴリズムが必要です。実際にはヒープとハッシュマップを使用しましたが、スペースと時間の複雑さに満足していません。 –