個人的なプロジェクトで、特定のデータ構造で解決できると思う問題に遭遇しましたが、何が原因かわかりません。問題は次のとおりです。
Kタプルのセットが与えられた場合、位置iが与えられ、値pが与えられた場合、位置iに値pを含むタプルのリストを返す効率的なデータ構造を提供します。
リストを介してフィルターをマッピングすることにより、O(n)時間でこれを実行できることを知っています(指定されたタプルでpがiにある場合、フィルターはtrueを返します)。 <O(n)で実行できますか?
また、位置ごとに1つずつ、k個のマップを作成して、その位置の値をその位置の値を含むタプルのリストにマップできることも知っています。ただし、これは1)多くのスペースを占有し(k ^ k?)、2)タプルのセットを更新する場合(タプルの追加、タプルの削除、タプル内の値の更新)、k個のマップの多くが必要になる場合があります更新されます。
時間とストレージスペースのクエリに効率的なこれら2つのソリューションの間に妥協点はありますか?
リレーショナルデータベースインデックス からいくつかの有用なインスピレーションを見つけることができます。これは、列に特定の値を持つ行を見つけるという同様の問題を解決しようとします。
しかし、それは<O(n)で実行できるのだろうか?
trees、 自己平衡探索木 または(データが多い場合)-のいずれかを調べます。 Bツリー 。おそらくO(n)ストレージとO(log(n))での検索/変更)を実現できます。ただし、タプルを追加、削除、または変更するたびに、更新する必要があります。検索が正確になるように、その列に対応するツリー。
本当に凝ったものにしたい場合は、行数とインデックス付けされるデータの性質に応じて、システムでさまざまなインデックス作成戦略を使用できます。