2014-12-26 2 views
0

HashSet 작업을 O (n)으로 만들려면 어떻게해야합니까?HashSet 작업을 O (n)으로 만들려면 어떻게해야합니까?

표준 수집 작업에는 Add, Remove, Contains가 있지만 해시 기반 구현을 사용하므로이 작업은 O (1)입니다.

그러나 연산 O (n)은 언제입니까?

감사합니다.

+2

왜 알고 싶습니까? 그리고 그들이 일반적으로하는 것보다 느리게 만드는 것에는 어떤 관심이 있습니까? – fge

+2

왜 O (1)에서 O (n)으로 성능을 악화시키고 싶습니까? – Bhaskar

+0

일반적으로 조작은 O (n)이면 악성 케이스가 모든 기존 요소를 순회하게됩니다. 따라서 가장 큰 숫자를 이미 오름차순 정렬 목록에 삽입하십시오. 그러나 이것을 해시 구조에 대해 숙고하는 것은 전체적인 점에 반하는 것이라고 생각하면 꽤 무의미합니다. 유일한 현실적인 대답은 불충분 한 크기의 테이블 또는 허접한 해시 함수를 갖는 것입니다. – ChiefTwoPencils

답변

7

O (n) 동작을 유발할 수있는 한 가지 병적 인 경우는 모든 요소가 동일한 해시 코드를 가질 때입니다.

+5

저를 때려 눕히세요! @Override public final int hashCode() {return 42;/* universal answer, random * /}' – fge

+0

4를 반환하는 @fge는 더 무작위입니다. http://xkcd.com/221/ – cel

1

해시 함수 (해시 생성 함수 자체)가 O (n) 복잡도의 해시 키를 생성하면 모든 연산이이 복잡성을 띄게됩니다.

+0

해시 키 생성 *은 'n'과 독립적이어야합니다. 그것은 열쇠가 얼마나 독특하고 검색에 영향을 주며 성능 *에 영향을줍니다. – TheLostMind

+0

@TheLostMind 해시 키를 생성하는 것은 상수 일 필요는 없습니다 (적어도 의도적으로 'O (n)'이 될 수 있음). – kraskevich

+0

질문 자체는 (내가 생각하기에) 일종의 "호기심 생각"입니다. 따라서 이런 종류의 복잡성에서 해시 함수를 수행 할 이유는 없습니다. – vlio20

2

NPE는 대부분 정확합니다.

그러나 키 유형이 Comparable 인 경우에는 Java 8에서 HashMapHashSet이 개선되어 긴 해시 체인을 2 진 트리로 대체해야합니다. 이 모든 요소가 Comparable를 구현하지 않습니다 같은 해시 코드 키 타입 이있을 때 O(N) 작업의 병적 인 경우에만 발생한다는 것을 의미

(JEP-180 참조). 키 유형이 Comparable 인 경우 또는 HashSet의 최악의 경우의 복잡도는 O(logN)입니다.

0

클래스를 재정의하지 않고이 작업을 수행하는 간단한 방법은 동일한 해시 코드로 많은 키를 만드는 것입니다. 예 :

Set<Long> longs = new HashSet<>(); 
for (int i = 0; i < 10000; i++) { 
    Long element = ((long) i << 32) + (i & 0xFFFFFFFFL); 
    assert element.hashCode() == 0; 
    longs.add(element); 
} 
관련 문제