비트 셋 을 왜 써 요?

1711 단어 Java
BitSet 은 한 유형의 boolean 판단 에 적용 되 며 자바 의 BitSet 는 이 유형의 판단 에서 매우 효율 적 입 니 다.
예 를 들 어 2000 만 숫자 중 소수 개 수 를 판단 하 는 프로그램 에서 가장 기본 적 인 소수 판단 코드 를 사용 하면:
package com;

public class Sus {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n = 20000000;
		long start = System.currentTimeMillis();
		int count = 0;
		boolean is = false;
		for(int i = 2;i <= n;i++){
			for(int j = 2; j <= Math.sqrt(i);j++){
				if( i % j == 0){
					is = true;
					break;
				}
			}
			if(!is){
				count++;
			}
			is = false;
		}
		long end = System.currentTimeMillis();
		System.out.println("count = "+count);
		System.out.println((end-start)+" milliseconds");

	}

}
의 실행 시간 은 다음 과 같다.
count = 1270607
35153 milliseconds
만약 에 BitSet 비트 맵 이 제공 하 는'스위치'사상 을 바탕 으로 하 는 소수 판단 코드 를 사용한다 면:
package com;

import java.util.BitSet;

public class Sieve {
	
	public static void main(String[] args){
		int n = 20000000;
		long start = System.currentTimeMillis();
		BitSet b = new BitSet(n+1);
		int count = 0;
		int i;
		for(i = 2; i <= n;i++){
			b.set(i);
		}
		i = 2;
		while(i*i <=n){
			if(b.get(i)){
				count++;
				int k = 2 * i;
				while(k <= n){
					b.clear(k);
					k +=i;
				}
			}
			i++;
		}
		while(i <= n){
			if(b.get(i)){
				count++;
			}
			i++;
		}
		long end = System.currentTimeMillis();
		System.out.println("count = " + count);
		System.out.println((end-start) +" milliseconds");
	}
}

실행 시간 은:
count = 1270607 248 milliseconds
같은 규모 의 데 이 터 는 둘 의 실행 효율 이 100 배 나 떨 어 지 는 것 을 볼 수 있 기 때문에 스위치 로 판단 할 수 있 는 프로그램 에 서 는 가능 한 한 BitSet 를 사용 해 야 한다.

좋은 웹페이지 즐겨찾기