識別子のセットが添付された4つの異なる値A、B、C、Dがあるとします。
A = {1,2,3,4,5}
B = {8,9,4}
C = {3,4,5}
D = {12,8}
そして、識別子のセットS {1,30,3,4,5,12,8}が与えられた場合、CとDを返すようにします。つまり、Sがスーパーセットであるセットのグループからすべてのセットを取得します。
このタスクを効率的に実行するためのアルゴリズムはありますか(できればメモリの複雑さが低い場合。データを保存するために外部デバイスを使用することはできません)?簡単な解決策は、スーパーセットSの各メンバーに対して、そのメンバーを含むセットのリスト(基本的に転置インデックス)を取得し、返されたセットごとに、すべてのメンバーがスーパーセットにあることを確認することです。残念ながら、スーパーセットには平均して各セットに少なくとも1つのメンバーが含まれるため、このアプローチではパフォーマンスが大幅に低下し、許容できない結果になります。
私はこれをJavaで行おうとしています。セットは整数で構成され、それらが識別する値はオブジェクトです。セットのコレクションは静的ではなく、実行中に変更される可能性があります。ただし、セット数には多少の制限があります。セットサイズに制限はありません。しかし、平均して1から20の間です。