자바 는 비트 연산 을 통 해 집합 하 는 모든 부분 집합 방법 을 구한다.

자바 는 집합 하 는 모든 부분 집합 을 자체 적 으로 구 하 는 방법 이 없 으 며,우 리 는 집합 하 는 부분 집합 규칙 을 통 해 구 할 수 있다.
하나의 집합의 모든 부분 집합 은 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}
따라서 위의 규칙 에 따라 코드 는 이렇게 쓸 수 있 습 니 다.먼저 집합 길 이 를 취하 고 2^이 집합 길이 가 얼마 인지 구 할 수 있 습 니 다.예 를 들 어 위의 8,그리고 0 에서 8-1 까지 옮 겨 다 닐 수 있 습 니 다.옮 겨 다 닐 때 0,1,2..................................................................................어 셈 블 리 로 모든 위 치 를 맨 끝으로 옮 기 고 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));
	}

}

실행 결 과 는 다음 과 같 습 니 다.

이상 의 자바 는 비트 연산 을 통 해 하나의 집합 을 구 하 는 모든 부분 집합 방법 은 바로 소 편 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 에 게 참고 가 되 고 여러분 들 이 우 리 를 많이 지지 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기