いくつかの方法で解決できる興味深い問題があります。
- 文字列を受け取る関数があります。
- この関数がこの文字列を以前に見たことがない場合は、何らかの処理を実行する必要があります。
- 関数が以前に文字列を見たことがある場合は、処理をスキップする必要があります。
- 指定された時間が経過すると、関数は重複した文字列を受け入れる必要があります。
- この関数は 1 秒間に何千回も呼び出される可能性があり、文字列データは非常に大きくなる可能性があります。
これは、実際のアプリケーションの高度に抽象化された説明であり、質問の目的のために核となる概念に取り掛かろうとしています。
関数は、重複を検出するために状態を保存する必要があります。また、重複を期限切れにするために、関連付けられたタイムスタンプを保存する必要があります。
文字列を保存する必要はありません。文字列の一意のハッシュは、衝突による誤検出がなく (完全なハッシュを使用しますか?)、ハッシュ関数のパフォーマンスが十分であれば問題ありません。
単純な実装は次のようになります (C# の場合):
Dictionary<String,DateTime>
ただし、メモリ フットプリントを削減し、潜在的にパフォーマンスを向上させるために、基本的なハッシュ テーブルの代わりに、これを処理するカスタム データ構造を評価しています。
では、これらの制約が与えられた場合、何を使用しますか?
編集、提案された実装を変更する可能性のあるいくつかの追加情報:
- 文字列の 99% は重複しません。
- ほとんどすべての複製が連続して、またはほぼ順番に到着します。
- 実際には、関数は複数のワーカー スレッドから呼び出されるため、状態管理を同期する必要があります。