オブジェクトとそれが有効な期間を記述する次のデータ構造があります。以下の数字は UNIX タイムスタンプであると仮定します。
{
"id": 1234,
"valid_from": 2000
"valid_to": 4000
},
{
"id": 1235,
"valid_from": 1000,
"valid_to": 2200,
}
...
これらのアイテムを JavaScript にすばやく保存し、特定の時点で有効なアイテムを照会できるようにしたいと考えています。
たとえば、2100 で有効なオブジェクトを照会すると、[1234, 1235] が返されます。3999 で有効なオブジェクトを照会すると、[1234] が返され、4999 では何も返されません。
構造内に約 50 ~ 100k のアイテムのサイズがあり、検索速度を速くしたいのですが、挿入と削除は遅くなる可能性があります。
アイテムには重複する valid_from と valid_to の値があるため、重複をサポートする必要があります。項目が重複します。
構造に継続的にデータを挿入する必要があります (おそらく、初期ロードでは一括で挿入し、データの変更に応じて 1 回ずつ更新します)。また、レコードを定期的に変更するので、おそらく削除と挿入を行います。
これに対する最良のアプローチが非常に効率的な方法であるかわかりませんか?
アルゴリズムは私の得意分野ではありませんが、正しいアプローチを知っていれば、アルゴリズム自体を研究できます。
私の考え:
私は当初、重複キーと最も近いルックアップをサポートするように修正されたバイナリ サーチ ツリーを考えていましたが、これでは > valid_from または < valid_to のオブジェクトしかクエリできません。
これには、配列またはツリーを 2 等分してすべての項目 > valid_from を見つけてから、それぞれの項目を手動で valid_to をチェックする必要があります。
2 つの検索ツリー (valid_to と valid_from の 1 つ) を持つことができると思います。次に、結果から重複する ID を確認し、それらの ID を返すことができますか?
これはまだハックのように思えますか?誰かが推奨できるより良いアプローチはありますか、それともこれがどのように行われたかです。