2016-09-22 6 views
2

HashSet의HashSet 생성자의 기본 채우기 비율이 0.75 인 이유는 무엇입니까?

HashSet<Integer> hs = new HashSet<Integer>(10,(double)0.50);

생성자를 형성하면서 두 번째 인수는 "기입 비율이"0.75의 기본값했다.

기본값을 0.75로 설정하는 논리적 인 이유가 있는지 알고 싶었습니다.

+0

'hashset'의 doc을 읽습니다. – passion

+1

해시 테이블은 _hash 충돌을 겪고 _ 더 높은로드 계수 ("채우기 비율"보다 일반적인 용어)는 더 많은 충돌을 의미합니다. 이렇게하면 삽입 및 조회 성능이 떨어집니다. 선택한 모든 요소는 공간과 시간 사이에 약간의 트레이드 오프를 제공 할 것이며, 0.75는 경험적으로 선택된 값입니다. "별도의 연결"해시 테이블 디자인에 좋습니다. _open-addressed_ 디자인은 충돌에 훨씬 더 민감하며 낮은 부하 요소 (0.70이 최대 유용한 값 임)가 필요합니다. –

답변

1

HashSet 그래서 당신이 기본 값으로 0.75의 선택 뒤에있는 근거에 대한 HashMap's javadoc 참조 할 수 HashMap의 지원을받습니다 : 일반적으로

, 디폴트의 부하 계수 (0.75) 이벤트 시간과 공간 비용 간의 좋은 절충. 값이 높을수록 공간 오버 헤드가 줄어들지 만 조회 비용은 증가합니다 (HashMap 클래스의 대부분의 작업에 반영됨, getput 포함).

2

정말로 논리적 인 추론이 있습니다.

public HashSet(int initialCapacity, float loadFactor) { 
    map = new HashMap<>(initialCapacity, loadFactor); 
} 

을하고 우리가 중요한 선택 뒤에 논리적 추론을 볼 수있는 관련 HashMapdocumentation로 진행 : 우리는 HashMap의 지원과 인식되어 HashSet을 이해하면 게시물의 생성자는 HashMap 생성자를 호출합니다.

일반적으로 기본 부하 계수 (.75)는 시간과 공간 비용 사이에서 좋은 의 트레이드 오프를 제공합니다. 높은 값은 공간 오버 헤드를 줄이지 만 조회 및 비용을 증가시킵니다 (get 및 put을 포함하여 HashMap 클래스의 대부분의 작업에 반영됨). 지도의 항목 수와로드 요인은 초기 용량을 설정할 때 계정으로 가져와야하므로 리 하트 조작이 최소화됩니다. 초기 용량이 이상의 최대 항목 수를로드 요소로 나눈 값보다 큰 경우 다시 처리하지 않습니다. 작업이 발생합니다.