私は例で説明しようとしています:
番号付き要素 E = [elem0, elem1, elem2, ...] のリストを想像してください。
1 つのインデックス セットは、E の要素を参照する {42, 66, 128} になる可能性があります。このセットの順序は重要ではないため、{42, 66, 128} == {66, 128, 42} ですが、各要素は任意のインデックス セットで最大 1 回 (つまり、実際のセットです)。
私が今欲しいのは、E の要素を参照するインデックス セットを含む別の順序付きリスト M を提供するスペース効率の良いデータ構造です。それ自体がインデックス可能であること (したがって、M はこの意味でリストであるため、正確なインデックスは重要ではありません)。必要に応じて、すべてのインデックス セットに同じ数の要素を含めるように強制できます。
たとえば、M は次のようになります。
0: {42, 66, 128}
1: {42, 66, 9999}
2: {1, 66, 9999}
次のことができるようになりました。
for(i in M[2]) { element = E[i]; /* do something with E[1],E[66],and E[9999] */ }
おそらく、これがどこに向かっているのかわかるでしょう: 別のマップ M2 があるかもしれません。これは、最終的に E の要素を指す M を指すセットの順序付きリストです。
この例でわかるように、インデックス セットは比較的似ている可能性があります (M[0] と M[1] は最初の 2 つのエントリを共有し、M[1] と M[2] は最後の 2 つのエントリを共有します)。セットの配列を使用する素朴な方法よりも効率的なものでなければなりません。ただし、適切な「共有」を保証するインデックス エントリの適切なグローバル順序付けを考え出すことはできないかもしれません。
M をツリーとして表現すること (M のインデックスは深さ優先の検索順序などに由来する) から、union-find 構造のハッシュ マップ (それがどのように機能するかはわかりませんが :)
このようなものの教科書のデータ構造へのポインターは大歓迎です (データベースの世界には何かありますか?) が、「自作」のソリューションまたはランダムなアイデアのみを提案していただければ幸いです。
E には数千または数百万の要素が含まれる可能性があり、(一部の) インデックス セットは潜在的に大きく、少なくとも一部のインデックス セット間の類似性は相当なものである必要があり、複数のマッピング レイヤーが存在する可能性があるため、スペース効率は私にとって重要です。
ありがとうございます!