以下のエディターは、ビット操作を通じてセットのすべてのサブセットを検索するための Java メソッドを提供します。編集者はこれがとても良いと思ったので、参考として共有します。エディターに従って見てみましょう。Java には、セットのすべてのサブセットを見つけるための組み込みメソッドがありません。セットのサブセット ルールを通じて見つけることができます。
セットのすべてのサブセットは、セットの長さの 2^ に等しくなります。たとえば、{c,b,a} の長さは 3 で、このセットには 8 つのサブセットがあります。
この文章は単純そうに見えますが、奥深い哲学が含まれています。実際、セットのすべてのセットは、数値 2^ セットの長さに関連付けられます。たとえば、上記の例では、{c, b, a} の長さが 3 の場合、0 ~ 7 を使用してそのすべてのサブセットを表すことができます。以下に示すように、数値に対応する位置を 1 に変更することは、サブセットを形成するためにこの数値が必要であることを意味します。 0 から 7 までのバイナリ表現は、長さが 3、サブセット数が 8 のすべてのサブセットを表します。
0(000): {}
1(001): {a}
2(010): {b}
3(011): {ab}
4(100): {c}
5(101): {a,c}
6(110): {b,c}
7(111): {a,b,c}
したがって、上記のルールに従って、コードは次のようになります。このように書くと、まずセットの長さを取得し、上記の 8 などのセットの長さ 2^ を見つけてから、0 から 8-1 までトラバースします。トラバースするときは、各データ 0、1、2... に対してビット演算を実行し、対応する桁数を 1 つずつ決定します。つまり、バイナリ表現でどの桁が 1 であるかを決定します。アセンブリを使用して、各ビットを最後に移動し、ビットを 1 で実装します。具体的なコードは次のとおりです。
import java.util.ArrayList; public class getSubSet { public static ArrayList<ArrayList<Integer>> getSubset(ArrayList<Integer> L) { if (L.size() > 0) { ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); for (int i = 0; i < Math.pow(2, L.size()); i++) {// 集合子集个数=2的该集合长度的乘方 ArrayList<Integer> subSet = new ArrayList<Integer>(); int index = i;// 索引从0一直到2的集合长度的乘方-1 for (int j = 0; j < L.size(); j++) { // 通过逐一位移,判断索引那一位是1,如果是,再添加此项 if ((index & 1) == 1) {// 位与运算,判断最后一位是否为1 subSet.add(L.get(j)); } index >>= 1;// 索引右移一位 } result.add(subSet); // 把子集存储起来 } return result; } else { return null; } } public static void main(String[] args) { ArrayList<Integer> L = new ArrayList<Integer>(); L.add(1); L.add(2); L.add(3); System.out.println(getSubset(L)); } }
実行結果は次のとおりです。
以上がビット演算を通じて集合のすべての部分集合を見つける Java の実装方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。