前提・実現したいこと
数列の部分集合を探索するプログラムを作成しています.
bit演算による全探索の方法は理解できるのですが,
特定の条件を満たした部分集合(例えば,0が含まれている部分集合のみ)を探索する方法が思いつきません.
現状のコード
https://www.geeksforgeeks.org/java-program-to-print-all-unique-subsets-in-an-array-of-subsets-using-bit-manipulation/
を参考に,全探索プログラムを作成しました.
//Importing input output classes import java.io.*; //Importing utility classes import java.util.*; //Main class class GFG { // Method 1 static List<List<Integer> > subsets(int[] nums) { // Creating List class object // Declaring. object of integer List List<List<Integer> > output = new ArrayList<>(); int n = nums.length; // Increase the size by using left shift (1 * 2^n) int size = 1 << n; for (int i = 0; i < size; i++) { List<Integer> curr = new ArrayList<>(); for (int j = 0; j < n; j++) { // right shift i and j i.e. i/2^j if (((i >> j) & 1) == 1) { // Add it to subset curr.add(nums[j]); } } // Adding the subset output.add(curr); } return output; } // Method 2 // Main driver method public static void main(String[] args) { // Custom input array int Nodenum = 3; int[] arr = new int[Nodenum]; for (int i = 0; i < Nodenum; i++) { arr[i] = i; } // Calling method 1 in main() method List<List<Integer> > output = subsets(arr); // Print all unique subsets in an array System.out.println(output); } }
これを実行すると以下が出力されます
[[], [0], [1], [0, 1], [2], [0, 2], [1, 2], [0, 1, 2]]
どのように改良したいか
現在,都合上以下のことができるようコードを改良したいと考えております.
・0が含まれている部分集合のみを探索したい=0は固定したい
・0の固定に伴い,探索の計算量を減らしたい
=if文で0が含まれているかを逐一検証するのではなく,0が含まれている部分集合のみに限定して探索を行い,計算量を減らしたい.
つまり,上記のコードを改良し,以上の点を守ったうえで,以下のような出力をさせたいのです.
[[0], [0, 1], [0, 2], [0, 1, 2]]
しかし,どのようにコードを改良すべきか見当がつかず,検索しても中々ヒットしなかったので困っております.
もしよろしければ,
どのように改良すればよいかをご教示いただいてもよろしいでしょうか?
何卒よろしくお願いいたします.
補足情報(FW/ツールのバージョンなど)
開発言語:Java
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/05 06:01