2009-08-19 5 views
19

TreeSet의 장점과 단점이 무엇인지 궁금한 점이 있으시면 언제든지 알려주십시오. 감사!TreeSet의 장단점은 무엇입니까

+0

이러한 질문과 그에 대한 대답은 거기에 있어야합니다. 매우 도움이된다! 고맙습니다! – mtical

답변

23

Collection 클래스 중 하나입니다. 키를 사용하여 컬렉션의 요소에 액세스하거나 키순으로 순차적으로 액세스 할 수 있습니다. ArrayList 또는 HashMap보다 오버 헤드가 상당히 많습니다. 순차적 액세스가 필요하지 않을 때 HashSet을 사용하고 키로 조회하면됩니다. ArrayList를 사용하고 배열을 사용하십시오. 순서대로 요소를 원하면 정렬하십시오. TreeSet는 항상 요소를 순서대로 유지합니다. ArrayList를 사용하면 필요할 때 정렬 할 수 있습니다. TreeSets를 사용하면 컬렉션에 저장하는 객체에 키가 포함되어야합니다. 종종 TreeSet of Strings가있을 수 있습니다. 당신이 할 수있는 것은 주어진 String이 Set에 있는지를 알려주는 것입니다. 그것은 당신에게 그가 Treemap과 같은 방식으로 연관된 객체를 찾지 않을 것입니다. TreeMap을 사용하면 (자), 관련 지을 수 있었던 키와 오브젝트가 분리됩니다.

TreeSet과 그 형 TreeMap은 이상하게도 나무를 나타내는 것과 관련이 없습니다. 내부적으로는 트리 구조를 사용하여 알파벳 순으로 정렬 된 Set/Map을 제공하지만 부모와 자식 간의 연결을 제어 할 수는 없습니다.

내부적으로 TreeSet은 빨강 - 검정 나무를 사용합니다. 잘 균형 잡힌 트리를 얻기 위해 데이터를 미리 정렬 할 필요가 없습니다. 반면에 데이터가 정렬되면 (오름차순 또는 내림차순), 트리의 다른 유형과 마찬가지로 해를 끼치 지 않습니다.

원하는 순서를 정의하기 위해 Comparator를 제공하지 않으면 TreeSet은 자연 순서를 정의하기 위해 항목 클래스에서 Comparable 구현을 필요로합니다.

+4

입니다. 일반적인 사용 사례 : 텍스트를 가져 와서이 텍스트의 모든 단어를 TreeSet 에 놓고 이터레이터는 알파벳순으로 정렬 된 단어 색인 (중복되지 않음)을 제공합니다. –

+0

"순차적 액세스가 필요하지 않을 때 HashSet을 사용하고 키로 조회 만하면됩니다."- 키로 조회를하지 않아도됩니다. –

+0

특정 순차 액세스가 필요하지만 정렬이 필요하지 않은 경우 입력 데이터의 순서를 유지하는 LinkedHashSet을 사용할 수 있습니다. 또한 TreeSet은 logn의 순서를 제거합니다. PriorityQueue 제거 순서는 O (n) –

3

TreeSet :
장점 : 빨강/검정 트리 알고리즘을 기반으로 정렬되어 작업에 O (log (N)) 복잡도를 제공합니다.
단점 : 값은 이어야합니다.이거나 비교 자을 생성자에 제공해야합니다. 또한 HashSet 구현은 ~ O (1) 복잡성을 제공하므로 성능이 향상됩니다.

+0

감사합니다. – Rifk

+0

"red/black tree 알고리즘을 기반으로하는"metion을 "pro"로 이상하게 보입니다. 또한 TreeSet을 비교하는 명백한 일이 (당신이 말했듯이) 더 나은 시간 복잡성을 가진 HashSet 일 때 O (log (N)) 복잡성을 프로로 언급하는 것이 좀 이상합니다. –

+1

@Laurence : 1) 유일성 검사를 포함하면 목록에 삽입하면 O (log (N))가 해당 프로와 관련이 있습니다. 2) 괜찮은 해시 함수를 사용하고 해시 테이블이 커질 수 있도록 허용하는 경우 HashSet은 O (1)입니다. –

0

이 데이터 구조는 오름차순 검색이 가능하도록 데이터를 유지 관리하는 데 이진 트리를 사용한다고 생각합니다. 이 경우 트리를 균형있게 유지하려고하면 제거 작업이 약간 비용이 많이들 것입니다.

+1

-1 : HashSet은 빨강 - 검정 트리를 사용합니다. [이 페이지] (http://www.eli.sdsu.edu/courses/fall95/cs660/notes/RedBlackTree/RedBlack.html)에 따르면 삭제의 복잡성은 O (log (N)) –

9

단점 : TreeSet의 함정 중 하나는 예상치 못한 방식으로 Set 인터페이스를 구현한다는 것입니다. TreeSet가 객체 a를 보관 유지하고있는 경우, a.equals (b)가 false 인 경우에서도, a.compareTo (b)가 0을 돌려 주면, 객체 b는 세트의 일부라고 보여져 compareTo와 equals가 일관성있게 구현되어 있지 않은 경우 너는 나쁜 태도를 취하고있다.

이 메서드는 메서드가 Set를 반환하고 구현이 TreeSet 또는 예를 들어 HashSet인지 여부를 알 수없는 경우 특히 문제가됩니다.

여기서 배우는 교훈은 항상 compareTo와 equals를 일관되게 구현하지 않는 것입니다. equals와 일치하지 않는 방식으로 객체를 정렬해야하는 경우 Comparator를 사용하십시오.

+1

을 사용할 의무가 없습니다. "a.compareTo (b)가 0을 반환하면"라고 말하고 싶지 않을 수 있습니다. –

+1

와우. 4 년 된 포스트에 대한 건설적인 피드백. 고마워, 나는 그것을 고쳤다. – Buhb

2

TreeSet은 메모리를 조각 내고 추가 메모리 오버 헤드가 있습니다. 소스를보고 추가 메모리의 양과 생성 된 추가 오브젝트의 양을 계산할 수 있습니다. 물론 저장된 객체의 특성에 따라 달라지며 메모리에 대한 편집증이 될 수도 있습니다.하지만 여기저기서 낭비하지 않는 것이 좋습니다. GC가 있고 캐시 미스가 있으며이 모든 것들이 슬 루입니다.

자주 TreeSet 대신 PriorityQueue를 사용할 수 있습니다. 그리고 일반적인 사용법에서는 문자열 배열을 정렬하는 것이 좋습니다.

관련 문제